2013-09-23 71 views
3

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

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

看看“请求音频焦点“和”鸭子!“官方Android Dev文档部分:http://developer.android.com/intl/es/training/managing-audio/audio-focus.html –

回答

0

在问题中描述的行为似乎是特定于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.javahttps://android.googlesource.com/platform/frameworks/base/+/android-6.0.0_r26/media/java/android/media/AudioAttributes.java他们对待AudioSystem.STREAM_NOTIFICATION作为AudioSystem.STREAM_SYSTEM两者的Android 5.x的& 6.x中:

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; 
    }