Невозможно получить доступ к файлу расширения obb на устройстве Android 10, если apk и obb загружены из магазина Google Play

Я искал решения во многих местах (Протестируйте программно, если в Android 10+ отключен доступ к устаревшему внешнему хранилищу, https://developer.android.com/google/play/expansion-files.html#Downloading и т. д.), но не знаю точной причины ошибки. Если приложение загружается из Google Play только в случае устройств с Android 10, выдает следующую ошибку:

Caused by: java.lang.IllegalArgumentException: Couldn't get OBB info for /storage/emulated/0/Android/obb/packageName/main.package_version.packageName.obb

Программа может найти файл obb (даже на устройствах с android 10)

File mainFile = new File(Environment.getExternalStorageDirectory() + "/Android/obb/" + packageName + "/" + "main." + packageVersion + "." + packageName + ".obb")
mainFile.getAbsolutpath()

также получает путь к файлу. Однако, когда диспетчер хранилища используется для приложения, загруженного из магазина Google Play

sm.mountObb(mainFile.getAbsolutePath(), null, mainObbStateChangeListener );

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

Приложение можно загрузить из Google Play, но оно работает только для устройств с Android 9 и ниже. Если я создам apk и установлю его на устройстве Android 10, приложение сможет без проблем получить доступ к файлу obb. Что мне не хватает, чтобы запустить приложение на устройствах Android 10, когда оно загружено из магазина Google Play? Помощь будет оценена.

Обновлять:

Я нашел причину ошибки на устройстве Android 10, но до сих пор не знаю ответа:

Если код версии apk (код версии в приложении gradle) совпадает с кодом версии в имени файла obb (что должно быть, если я хорошо понял (https://developer.android.com/google/play/extension-files), затем в классе obbexpansionmanager строка

sm.mountObb(mainFile.getAbsolutePath(), null, mainObbStateChangeListener ); 

выдает эту ошибку:

Caused by: java.lang.IllegalArgumentException: Couldn't get OBB info for /storage/emulated/0/Android/obb/packageName/main.package_version.packageName.obb. 

Если я изменю загруженный файл obb приложения на другой код версии (проверенный с кодом версии 8, 1, 10, когда код версии apk был 9), приложение запускается, и вышеуказанная ошибка не возникает. Однако я не могу использовать другой код версии в имени файла obb, кроме кода версии apk, чтобы иметь возможность загружать apk с obb из магазина Google Play. Кроме того, файлы мультимедиа не могут быть доступны из файла obb, если он не соответствует кодам версии. Если устройство находится под Android 10, приложение работает с одним и тем же кодом версии в apk и в файле расширения obb.


person Zeghra    schedule 10.02.2020    source источник


Ответы (1)


Вместо Environment.getExternalStorageDirectory(), который равен Context.getObbDir(), можно использовать заменяющий метод, который вернет полный путь к каталогу OBB, предназначенному для запущенного приложения, то есть: /storage/emulated/0/Android/obb/packageName.

Этим можно заменить часть кода Environment.getExternalStorageDirectory() + "/Android/obb/" + packageName. Более подробную информацию об этом методе можно найти здесь.

person ahasbini    schedule 31.03.2020
comment
У меня тот же путь с context.getObbDir (), но он все еще не работает. Я обошелся, переименовав файл obb, когда он хочет получить информацию о obb, а когда нужны медиафайлы из файла obb, я переименовал его обратно в исходное имя. Не хорошо, но это работает для меня - person Zeghra; 23.05.2020