Я пытаюсь запустить связанные тесты для моего приложения, используя Android ISO, установленный на VirtualBox. Я получил Android 7.1 ISO от http://www.android -x86.org / . Он установлен под VirtualBox и, кажется, работает правильно.
Наше приложение использует PocketSphinx, который создает несколько каталогов и сохраняет в них некоторые файлы. Приложение работает корректно на некоторых планшетах Android 7.0 и под эмулятором, который поставляется с Android Studio. Иногда он работает правильно в VirtualBox, но он попадает в какое-то странное состояние, когда он не может читать или записывать в нужные каталоги.
AndroidManifest содержит это разрешение (наряду с другими):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Разрешения отображаются как включенные в Настройках => Приложения => [Наше приложение] => Разрешения.
Вот фактическое сообщение об ошибке:
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.hcs.android.orconnect/files/sync/cmudict-en-us.dict (No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
at edu.cmu.pocketsphinx.Assets.copy(Assets.java:224)
at edu.cmu.pocketsphinx.Assets.syncAssets(Assets.java:269)
Если я установлю точку останова перед этим вызовом, я вижу, что все они возвращают false:
new File("/storage/emulated/0/Android/data/").canRead()
new File("/storage/emulated/0/Android/data/").canWrite()
new File("/storage/emulated/0/Android/data/com.hcs.android.orconnect").canRead()
new File("/storage/emulated/0/Android/data/com.hcs.android.orconnect").canWrite()
Однако что-то создало папку /storage/emulated/0/Android/data/com.hcs.android.orconnect/files. Если я вручную удалю эту папку из приглашения оболочки adb, она будет воссоздана при следующем запуске моего теста приложения, но у приложения все еще будут те же проблемы.
Я действительно в недоумении, почему у меня проблемы с разрешением. Любые идеи о том, что происходит и как исправить разрешения?
(Примечание: я не хочу использовать эмулятор Android, потому что мы запускаем VirtualBox по другим причинам, и они не будут играть друг с другом.)
(Примечание. Неудивительно, что при запуске приложения из отладчика возникают те же проблемы, что и при запуске подключенного теста.)
Шаги для воспроизведения:
- Установите и запустите образ VirtualBox под Android 7.1 ISO.
- Пробег
adb connect <ip address>
- Выполнить
./gradlew connectAndroidTest
- Тест пройдёт
- Выполнить
./gradlew connectAndroidTest
- Тест не пройден и не будет выполняться для всех будущих прогонов.
Работа вокруг:
- Установить приложение (если не установлено)
- Поверните разрешение «Хранилище» в Настройках => Приложения => [Мое приложение]