我在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。还有其他我想念的东西吗?
答案 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 :(得分: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);
}
}