Android Espresso java.lang.SecurityException: разрешение android.permission.SYSTEM_ALERT_WINDOW не является изменяемым типом разрешения

У меня есть сценарий эспрессо, которому требуется разрешение SYSTEM_ALERT_WINDOW. Я использую следующий код, чтобы предоставить разрешение для всех тестовых сценариев:

@Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.CAMERA,
        Manifest.permission.WRITE_EXTERNAL_STORAGE);

И у меня есть специальный AndroidManifest для тестовых случаев, который включает разрешения.

<uses-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW" />

Это прекрасно работает на большинстве устройств разных марок и версий Android от Android 5.X до Android 8.x (около 15+ устройств). Однако на моем Huawei P8 Lite с Android 6.0 я получаю следующую ошибку:

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)

Я также попытался вручную изменить разрешение «отображать поверх других приложений» на устройстве для тестового приложения и приложения для тестирования. Но и это ничего не изменило.

Когда я удаляю разрешение SYSTEM_ALERT_WINDOW из GrantPermissionRule, все остальные тесты выполняются нормально. Я не понимаю, почему это не сработает на некоторых устройствах.

Я использовал следующие веб-сайты для исследования, но ни один из них не был полезен:

вы нашли решение для этого?

dazza5000 16.04.2019 22:15

@ dazza5000 да, я опубликовал свое решение.

Wirling 17.04.2019 10:39
0
2
1 024
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сделал следующее, чтобы решить эту проблему. Сначала я добавил следующую строку в Espresso AndroidManifest.

<uses-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW" />

Вместо добавления правила разрешения ко всем моим тестовым примерам я добавил его в конкретный тестовый пример.

@Rule public GrantPermissionRule grantPermissionRule = GrantPermissionRule.grant(Manifest.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);
}

Другие вопросы по теме