ConnectivityManager.requestNetwork 在 Android 6.0

ConnectivityManager.requestNetwork in Android 6.0

我正在尝试使用 ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)

获取新的 ConnectivityManager.bindProcessToNetwork(Network)

原因是强制应用程序在某些特定网络中调用未来请求,该网络没有互联网连接(它是本地硬件通信网络)。此时,系统正在通过 3G/4G 网络发送请求,永远不会到达所需的 Wifi 网络,因为该网络不响应 android 调用的 connectivity check

当我调用 requestNetwork 方法时,我收到以下错误:

java.lang.SecurityException: com.xyz.app was not granted  either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.

我尝试调用新方法来请求 Android 6.0 中可用的权限:

 requestPermissions(new String[]{Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.WRITE_SETTINGS}, PERMISSIONS_REQUEST_WIFI);

但回调总是PackageManager.PERMISSION_DENIED

我把这两个权限都放在了AndroidManifest.xml里,没有成功。

注意:Manifest.permission.WRITE_SETTINGS不在Permissions Groups中。

我不确定这是否是 Google 有意为之,但以下是我看到的行为:

CHANGE_NETWORK_STATE 似乎总是被拒绝(如评论中所述,它是签名许可)但它似乎也无关紧要。我的 ConnectivityManager 网络请求似乎全部由 WRITE_SETTINGS 控制 - 所以如果你有 WRITE_SETTINGS 你就不需要 CHANGE_NETWORK_STATE.

如评论中所述,您执行此操作与其他权限不同,使用:

 Intent goToSettings = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
 goToSettings.setData(Uri.parse("package:" + Context.getPackageName()));
 startActivity(goToSettings);

在那之后,我的 ConnectivityManager 网络请求非常好。


在调用ACTION_MANAGE_WRITE_SETTINGS activity之前检查权限是否已经被授予,这个答案有使用的解决方案 Settings.System.canWrite(Context)


更新:从 Android 6.0.1 开始,CHANGE_NETWORK_STATE 在清单文件中请求时自动授予。以上 WRITE_SETTINGS 检查仅 6.0

需要

这是一个 Android 6.0 错误。它在 Android 6.0.1 中已修复,如果您在清单中请求 CHANGE_NETWORK_STATE,则可以调用 requestNetwork()。无需调用requestPermissions(),这是normal权限。