【问题标题】:MediaPlayer sound not always playing, not getting granted audio focusMediaPlayer 声音并不总是在播放,没有获得音频焦点
【发布时间】:2013-06-24 16:30:06
【问题描述】:

我在使用某些 Android 代码时遇到问题,无法在某些事件上播放声音通知。

代码如下:

int result = audioManager.requestAudioFocus(MainRunningService.afChangeListener,AudioManager.STREAM_NOTIFICATION,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);


if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
   mp = new MediaPlayer();
   mp.setDataSource(context, soundToPlay);
   mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
   mp.prepare();

   mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            public void onCompletion(MediaPlayer mediaPlayer) {
                            try {
                                Log.d(LOGTAG, "SoundService MUSIC: MUSIC IS NOW COMPLETE");
                                mp.release();
                                mp = null;
                                Log.d(LOGTAG, "SoundService MUSIC: MUSIC IS NOW COMPLETE - RELEASED");
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                       });
   mp.setLooping(false);
   mp.start();                         
}
else{
   Log.w(LOGTAG, "SoundService Audiofocus was not granted");
}

我发现有时它会播放,而有时它不会播放。当它不播放时,它会命中“未授予 SoundSerice Audiofocus”日志行。我查看了系统日志,但找不到任何说明为什么它没有被授予的信息。

一旦发生这种情况,那么每个请求似乎都会失败。

有没有人指出我可能做错了什么?

【问题讨论】:

  • 尝试不同的流类型来测试或向您的清单添加 MODIFY_AUDIO_SETTINGS 权限。似乎在这里有所帮助:stackoverflow.com/a/3539494/833647
  • 另一个应用程序可能只是没有放开焦点。但我注意到没有人要求放弃音频焦点。那可能是个问题。调用是放弃AudioFocus,把它放在你的完成监听器中。
  • 您是否正在寻找一些播放音频文件 (MediaPlayer) 编码的代码?
  • @gabe 放弃AudioFocus 在释放媒体播放器时被调用。这是我没有包含在应用程序的另一种方法中 - 它运行:audioManager.abandonAudioFocus(MainRunningService.afChangeListener);
  • @TharakaNirmana 一些示例代码可能很方便

标签: android android-mediaplayer


【解决方案1】:

//在按钮点击或任何你想要的地方调用playAssistClip()方法。

private MediaPlayer mp;
    private void playAssistClip() {
            if (workoutReps.equalsIgnoreCase("6x6x6")) {
                mp = MediaPlayer.create(ProcessWorkout.this,
                        R.raw.six_six_six_formated_ogg);
                mp.setOnCompletionListener(new OnCompletionListener() {

                    //do something after the audi ends
                        mp.reset();
                        mp.release();
                        finish();
                    }

                });
                mp.start();
               //to get the duration of clip
                spentTimeOnWorkout = mp.getDuration();

            }

【讨论】:

  • 我看到你没有提到请求音频焦点或释放它。不应该包括在内吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多