我从许多地方(Test programmatically if in Android 10+ the legacy external storage access is disabledhttps://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扩展文件中使用相同的版本代码。

最佳答案

可以使用替代方法代替Environment.getExternalStorageDirectory()Context.getObbDir(),它会返回用于正在运行的应用程序的OBB目录的完整路径,即/storage/emulated/0/Android/obb/packageName

这可以替换代码部分Environment.getExternalStorageDirectory() + "/Android/obb/" + packageName。有关此方法的更多详细信息,请参见here

10-07 12:49