在Android Lollipop 5.x上使用NuPlayer阻止我的音频应用程序?

ver*_*esh 6 audio android audio-player

我有一个音频应用程序,可以同时播放多个曲目,每个曲目都有自己的曲目mediaPlayer.每条赛道都相当长,超过两分钟.

只要将曲目编码为ogg文件,一切都在Android 4.x上运行良好.我还没有遇到运行stock 4.x的设备,这个设置有任何音频问题.

但是在Lollipop 5.x上有各种各样的音频问题 - 口吃,音轨切断,蓝牙音频几乎从来没有用过.

我发现进入5.x中的Developer选项并取消选中"使用Nuplayer(实验)"可以立即解决这些问题,并恢复到4.x级别的性能.

有没有办法我可以编程强制我的应用程序使用4.x媒体堆栈(我相信它被称为Awesomeplayer?)而不是使用新的Nuplayer系统?至少在我能发现Nuplayer问题的根源之前?

Sve*_*ken 3

更新:在 MediaPlayer 上设置部分唤醒锁可以解决此问题:

playerToPrepare.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);

部分唤醒锁不应该产生太大的影响,而且似乎 MediaPlayer 本身会在播放完成时清理它。

——原答案——

所以,我终于找到了一种方法来安全地检测是否NuPlayer会在 Lollipop 上使用。看来目前最好的策略是通知用户打开开发者设置并启用,AwesomePlayer直到谷歌修复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);                
    }
}
Run Code Online (Sandbox Code Playgroud)