无法测试需要棉花糖CHANGE_NETWORK_STATE/WRITE_SETTINGS权限的代码



我正在尝试将应用程序的目标SDK升级到23以上,但遇到了一个小问题。我有一个将流量绑定到 Wifi 的活动(测量路由器的网络速度,即使路由器没有连接到互联网(。为了实现这一点,我的应用程序需要CHANGE_NETWORK_STATE权限。如果在清单中声明,则通常直接授予该权限。在 Android 6.0 上(确切地说,这已在 6.0.1 IIRC 中修复(,CHANGE_NETWORK_STATE已损坏,不会被授予,因此您需要WRITE_SETTINGS权限。我已经为 Android 6.0 用户提供了一种授予该权限的方法,但当我想使用浓缩咖啡测试我的活动时,我无法这样做。通过添加类似内容来授予测试权限

@Rule public GrantPermissionRule runtimePermissionRule = GrantPermissionRule.grant(Manifest.permission.CHANGE_NETWORK_STATE);

到测试用例。这在应用程序的其他地方有效,但为此我得到了junit.framework.AssertionFailedError: Failed to grant permissions, see logcat for details在我的测试结果中。在logcat中,我发现CHANGE_NETWORK_STATEE/GrantPermissionCallable: Permission: android.permission.WRITE_SETTINGS cannot be granted!或相同,我尝试授予两者,但它们都不起作用。还有其他方法可以在测试环境中授予权限吗?还是从现在开始我无法在 6.0 设备上测试此活动?

我通过使用UiAutomator和shellappops命令授予权限来解决此问题:

Instrumentation instrumentation = getInstrumentation();
UiDevice device = UiDevice.getInstance(instrumentation);
String targetPackageName = instrumentation.getTargetContext().getPackageName();
if (Build.VERSION.SDK_INT >= 23) {
String shellCommand = String.format("appops set %s WRITE_SETTINGS allow", targetPackageName);
device.executeShellCommand(shellCommand);
}

由于WRITE_SETTINGS是敏感权限,因此无法使用 API 23 中的GrantPermissionRule授予它。您最终可能需要在测试中使用 UIAutomator 在权限管理屏幕中选择适当的响应。

最新更新