有没有办法为APK的.obb文件手动创建包文件夹?

时间:2018-12-18 10:04:09

标签: android apk-expansion-files

我遇到了一个应用程序问题:(很少)用户会从Play商店下载该应用程序,但obb / expansion文件将无法下载。如果创建了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
}

已设置外部读取/写入权限,并且可以正常工作,因为我们可以毫无问题地读取/写入/创建其他文件/目录。

我已经读过How to create a folder under /Android/obb?,但是唯一的解决方法是将目标sdk降至22。

还有其他人遇到这个问题并找到解决方案或解决方法吗?

1 个答案:

答案 0 :(得分:0)

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.
}

注意::您可能需要读/写权限才能访问文件夹中的扩展文件。有关更多信息,请参见文档。