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
权限。
我正在尝试使用 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
权限。