我从许多地方(Test programmatically if in Android 10+ the legacy external storage access is disabled,https://developer.android.com/google/play/expansion-files.html#Downloading等)寻找解决方案,但不知道错误的确切原因。 如果仅在适用于Android 10设备的情况下从Google Play下载应用程序,则会出现此错误:
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()
也获取文件路径。但是,当Storage Manager用于从Google Play商店下载的应用程序时
sm.mountObb(mainFile.getAbsolutePath(), null, mainObbStateChangeListener );
无法访问obb扩展文件,并因上述错误终止了应用程序。
可以从Google Play下载应用,但仅适用于android 9或更低版本的设备。如果我创建apk并将其安装在android 10设备上,则该应用程序可以正常访问obb文件。 从Google Play商店下载Android 10设备上的应用程序后,我会错过什么?帮助将不胜感激。
更新:
虽然我仍然不知道答案,但我在Android 10设备上发现了错误的原因:
如果apk版本代码(应用程序gradle中的版本代码)与obb文件名中的版本代码匹配(如果我理解得很好,应该是https://developer.android.com/google/play/expansion-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文件更改为其他版本代码(在apk的版本代码为9时用版本代码8、1、10进行了测试),则应用程序将启动,并且不会出现上述错误。但是,除了apk的版本代码外,我无法在obb文件的名称中使用其他版本代码,以便能够从Google Play商店下载带obb的apk。此外,除非它与版本代码匹配,否则无法从obb文件访问媒体文件。 如果设备使用的是Android 10,则该应用程序可以在apk和obb扩展文件中使用相同的版本代码。
答案 0 :(得分:0)
可以使用替代方法来代替Environment.getExternalStorageDirectory()
的{{1}},Context.getObbDir()
将返回正在运行的应用程序的OBB目录的完整路径,即:/storage/emulated/0/Android/obb/packageName
。
这可以替换代码部分Environment.getExternalStorageDirectory() + "/Android/obb/" + packageName
。有关该方法的更多详细信息,请参见here。