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. Но правильным способом также является проверка разрешения и уведомление пользователя.