Есть ли способ вручную создать папку пакета для APK-файла .obb? - PullRequest
0 голосов
/ 18 декабря 2018

У меня проблема с приложением: (редко) пользователь загружает приложение из магазина игр, но файл obb / extension не удастся загрузить.Если папка для файла 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.

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

1 Ответ

0 голосов
/ 08 января 2019

Метод 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.
}

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

...