Android 6.0中的ConnectivityManager.requestNetwork

时间:2015-08-24 15:05:19

标签: android android-6.0-marshmallow

我尝试使用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中。

2 个答案:

答案 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权限。