7

通知音を鳴らしたいのですが、一度だけ鳴らなければならないのに、音が永遠にループするという問題があります。

私は2つの方法を試しました:

notification.sound = Uri.parse("content://media/internal/audio/media/38");

mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
mMediaPlayer.setDataSource(this, Uri.parse("content://media/internal/audio/media/38"));
mMediaPlayer.setLooping(false);
mMediaPlayer.prepare();
mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        Log.v(Utils.TAG, "onprepared");
        mp.start();
    }
});

mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        Log.v(Utils.TAG, "end, we should release");
        mp.stop();
        mp.release();
    }
});

2 番目のケースでは、「終了、解放する必要があります」というトレースが表示されず、オーディオが何度も何度も再生されます。

何か案が?

どうもありがとうございました

アップデート:

私は2つのデバイスを試しました:

  • ICS 4.0.4を搭載したGalaxy Nexusで永遠にループします
  • HTC Hero 2.2.1で正常に動作します
4

3 に答える 3

7

永久に再生される「組み込み」ループを備えたサウンドがあります。これは、MediaPlayer をループに設定することとは異なります。ループを内蔵したサウンドを再生し始めると、決して終了しません。これらは主に着信音です (アラーム音や通知音ではありません)。ほとんどのループ音を除外する通知音またはアラーム音のみを返すように RingtoneManager を設定できますがmyringtonemanager.setType(RingtoneManager.TYPE_ALARM|RingtoneManager.TYPE_NOTIFICATION) 、残念ながら、これはどのデバイスでもそれらすべてを除外することを保証するものではありません。:-(

したがって、Tiago Almeida の解決策は良い回避策です (私は賛成票を投じました) が、ループが数回しかない (そして無限ループがない) すべてのサウンドを切り捨てます。

于 2012-11-27T11:36:45.663 に答える
5

これを試して:

try {
    mp.setDataSource(uri.toString());
    mp.setAudioStreamType(AudioManager.STREAM_ALARM);
    mp.prepare();
    mp.start();
    mp.setOnSeekCompleteListener(new OnSeekCompleteListener() {
        public void onSeekComplete(MediaPlayer mp) {
            mp.stop();
            mp.release();
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}
于 2012-10-01T08:48:16.817 に答える
0

この問題のもう 1 つの回避策

boolean soundPlayedOnce = true;

if(soundPlayedOnce){
   mp.start();
   soundPlayedOnce = false;
}

サウンドを再生する直前に、このブール値を true に設定します

于 2020-03-30T11:25:07.803 に答える