当屏幕关闭时,Lollipop上的MediaPlayer播放时间过早截断

4

我在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。我还漏掉了其他什么吗?

嗯,看起来我在屏幕开着的时候也复现了这个问题。所以看起来它与屏幕开/关无关。 - shoke
我只在搭载Android 5.0.1的Nexus 5设备上重现了这个问题。 - shoke
看起来这是与在Android 5.0.1中启用的新实验性Android NuPlayer有关的问题。我仍在调查,以确定这是否是实际原因。如果需要,将很快更新答案并针对Android提交错误报告。 - shoke
请看一下我的更新答案,我们已经找到了解决方法。 - Sveinung Kval Bakken
2个回答

2

看起来问题出在Android 5.0.1的实验性MediaPlayer NuPlayer上。NuPlayer默认启用所有Android 5.0.1设备,并且只能通过开发人员选项禁用。我在这里向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 number 7次。
    • 您将看到一条消息,显示“您现在距离成为开发人员还有X个步骤”。
    • 点击7次后,它将显示“您现在是开发人员!”
  4. 返回主设置屏幕,您将看到一个名为“开发人员选项”的新选项,位于“关于手机”上方
  5. 进入开发人员选项,在“媒体”部分下取消选择“使用NuPlayer(实验性)”。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接