当屏幕关闭时,MediaPlayer会在Lollipop上过早地切断播放

时间:2015-01-05 23:43:42

标签: android android-mediaplayer android-audiomanager

我在Lollipop设备上遇到了MediaPlayer的问题。基本上当设备屏幕关闭时(即用户锁定设备),播放继续,但过早地结束约1-2秒。但是,当屏幕打开时,这不会发生。

我在MediaPlayer上有一个onCompletionListener:

@Override
public void onCompletion(final MediaPlayer mediaPlayer) {
    int progress = mediaPlayer.getCurrentPosition();
    int duration = mediaPlayer.getDuration();
    Log.d("PlaybackController", "progress: " + progress + " duration: " + duration);
    Log.d("PlaybackController", "Delay: " + (duration - progress)); // I'm seeing a difference of 1 - 3 seconds :(.
    mServiceHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            broadcastCompleted();
        }
    }, Math.max(duration - progress, 0));
}

这通常会打印:Delay: [1500 - 3000]。我想知道是否有一个唤醒锁我错过了,但是我在这里提到了正确的锁:http://developer.android.com/guide/topics/media/mediaplayer.html,它包括一个PARTIAL_WAKE_LOCK和一个WifiLock。还有其他我想念的东西吗?

2 个答案:

答案 0 :(得分:2)

好吧,看起来问题是Android 5.0.1的实验性MediaPlayer名为NuPlayer。默认情况下,所有Android 5.0.1设备上都启用了NuPlayer,并且只能通过开发人员选项禁用。我在这里提交了一个针对Android的错误:https://code.google.com/p/android/issues/detail?id=94069&thanks=94069&ts=1420659450

以下是您在Android 5.0.1设备上遇到媒体播放问题时可以向用户发送的示例电子邮件:

看起来这可能是Android新实验性MediaPlayer上的一个名为NuPlayer的错误。要解决此问题,请按以下步骤操作:

  1. 转到Android设置
  2. 转到“关于手机”
  3. 向下滚动到“Build Number”并点按Build号码7次。
    • 您会看到一条消息,说“您现在距离成为开发人员只有X步。”
    • 点击它7次后会说“你现在是开发人员!”
  4. 返回主设置屏幕,您会在“关于电话”上方看到一个名为“开发者选项”的新选项
  5. 进入开发者选项并取消选择“媒体”部分下的“使用NuPlayer(实验性)”。

答案 1 :(得分:0)

<强>更新: 在MediaPlayer上设置部分唤醒锁定可解决此问题:

playerToPrepare.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);

部分唤醒锁不应该有太大的影响,而且当播放完成时,MediaPlayer本身就会清除它。

- 原始答案---

我从这里Prevent my audio app using NuPlayer on Android Lollipop 5.x?交叉发布我的答案,直到找到NuPlayer,你可以做的最好的事情就是检测NuPlayer何时启用并将用户带到开发者设置。

此方法检查Android的系统属性值,以查看用户是否已在“开发者设置”下启用了AwesomePlayer。由于Lollipop默认启用NuPlayer,如果禁用此值,我们将知道将使用NuPlayer。

SystemProperties.java删除到您的项目中以便访问以读取系统属性,不要将其包名称从android.os更改(它调用其相应的JNI方法,因此需要保持不变)。

现在,您可以检查手机是否为Lollipop / 5.0,如果启用了AwesomePlayer,并且如果不是(例如通过打开开发者设置),则会相应地采取相应措施:

public void openDeveloperSettingsIfAwesomePlayerNotActivated(final Context context) {
    final boolean useAwesome = SystemProperties.getBoolean("persist.sys.media.use-awesome", false);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !useAwesome) {
        final Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
        context.startActivity(intent);                
    }
}