2012-04-10 4 views
9

アラーム音を再生するためにサービスを使用するAndroidアラームアプリケーションを作成しています。現在、オーディオを再生することはできますが、デバイスの音量を下げることでミュートできる形式で再生されます。したがって、これを防ぐためにsetAudioStreamType(AudioManager.STREAM_ALARM);への呼び出しを追加しようとしています。(Android MediaPlayer)MediaPlayer.create()が暗黙的にprepare()を呼び出すと、setAudioStreamType()をどのように呼び出すのですか?

私はサービスのための私のonStartCommand()機能については、以下があります。

MediaPlayer mMP;  
@Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     try 
     { 
      mMP = MediaPlayer.create(this, R.raw.alarm); 
      mMP.setAudioStreamType(AudioManager.STREAM_ALARM); 
      mMP.setLooping(true); 
      //mMP.prepare(); commented out since prepare() is called in create 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     if (mMP != null) mMP.start(); 

     return START_STICKY; 
    } 

私の問題はsetAudioStreamType()の呼び出しで、MediaPlayerのは決してオーディオを再生しないということです。私がそのラインをコメントアウトすると、オーディオが再生されます。

04-10 19:32:03.115:E/MediaPlayerの(3411):状態で呼び出さsetAudioStream 8

、私は、次のランタイムエラー(複数可)を得るの線で

04-10 19:32:03.115:E/MediaPlayerの(3411):エラー(-38、0)

04-10 19:32:03.115:E/MediaPlayerの(3411):状態で呼び出さスタート0

04-10 19:32:03.115:E/MediaPlayer(3411):エラー(-38、0)

04-10 19:32:03.115:E/MediaPlayerの(3411):エラー(-38,0)

04-10 19:32:03.115:E/MediaPlayerの(3411):エラー( - 38,0)

いくつかの研究では、(私は今のリンクを見つけることができません)setAudioStreamType()prepare()が呼び出された後に呼び出され、create()が暗黙的prepare()を呼び出すことできないことを私に言いました。

どのような点においても、どうすればsetAudioStreamType()にこのようなエラーはありませんか?

答えて

12

mp.reset()を呼び出してから、ストリームの種類、データソースを設定してから準備することができます。または、デフォルトコンストラクタを使用して、自分で初期化を処理してください。

EDIT:

Resources res = getResources(); 
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.alarm); 

mp.reset(); 
mp.setAudioStreamType(AudioManager.STREAM_ALARM); 
mp.setLooping(true); 
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
mp.prepare(); 
mp.start(); 
+0

を働いている( ')(作成'への呼び出し後に開始):; '' setAudioStreamType(); '' setLooping(); ')(リセット' 'prepare();' 私は正しいですか? 「04-10 20:06:25.515:E/MediaPlayer(845):状態1で呼び出しが開始されました」 '04-10 20:06:25.515:E/MediaPlayer(845):状態1で呼び出しが開始されました。 MediaPlayer(845):エラー(-38,0) ' – finiteloop

+0

実際には' prepare() 'ではなく' start() 'の呼び出しでエラーが発生しているようです。更新されたコードを質問に追加できますか? – kcoppock

+0

あなたは正しいです、その特定のエラーは、開始の呼び出しの後に発生しました、また、私がコメントを投稿していたときに私がログに欠けている準備をするための呼び出しにエラーがあります。 '04-10 21:42:11.896:E/MediaPlayer(593):状態1で呼び出されたprepareAsync。 – finiteloop

2

受け入れ答えはIllegalStateExceptionがを投げていました。これは、あなたがこれらの線に沿って何かを示唆しているようですね

MediaPlayer mediaPlayer = new MediaPlayer(); 

try { 
    mediaPlayer.setDataSource(
      this, 
      getCustomToneUri() 
); 

    mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); 

    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mp.start(); 
    } 
    }); 

    mediaPlayer.prepareAsync(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
関連する問題