在 Android 的数据保护程序关闭时获取"BLOCKED"网络状态



我正在开发一款应用程序,用于运行Android 7.0的特定平板电脑。我正在使用Service发送周期性的DatagramPacket s。我只能使用移动网络。我使用ConnectivityManagerNetworkInfoDetailedState检查连接状态。我用这个代码得到网络状态:

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
DetailedState networkState = activeNetwork.getDetailedState();
  • 如果平板电脑已插入电源,并且屏幕处于打开或关闭状态,则我将进入CONNECTED状态
  • 如果表格被拔下并且屏幕打开,我会得到CONNECTED状态
  • 如果表格被拔出并且屏幕关闭,我将进入BLOCKED状态

在我的平板电脑中,数据保护程序已关闭。为了以防万一,我已经运行了测试,以验证在屏幕关闭时没有限制,cm.getRestrictBackgroundStatus()总是返回1,即RESTRICT_BACKGROUND_STATUS_DISABLED,即使网络被阻止。

那么,为什么网络被屏蔽了呢?我的应用程序需要特殊权限吗?我的平板电脑需要特殊配置吗?

为了给出一个完整的解决方案,我将回答我的问题。

为什么网络被阻止

正如Stanislav Kireev提供的文档所指出的,之所以会出现这种BLOCKED网络状态,是因为设备处于Doze状态。此设备状态不允许从Android 6.0(API 23级(开始访问互联网。

但该文件还说;该系统提供部分免除Doze和应用程序待机优化的应用程序的可配置白名单";。有关更详细的解释,您可以阅读其他用例的支持部分。您可以通过代码或配置系统将应用程序添加到白名单中。

我的应用程序需要特殊权限吗

如果您需要将应用程序从代码添加到白名单,则需要在清单文件中添加权限:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

并将此代码添加到您的活动中:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    String packageName = getPackageName();
    PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
    if (!pm.isIgnoringBatteryOptimizations(packageName)) {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        startActivity(intent);
    }
}

我从这个答案中得到了这个解决方案。

我的平板电脑需要特殊配置吗

如果您愿意,您可以从设置>添加应用程序;电池>3个点>电池优化。在选择列表中选择所有应用,选择您的应用并选择Don't optimize选项。

我从这个答案中得到了这个解决方案(它有更详细的解释(。

这是正常行为。当你的屏幕被锁定时,它会使用瞌睡模式。Doze模式关闭互联网通信和所有后台服务。你需要唤醒你的设备,然后你可以通过互联网进行所有操作。文件

相关内容

最新更新