Есть ли способ вручную создать папку пакета для файла .obb APK?

У меня проблема с приложением: (редко) пользователь загружает приложение из магазина воспроизведения, но файл obb/расширения не загружается. Если создается папка для файла obb (Android/obb/my.package.name), ничего страшного, я без проблем могу скачать файл obb вручную.

Однако, если папка для файла obb не была создана, попытка создать ее с помощью File::mkdir() или File::mkdirs() завершится неудачно (возвратит false). Попытка создать и записать в файл obb без каталога выдает ошибку FileNotFoundException.

File obbFile = new File("path/to/obb/file.obb");

File parent = obbFile.getParentFile();

if (!parent.exists() && !parent.mkdir()) {
    // Failed to create directory
}

Внешние разрешения на чтение/запись настроены и работают правильно, поскольку мы можем читать/записывать/создавать другие файлы/каталоги без проблем.

Я прочитал Как создать папку в /Android/obb?, но единственное решение, данное для этого, - удалить целевой SDK до 22.

Кто-нибудь еще сталкивался с этим и нашел решение или обходной путь?


person Alex Meuer    schedule 18.12.2018    source источник


Ответы (1)


Метод Context::getObbDir() позволяет получить доступ к папке расширения без обычные правила безопасности. Я обнаружил, что если папка не существует, getObbDir() также создает ее (вы также можете дважды проверить ее создание вручную с помощью mkdir()).

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

Верните основной каталог общего/внешнего хранилища, где можно найти файлы OBB этого приложения (если они есть). Обратите внимание, что если в приложении нет файлов OBB, этот каталог может не существовать.

Это похоже на getFilesDir() тем, что эти файлы будут удалены при удалении приложения, однако есть некоторые важные отличия:

... Начиная с Build.VERSION_CODES.KITKAT, для чтения или записи по пути, который возвращает этот метод, не требуются разрешения. ...

Начиная с Build.VERSION_CODES.N, разрешение Manifest.permission.READ_EXTERNAL_STORAGE не требуется, поэтому не запрашивайте это разрешение во время выполнения. ...

Таким образом, код в вопросе может стать:

File obbDir = getObbDir();

if (null == obbDir) {
    // Storage is not available
} else  if (!obbDir.exists() && !obbDir.mkdir()) {
    // Failed to create directory. Shouldn't happen but you never know.
}

ПРИМЕЧАНИЕ. Вам могут потребоваться права на чтение/запись для доступа к расширенным файлам в папке. См. документацию для получения дополнительной информации.

person Alex Meuer    schedule 08.01.2019