我正在构建一个音频流应用程序,用户应该能够在设备锁定时收听他们的歌曲(就像任何其他音乐应用程序一样)。
一些用户报告了在 WIFI 上播放 10 到 15 分钟后停止播放的问题。在所有情况下,设备都已手动锁定或进入睡眠模式。我能够在运行 Android 8.1 的 Pixel 2 和运行 8.0 的模拟器上重现此问题。一些使用运行 8.1 的诺基亚和运行 7.0 的 LG 的用户也遇到了同样的问题。使用移动网络 (4g) 收听时不会发生此问题。
重现此问题的步骤如下。- 开始播放歌曲;- 将应用程序置于后台;- 锁定设备并等待播放停止;
调试应用程序我可以看到我收到"java.net.SocketTimeoutException: failed to connect to [address]/[IP] (port 80) from /[local IP] (port 38149)"。我假设在设备进入睡眠模式后由于某种原因 wifi 被断开(但仍然启用),并且在播放每个曲目之前我无法执行我需要的 HTTP 请求。HTTP 请求由 MediaPlayer 完成侦听器触发并在不同的线程上运行。我没有使用 JobScheduler 或 AlarmManager。
一切都在前台服务上运行,该服务向用户显示持久通知(媒体控件)。
创建服务时,我还设置了 Wifi Lock 和 Wake Lock。还要在播放每首曲目之前检查是否已锁定锁定以确保。
WifiManager wifiManager = ((WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE));
if (wifiManager != null) {
wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "myapp.com.wifilock");
wifiLock.acquire();
}
PowerManager powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
if (powerManager != null) {
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myapp.com.wake_lock");
wakeLock.acquire();
}
我也尝试设置 MediaPlayer 唤醒模式,但没有任何改变。
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK)
我能够通过使用 ADB 在模拟器上重现这一点。
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
还使用“dumpsys”检查 WIFI 状态
$ adb shell dumpsys wifi
Wi-Fi is enabled
Stay-awake conditions: 1
mInIdleMode true
mScanPending false
WifiController:
total records=11
rec[0]: time=04-13 14:00:54.690 processed=ApStaDisabledState org=ApStaDisabledState dest=<null> what=155656(0x26008)
rec[1]: time=04-13 14:00:55.198 processed=ApStaDisabledState org=ApStaDisabledState dest=<null> what=155659(0x2600b)
rec[2]: time=04-13 14:00:55.198 processed=ApStaDisabledState org=ApStaDisabledState dest=DeviceActiveState what=155656(0x26008)
rec[3]: time=04-13 14:00:57.520 processed=DefaultState org=DeviceActiveState dest=<null> what=155652(0x26004)
rec[4]: time=04-13 14:00:57.558 processed=DefaultState org=DeviceActiveState dest=<null> what=155652(0x26004)
rec[5]: time=04-13 14:00:51.045 processed=DeviceActiveState org=DeviceActiveState dest=<null> what=155660(0x2600c)
rec[6]: time=04-13 14:01:02.743 processed=DeviceActiveState org=DeviceActiveState dest=<null> what=155660(0x2600c)
rec[7]: time=04-13 14:01:44.845 processed=DefaultState org=DeviceActiveState dest=<null> what=155654(0x26006)
rec[8]: time=04-13 14:03:03.801 processed=DefaultState org=DeviceActiveState dest=<null> what=155652(0x26004)
rec[9]: time=04-13 14:03:16.009 processed=DefaultState org=DeviceActiveState dest=<null> what=155650(0x26002)
rec[10]: time=04-13 14:03:16.029 processed=DefaultState org=DeviceActiveState dest=<null> what=155651(0x26003)
curState=DeviceActiveState
mScreenOff true
mDeviceIdle false
mPluggedType 0
mIdleMillis 900000
mSleepPolicy 2
mPersistWifiState 1
mAirplaneModeOn false
mNotificationEnabled true
mNotificationRepeatTime 0
mNotificationShown false
mNumScansSinceNetworkStateChange 0
mEnableTrafficStatsPoll false
mTrafficStatsPollToken 10
mTxPkts 5031
mRxPkts 10191
mDataActivity 0
Locks held:
Locks acquired: 0 full, 1 full high perf, 0 scan
Locks released: 0 full, 0 full high perf, 0 scan
Locks held:
WifiLock{myapp.com.wifilock type=3 uid=10100}
mMulticastEnabled 1
mMulticastDisabled 1
Multicast Locks held:
如我们所见,Wifi Lock 仍然处于活动状态。我还确认唤醒锁也处于活动状态。如果我没记错的话,即使设备进入睡眠模式,“mSleepPolicy 2”也应该让 Wifi 保持活跃。
我不想在电池优化面板上将该应用程序列入白名单。我可以看到其他流媒体应用程序,如 Spotify,已经过优化,并且在设备锁定时流媒体没有问题。
我错过了什么吗?