Android 6.0中的ConnectivityManager.requestNetwork

我正在尝试使用ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)获取新的ConnectivityManager.bindProcessToNetwork(Network) ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)

原因是迫使应用程序在某些没有互联网连接(这是本地硬件通信networking)的特定networking中调用未来的请求。 此时,系统正在通过3G / 4Gnetworking发送请求,从未到达所需的Wifinetworking,因为此networking不响应android调用的连接检查 。

当我调用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); 

但是callback总是PackageManager.PERMISSION_DENIED

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

注意: Manifest.permission.WRITE_SETTINGS不在权限组中 。

Solutions Collecting From Web of "Android 6.0中的ConnectivityManager.requestNetwork"

我不确定Google是否打算这样做,但以下是我所看到的行为:

CHANGE_NETWORK_STATE似乎总是被拒绝(正如评论中指出的那样,它是一个签名许可),但是这似乎也不重要。 我的ConnectivityManagernetworking请求都似乎只有WRITE_SETTINGS – 所以如果你有WRITE_SETTINGS你不需要WRITE_SETTINGS

正如在评论中指出的那样,您使用以下方法与其他权限不同:

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

之后,我的ConnectivityManagernetworking请求很好用。


要在调用ACTION_MANAGE_WRITE_SETTINGS活动之前检查权限是否已被授予,则此答案具有使用Settings.System.canWrite(Context)

无法获得WRITE_SETTINGS权限


更新:从Android 6.0.1开始,CHANGE_NETWORK_STATE在清单文件中被请求时被自动授予。 上面的WRITE_SETTINGS检查只需要6.0

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