Android 无法测试需要在棉花糖上更改网络状态/写入设置权限的代码

Android 无法测试需要在棉花糖上更改网络状态/写入设置权限的代码,android,android-permissions,android-espresso,Android,Android Permissions,Android Espresso,我正在尝试将我的应用程序的targetSDK升级到23以上,但遇到了一个小问题。我有一个将流量绑定到Wifi的活动(测量路由器的网络速度,即使路由器未连接到internet)。为了实现这一点,我的应用程序需要更改网络状态权限。如果在清单中声明,通常会直接授予该权限。在Android 6.0上(确切地说,这是在6.0.1 IIRC中修复的)CHANGE\u NETWORK\u STATE已损坏,无法授予,因此您需要WRITE\u设置权限。我已经为Android 6.0用户实现了一种授予该权限的方法

我正在尝试将我的应用程序的targetSDK升级到23以上,但遇到了一个小问题。我有一个将流量绑定到Wifi的活动(测量路由器的网络速度,即使路由器未连接到internet)。为了实现这一点,我的应用程序需要
更改网络状态
权限。如果在清单中声明,通常会直接授予该权限。在Android 6.0上(确切地说,这是在6.0.1 IIRC中修复的)
CHANGE\u NETWORK\u STATE
已损坏,无法授予,因此您需要
WRITE\u设置
权限。我已经为Android 6.0用户实现了一种授予该权限的方法,但当我想用浓缩咖啡测试我的活动时,我无法这样做。通过添加以下内容向测试授予权限

@规则
public GrantPermissionRule runtimePermissionRule=GrantPermissionRule.grant(Manifest.permission.CHANGE\u NETWORK\u STATE)

到测试用例。这在应用程序的其他地方也有效,但为此我得到了
junit.framework.AssertionFailedError:未能授予权限,有关详细信息,请参阅我的测试结果中的logcat
。在logcat中,我发现
E/GrantPermissionCallable:Permission:android.Permission.WRITE\u设置无法授予
或与
更改网络\u状态
相同,我已尝试授予这两个选项,但它们都不起作用。在测试环境中是否有其他方式授予许可?或者,从现在起,我是否无法在6.0设备上测试此活动?

因为
写入设置
是敏感权限,您将无法使用API 23中的
GrantPermissionRule
授予它。您可能最终需要在测试中使用来在中选择适当的响应。

我通过使用UiAutomator和shell
appops
命令授予权限来解决这个问题:

Instrumentation=getInstrumentation();
UiDevice=UiDevice.getInstance(检测);
字符串targetPackageName=instrumentation.getTargetContext().getPackageName();
如果(Build.VERSION.SDK_INT>=23){
String shellCommand=String.format(“appops设置%s写入设置允许”,targetPackageName);
device.executeShellCommand(shellCommand);
}

对此信息信心不足,无法给出正式答案,但由于
写入设置
是敏感权限,您将无法使用
GrantPermissionRule
授予它。您可能最终需要在测试中使用来选择适当的响应。@pushasha是的,我想可能就是这样。我将开始通过编程方式点击权限管理屏幕,但在Android的某些版本中,这看起来有所不同。我会看看我能做些什么。@pushasha如果你能为这个问题找到答案,我会接受的
GrantPermissionRule
不支持签名权限。