代码之家  ›  专栏  ›  技术社区  ›  Emil S.

无法在棉花糖上测试需要CHANGE\u NETWORK\u STATE/WRITE\u SETTINGS权限的代码

  •  3
  • Emil S.  · 技术社区  · 6 年前

    我正在尝试将我的应用程序targetSDK升级到23以上,但遇到了一个小问题。我有一个将流量绑定到Wifi的活动(测量路由器的网络速度,即使路由器未连接到internet)。为了实现这一点,我的应用程序需要 CHANGE_NETWORK_STATE 准许如果在清单中声明,通常会直接授予该权限。在Android 6.0上(确切地说,这是在6.0.1 IIRC中修复的) 更改\u NETWORK\u状态 已损坏,无法授予,因此您需要 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中我找到 E/GrantPermissionCallable: Permission: android.permission.WRITE_SETTINGS cannot be granted! 或与相同 更改\u NETWORK\u状态 ,我试着两者都同意,但都不起作用。在测试环境中是否有其他方式授予许可?或者,从现在起,我是否无法在6.0设备上测试此活动?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Sam    4 年前

    通过使用UiAutomator和shell授予权限,我成功地绕过了这个问题 appops 命令:

    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);
    }
    
        2
  •  0
  •   pushasha    5 年前

    因为 WRITE_SETTINGS 是敏感权限,您将无法使用 GrantPermissionRule API 23中。您可能最终需要使用 UIAutomator 在测试中,在 permissions management screen