在写Android下载更新时,部分手机遇到这样的问题,主要是Android10,大概意思是权限,什么的,不过我的app权限都有,也做了动态申请成功了,但还是出现这个问题了,另外也有人说application下添加
android:requestLegacyExternalStorage="true"
都适配了,最终还是这个问题,报错信息主要针对文件的写入上,后来在部分手机山看到了不一样的报错信息:
java.lang.IllegalArgumentException: Primary directory BusinessCache not allowed for content://media/external_primary/file; allowed directories are [Download, Documents]
at com.android.providers.media.MediaProvider.ensureFileColumns(MediaProvider.java:2923)
at com.android.providers.media.MediaProvider.ensureUniqueFileColumns(MediaProvider.java:2588)
at com.android.providers.media.MediaProvider.insertFile(MediaProvider.java:3282)
at com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:3826)
at com.android.providers.media.MediaProvider.insert(MediaProvider.java:3537)
at com.android.providers.media.MediaProvider.insertFileForFuse(MediaProvider.java:7187)
at com.android.providers.media.MediaProvider.insertFileIfNecessaryForFuse(MediaProvider.java:7281)
这个是Android10存储分区的一个问题,大致意思是文件类型和保存的路径类型不一致,然后根据错误信息网上查找了下资料,最后定位在获取SD卡路径的代码上:
之前:
Environment.getExternalStorageDirectory().getPath()
而Android10以后需要这样
ContextCompat.getExternalFilesDirs(
BaseApplication.getInstance(), null)[0].getAbsolutePath()
最终的解决:
if(Build.VERSION.SDK_INT<29){
mSDCardFolderPath = Environment.getExternalStorageDirectory().getPath() + "/BusinessCache";
}else{
mSDCardFolderPath = ContextCompat.getExternalFilesDirs(
BaseApplication.getInstance(), null)[0].getAbsolutePath() + "/BusinessCache";
}
另外访问SD卡根路径需要在file_path.xml中添加:
<root-path name="root_path" path="."/>