Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Espresso java.lang.SecurityException:权限Android.Permission.SYSTEM_ALERT_窗口不是可更改的权限类型_Android_Android Permissions_Android Espresso_Android Securityexception_System Alert Window - Fatal编程技术网

Android Espresso java.lang.SecurityException:权限Android.Permission.SYSTEM_ALERT_窗口不是可更改的权限类型

Android Espresso java.lang.SecurityException:权限Android.Permission.SYSTEM_ALERT_窗口不是可更改的权限类型,android,android-permissions,android-espresso,android-securityexception,system-alert-window,Android,Android Permissions,Android Espresso,Android Securityexception,System Alert Window,我有一个浓缩咖啡脚本,需要SYSTEM\u ALERT\u窗口权限。我使用以下代码授予所有测试脚本的权限: @Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)

我有一个浓缩咖啡脚本,需要
SYSTEM\u ALERT\u窗口
权限。我使用以下代码授予所有测试脚本的权限:

@Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.CAMERA,
        Manifest.permission.WRITE_EXTERNAL_STORAGE);
我为测试用例提供了一个特殊的AndroidManifest,其中包括权限

这在不同品牌的大多数设备上都能很好地工作,Android版本从Android 5.X到Android 8.X不等(大约15个以上的设备)。但是,在我的带有Android 6.0的华为P8 Lite上,我遇到以下错误:

junit.framework.AssertionFailedError: Failed to grant permissions, see logcat for details
    at junit.framework.Assert.fail(Assert.java:50)
    at android.support.test.runner.permission.PermissionRequester.requestPermissions(PermissionRequester.java:110)
    at android.support.test.rule.GrantPermissionRule$RequestPermissionStatement.evaluate(GrantPermissionRule.java:128)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:27)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:384)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1890)
当我检查logcat时,会显示以下附加错误:

I/GrantPermissionCallable: Permission: android.permission.WRITE_EXTERNAL_STORAGE is already granted!
I/GrantPermissionCallable: Permission: android.permission.CAMERA is already granted!
I/UiAutomationShellCmd: Requesting permission: pm grant [PACKAGE_NAME_MY_APP] android.permission.SYSTEM_ALERT_WINDOW

E/GrantPermissionCallable: Permission: android.permission.SYSTEM_ALERT_WINDOW cannot be granted!

java.lang.SecurityException: Permission android.permission.SYSTEM_ALERT_WINDOW is not a changeable permission type
    at com.android.server.pm.PackageManagerService.enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(PackageManagerService.java:3665)
    at com.android.server.pm.PackageManagerService.grantRuntimePermission(PackageManagerService.java:3698)
    at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:398)
    at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:2807)
    at com.android.server.pm.HwPackageManagerService.onTransact(HwPackageManagerService.java:506)
    at android.os.Binder.execTransact(Binder.java:453)
我还尝试在设备上手动更改测试应用程序和待测试应用程序的“在其他应用程序上显示”权限。但这也没有改变任何事情

当我从GrantPermissionRule中删除SYSTEM_ALERT_WINDOW权限时,所有其他测试都可以正常运行。 我不明白为什么这会在某些设备上失败

我使用以下网站进行研究,但没有一个有用:


    • 为了解决这个问题,我做了以下工作。首先,我在Espresso AndroidManifest中添加了以下行

      <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
      
      如果设备无法绘制覆盖图,我将忽略测试

      @Before
      public void shouldPerformTest()
      {
          boolean shouldPerformTest = true;
          if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
          {
              shouldPerformTest = Settings.canDrawOverlays(getContext());
          }
      
          Assume.assumeTrue(shouldPerformTest);
      }
      

      你找到解决办法了吗?@dazza5000是的,我发布了我的解决办法。
      @Before
      public void shouldPerformTest()
      {
          boolean shouldPerformTest = true;
          if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
          {
              shouldPerformTest = Settings.canDrawOverlays(getContext());
          }
      
          Assume.assumeTrue(shouldPerformTest);
      }