【问题标题】:MediaPlayer playing STREAM_NOTIFICATION interrupted music playbackMediaPlayer 播放 STREAM_NOTIFICATION 中断音乐播放
【发布时间】:2013-09-23 19:16:37
【问题描述】:

在我的应用程序中,我使用以下代码通过带有 STREAM_NOTIFICATION 的 MediaPlayer 播放简短的通知声音。问题是,当应用程序播放通知声音并且音乐播放器应用程序在后台播放音乐时,通知声音会中断(暂停)音乐播放。如何使我的应用程序的通知声音与背景音乐播放同时播放?谢谢。

  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();

【问题讨论】:

标签: android


【解决方案1】:

问题中描述的行为似乎特定于 Android 5.x 及更低版本。对于 Android 6.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 视为 Android 5.x 和 6.x 的 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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多