如何确保备用Android应用程序的网络连接?

时间:2018-02-09 13:43:06

标签: android android-webview

我目前正在编写一个Android应用程序,它使用webview和webrtc来传输音频流。问题是,至少在我的手机上,屏幕关闭几分钟后连接就会被切断。

我已经获得了一个CPU锁和一个wifi锁(用isHeld验证),但它没有任何区别。

该应用程序也可以作为web application使用:这里似乎按预期工作,连接保持活跃。

我已经检查了wifi设置:它设置为始终开启。

任何指针/想法都非常感谢。该应用程序是开源的,所以我很乐意分享任何代码,如果这有任何帮助。锁定抓取完成:

private void grabWakeLock() {
  PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
  wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                               "MyWakelockTag");
  wakeLock.acquire();
  WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
  wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "gonimo-wifi-lock");
  wifiLock.acquire();
}

我的Manifest中有以下权限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature android:name="android.hardware.camera" />

非常感谢提前!

更新

Android Doze似乎就是这种行为的原因。手动触发Doze会导致相同的行为。还

    return pm.isIgnoringBatteryOptimizations(packageName);

返回false,因此应用程序的网络将关闭!问题:article中描述的白名单似乎不存在于我的手机上。我无法在设置和操作中找到它:

    Intent intentBattery = new  Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intentBattery.setData(Uri.parse("package:" + "org.gonimo.gonimo"));
    startActivity(intentBattery);

导致无法找到活动的异常。

1 个答案:

答案 0 :(得分:7)

这是“Android,请不要杀死我长时间运行的后台操作”食谱

  1. 将您的流传输代码移至service running in foreground
  2. Keep the CPU running(如果需要)
  3. 确保您的应用程序被排除在打盹模式之外(因为用户必须为您执行此操作,您必须在要求之前以漂亮的叠加层解释原因)
  4. 检查:

    PowerManager powerManager =
         (PowerManager)getActivity().getSystemService(Activity.POWER_SERVICE);
    
    powerManager.isIgnoringBatteryOptimizations(getActivity().getPackageName());
    

    要求白名单:

    Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    startActivity(intent);
    

    不要认为这是鼓励使用它作为一般方法,只有少数用例使这个程序合法化。