setPlaybackParams 防止播放开始于 API 23

setPlaybackParams Prevents Playback from Starting on API 23

出于某种原因,特别是在 Acer Iconia 平板电脑上,如果在启动媒体播放器之前调用 setPlaybackParams() 并且在准备好 MediaPlayer 之后,则不会发生任何事情:start() 'succeeds' 并且听不到任何音频。

在模拟器和我拥有的其他设备以及使用该应用程序的几千台设备中一切正常。

如果没有抛出异常并且没有生成任何错误,我如何在这个和其他不能很好地使用 setPlaybackParams() 的设备上检测到这个故障?我能想到的唯一解决方案是具有播放超时机制。还有其他的吗?

这就是我为自己的应用程序解决这个问题的方法:

我的应用程序有一个在 onPrepared() 时启动的播放进度广播器,它将媒体播放器进度广播给任何对其感兴趣的 UI 元素。我在其中添加了齿轮以检测 onPrepared() 调用 MediaPlayer->start() 但未显示任何播放进度(mediaPlayer 停止)的情况。

进度广播器每秒运行一次并包含以下代码:

int stall_cntr = 3;
// WORKAROUND FOR ACER ICONIA TABLETS
// Gear to detect if stall has occured.
if (last_position != position) {
    last_position = position;
} else {
    // last position is the same it previously was which shouldn't happen if
    // mediaplayer isPlaying
    if (stall_cntr == 0) {
        // set setPlaybackParam_unsupported configuration value.
        SharedPreferences settings = mService.getApplicationContext().getSharedPreferences(Settings.metapod_settings, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean("setplaybackparams_not_supported", true);
        editor.apply();
    } else {
        stall_cntr--;
    }
}

该代码将在 3 秒内检测到媒体播放器停顿(其中 onPrepared 调用 start() 但未实现进度)。如果检测到停顿,则需要 setPlaybackParam() API 的功能将被禁用,从而避免问题而不是修复它...