當(dāng)使用如下代碼調(diào)用安卓的自帶文件選擇
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("video/*");
intent.addCategory(intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(intent, "請選擇視頻文件"),RequestCode);
如果在選擇時(shí)使用的文件選擇器為 下載內(nèi)容 將會(huì)導(dǎo)致使用返回的URI獲取絕對路徑時(shí)出現(xiàn)類似如下錯(cuò)誤:
java.lang.IllegalArgumentException
Unknown URI: content://downloads/public_downloads/1944
java.lang.RuntimeException:Failure delivering result ResultInfo{who=null, request=1000, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/1944 flg=0x1 }} to activity {com.equationl.videoshotpro/com.equationl.videoshotpro.MainActivity}: java.lang.IllegalArgumentException: Unknown URI: content://downloads/public_downloads/1944
修復(fù)前使用的轉(zhuǎn)換URI的部分代碼如下:
public String getImageAbsolutePath(Activity context, Uri imageUri) {
.............
.............
else if (isDownloadsDocument(imageUri)) {
String id = DocumentsContract.getDocumentId(imageUri);
if (id.startsWith("raw:")) {
final String path = id.replaceFirst("raw:", "");
return path;
}
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
.........
.........
}
通過查找資料,發(fā)現(xiàn)原來只需要將上述代碼更改為:
public String getImageAbsolutePath(Activity context, Uri imageUri) {
.............
.............
else if (isDownloadsDocument(imageUri)) {
String id = DocumentsContract.getDocumentId(imageUri);
if (id.startsWith("raw:")) {
final String path = id.replaceFirst("raw:", "");
return path;
}
Uri contentUri = imageUri;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
}
.........
.........
}
即可解決上述問題。
至于錯(cuò)誤原因從上述代碼中不難看出放案,在高于安卓O(8.0)版本時(shí)將URI設(shè)為
contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
會(huì)導(dǎo)致 Unknown URI 的問題,所以只需要判斷一下當(dāng)前的安卓版本止状,如果大于 O 則直接使用文件選擇器返回的URI即可。
以上為我所使用的解決方案攒霹,對于不同的項(xiàng)目可能有不同的解決方案怯疤,可以看一下下面這項(xiàng)目里面的 issue
參考案例