我尝试使用ConnectivityManager.bindProcessToNetwork(Network)
ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)
原因是强制应用程序在某个特定网络中调用未来请求,该网络没有互联网连接(它是本地硬件通信网络)。此时,系统正在通过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中。
答案 0 :(得分:9)
我不确定这是否是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
活动之前检查是否已授予权限,此答案将使用解决方案
Settings.System.canWrite(Context)
Can't get WRITE_SETTINGS permission
更新:从Android 6.0.1开始,在您的清单文件中请求时会自动授予CHANGE_NETWORK_STATE
。上述WRITE_SETTINGS
检查只需要6.0
答案 1 :(得分:6)
这是一个Android 6.0错误。它已在Android 6.0.1中修复,如果您在清单中请求requestNetwork()
,则可以调用CHANGE_NETWORK_STATE
。无需致电requestPermissions()
,而是normal
权限。