RuntimeException: невозможно создать выходной dir: / storage / emulated/0 / App spoon-скриншоты

я настраиваю ложку для тестирования пользовательского интерфейса Android с помощью gradle-ложка-плагин использование моментального снимка ложки 2.0.0. Мой проект настроен с помощью плагина Android Gradle 3.0.1.

при съемке скриншотов через spoonRule.screenshot(activity, "hello"), Я получаю это исключение RuntimeException:

java.lang.RuntimeException: Unable to create output dir: /storage/emulated/0/app_spoon-screenshots
at com.squareup.spoon.SpoonRule.createDir(SpoonRule.java:167)
at com.squareup.spoon.SpoonRule.createDir(SpoonRule.java:164)
at com.squareup.spoon.SpoonRule.createDir(SpoonRule.java:164)
at com.squareup.spoon.SpoonRule.obtainDirectory(SpoonRule.java:108)
at com.squareup.spoon.SpoonRule.screenshot(SpoonRule.java:66)

все работает нормально, если я запускаю его на эмуляторе Nexus 4 API 19, но он не работает на эмуляторе Pixel 2 API 27. Разрешения изменили кучу с 19 до 27, так что это не полностью неожиданный.

я пробовал большинство советов, доступных в настоящее время, включая добавление манифеста в my androidTest каталог, который предоставляет внешнее хранилище для чтения и записи (с и без maxSdkVersion):

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="tv.twitch.android.test">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>

    <uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18"/>

</manifest>

я вижу, что эти разрешения объединяются в мой окончательный манифест AndroidManifest моего приложения (не уверен, как проверить манифест тестового приложения) в обоих случаях.

я попытался предоставить разрешения через UIAutomator как для приложения, так и для теста пакет:

val device = UiDevice.getInstance(getInstrumentation())
device.executeShellCommand("pm grant tv.twitch.android.test android.permission.READ_EXTERNAL_STORAGE")
device.executeShellCommand("pm grant tv.twitch.android.debug android.permission.READ_EXTERNAL_STORAGE")
device.executeShellCommand("pm grant tv.twitch.android.test android.permission.WRITE_EXTERNAL_STORAGE")
device.executeShellCommand("pm grant tv.twitch.android.debug android.permission.WRITE_EXTERNAL_STORAGE")

это выводит Permission denied для Logcat и приводит к тому же исключению выше.

если я попытаюсь использоватьGrantPermissionRule как:

@get:Rule var runtimePermissionRule = GrantPermissionRule.grant(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)

я получаю другое исключение:

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:108)

GrantPermissionCallable: Permission: android.permission.WRITE_EXTERNAL_STORAGE cannot be granted!

удаление Manifest.permission.WRITE_EXTERNAL_STORAGE и оставляя только чтение, мы возвращаемся к исходному исключению:java.lang.RuntimeException: Unable to create output dir: /storage/emulated/0/app_spoon-screenshots

запуск из Android Studio или из командной строки с помощью gradle-spoon-plugin не влияет на выше.

глядя на разрешения мое приложение и тестовое приложение предоставляются в настройках, я вижу, что мое приложение имеет разрешение на хранение, но мое тестовое приложение (tv.подергивание.андроид.тест) нет запрашиваемые разрешения.

я также попытался с помощью бариста библиотека:

PermissionGranter.allowPermissionsIfNeeded(Manifest.permission.WRITE_EXTERNAL_STORAGE)

без везения их тоже.

обновления:

я попытался сделать тестовое приложение целевой SDK версии 22 в надежде, что он будет писать разрешения.

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="tv.twitch.android.test">

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="22"
        tools:overrideLibrary="android.support.test.uiautomator.v18"/>

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

</manifest>

Via Gradle (./gradlew spoon) я попытался настроить Gradle-spoon-плагин для запроса всех разрешений:

spoon {
    // Grant all runtime permissions during installation on Marshmallow and above devices.
    grantAll = true
}

не повезло. И я даже пытался использовать Spoon library версии 1.3.1 безрезультатно.

2 ответов


моя проблема была вызвана слиянием внешней библиотеки в maxSdkVersion с разрешением WRITE_EXTERNAL_STORAGE. Чтобы обойти это, я удалил атрибут и повторно добавил разрешение WRITE_EXTERNAL_STORAGE. Это необходимо только для моего манифеста приложения, а не для манифеста тестового приложения.

<!-- Strip away maxSdkVersion -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                 tools:remove="android:maxSdkVersion"/>

<!-- Add the permission with no maxSdkVersion defined -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

затем вы можете создавать, предоставлять разрешения и запускать тесты:

# Uninstall existing APKs and install our app APK and test APK
./gradlew uninstallAll installDebug installDebugAndroidTest

# List all APKs installed with adb shell 'pm list packages -f'
# Grant the app APK write and read to external storage permissions
adb shell pm grant gg.mark.debug android.permission.WRITE_EXTERNAL_STORAGE
adb shell pm grant gg.mark.debug android.permission.READ_EXTERNAL_STORAGE

export APK=build/outputs/apk/debug/debug.apk
export TEST_APK=build/outputs/apk/androidTest/debug/debug-androidTest.apk

# TEST_APK and APK are positional arguments so keep them in this order
# Disable GIF generation because it's slow
java -jar spoon-runner-2.0.0.jar --debug --disable-gif "$TEST_APK" "$APK"

на pm grant команды не будут выполнены, если разрешения для вашего приложения не настроены правильно. Убедитесь,что эти команды успешно!


сначала попробуйте найти SystemSetting->YOUR_APP->Permission на Pixel2 (API27) проверьте, отключено ли внешнее хранилище.

разрешения EXTERNAL_STORAGE(как WRITE и READ) требуются во время выполнения после API23 (Android 6+). Вы должны проверить разрешение и уведомить пользователя, чтобы включить в system configure. см. Запросить Разрешения Приложения

конечно, обычные приложения не имеют разрешения предоставлять свои разрешения, как обычно, с pm grant ....

В вредные решение сделать все цель приложение на API22. Но правильным способом также является проверка разрешения и уведомление пользователя.