12

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

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):状態8で呼び出されたsetAudioStream

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()そのようなエラーなしでどのようにすべきですか?

4

2 に答える 2

13

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

編集:

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();
于 2012-04-10T23:46:25.763 に答える
3

受け入れられた答えは、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();
}
于 2016-03-16T16:29:09.237 に答える