我尝试使用扩展文件,但发现了一个我无法解决的问题。
您似乎可以访问/Android/obb
文件夹并最终删除/Android/obb/my.package.name
目录(尝试使用某个文件管理器),但我无法在应用程序中处理这种情况。
如果我让Google Downloader库尝试下载扩展文件,它会挂起并出错(对于丢失的文件夹),但如果我重新创建该文件夹,它将会启动。
奇怪的是,我能够从其他应用程序(我用来查看目录的同一个文件管理器)创建文件夹但不是来自我的!
我试过
File f = new File(Environment.getExternalStorageDirectory(), "Android/obb/my.package.name");
f.mkdirs();
但它没有用。
我在清单中拥有权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我定位api 23并使用25编译。
答案 0 :(得分:2)
OP将Target SDK放弃到22并且能够避免导致问题的危险权限工作流程。
答案 1 :(得分: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.
}
注意::您可能需要读/写权限才能访问文件夹中的扩展文件。