我遇到了一个应用程序问题:(很少)用户会从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。
还有其他人遇到这个问题并找到解决方案或解决方法吗?
答案 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.
}
注意::您可能需要读/写权限才能访问文件夹中的扩展文件。有关更多信息,请参见文档。