当前位置: 首页 > 知识库问答 >
问题:

MediaPlayer正在播放STREAM_NOTIFICATION中断的

廉高邈
2023-03-14

在我的应用程序中,我使用下面的代码使用带有Stream_Notification的MediaPlayer播放一个简短的通知声音。问题是,当应用播放通知声音,同时音乐播放器应用在后台播放音乐时,通知声音会中断(暂停)音乐播放。如何才能让自己APP的通知声音与背景音乐播放同步播放?多谢了。

  AssetFileDescriptor afd =
      mResources.openRawResourceFd(resId);
  MediaPlayer mediaPlayer = new MediaPlayer();
  mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
  afd.close();
  mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
      @Override
      public void onCompletion(MediaPlayer mediaPlayer) {
        mediaPlayer.release();
      }
    });
  mediaPlayer.prepare();
  mediaPlayer.start();

共有1个答案

楚涵润
2023-03-14

问题中描述的行为似乎是针对Android5.x及以下版本的。对于Android6.x及以上版本,AudioManager的行为已经改变,AudioSystem.stream_notification标志不再中断音乐播放。

作为变通办法,我建议替换

mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

附注。不确定Android平台的具体变化,但根据https://Android.googlesource.com/platform/frameworks/base/+/android-5.1.1_r37/media/Java/Android/media/audioattributes.Java和https://Android.googlesource.com/platform/frameworks/base/+/android-6.0.0_r26/media/Java/Android/media/audioattributes.Java,他们将audiosystem.stream_notification作为audiosystem.stream_system

public Builder setInternalLegacyStreamType(int streamType) {
        switch(streamType) {
            /*...*/
            case AudioSystem.STREAM_SYSTEM:
                mContentType = CONTENT_TYPE_SONIFICATION;
                break;
            /*...*/
            case AudioSystem.STREAM_NOTIFICATION:
                mContentType = CONTENT_TYPE_SONIFICATION;
                break;
            /*...*/
            default:
                Log.e(TAG, "Invalid stream type " + streamType + " for AudioAttributes");
        }
        mUsage = usageForLegacyStreamType(streamType);
        return this;
    }
 类似资料:
  • RTSP视频可以在Android MediaPlayer中播放吗?如果是,怎么做?我得到的服务器死亡错误(100,0)这是我的编码部分包com的错误。实例样本媒体; 这是我的Logcat结果,我得到的结果是07-09 12:17:05.484:E/MediaPlayer(3990):error(1,-2147483648)07-09 12:17:05.484:W/System。err(3990):

  • 今天,我制作了一个在Android中播放音乐的应用程序。 使用MediaPlayer播放音频文件时失败;它无法播放任何文件音频。此异常引发日志cat,如: E/MediaPlayer:错误(1,-2147483648) 带系统。错误:java。io。IOException:准备失败:状态=0x1 W/System.err:android.media.MediaPlayer.prepare(本机方法

  • 我正在尝试设置一个具有声音的媒体播放器,可以根据需要多次播放和重播。但我在第一次播放音频时出现了以下错误: 我调用该剧的代码是: playSong()函数是: 我的声音位于res/raw/a.mp3中 当我按下BTN播放按钮时,我会显示BTN停止按钮,但没有播放任何内容。 我希望让用户玩、停、玩等等。我怎样才能做到这一点? LogCat:

  • 我有一些代码(在WPF应用程序中),当一些文本被复制到剪贴板时,它将使用SpeechSynthesizer读出文本(我所有的代码都在这篇文章的底部)。 然而,以这种方式播放音频不允许我暂停、倒带或播放等。 所以我想我应该使用SpeechSynthesis来保存一个wav文件。然后使用MediaPlayer类,因为它很容易暂停、播放等。 但是,保存文件后,该文件不会在我的媒体播放器中播放。这个文件很

  • 我想用MediaPlayer或SoundPool播放URL中的短声音,但当我尝试播放时,什么都没有发生。 我有此MP3链接格式:“http://www.universal-soundbank.com/802a/805020000000000000000000000pkjn800000000000000000000000000000090/g/85055050505050505050505/k/98

  • 我创建的Android应用程序包含2个按钮,点击每个按钮播放mp3文件。问题是,当我播放按钮1时,它播放声音1,当我单击按钮2时,它播放声音2。 我检查其他玩家的每个按钮是否正常工作,然后停止并播放单击的按钮 但是,如果我两次单击同一个按钮,则会将第一个音频保持在后台播放,然后再次播放另一个音频 我试图检查并停止它,但它不起作用! 我想,如果我点击按钮1,它将播放声音,如果再次点击它,它将停止播放