java.lang.IllegalArgumentException Unknown URI: content://downloads/public_downloads/ 解決方案

當(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);

如果在選擇時使用的文件選擇器為 下載內(nèi)容 將會導(dǎo)致使用返回的URI獲取絕對路徑時出現(xiàn)類似如下錯誤:

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

即可解決上述問題。
至于錯誤原因從上述代碼中不難看出,在高于安卓O(8.0)版本時將URI設(shè)為

contentUri = ContentUris.withAppendedId(
                            Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

會導(dǎo)致 Unknown URI 的問題,所以只需要判斷一下當(dāng)前的安卓版本,如果大于 O 則直接使用文件選擇器返回的URI即可。

以上為我所使用的解決方案,對于不同的項目可能有不同的解決方案,可以看一下下面這項目里面的 issue
參考案例

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,384評論 0 17
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,968評論 1 92
  • 歸納 線性關(guān)系、線性表的定義,線性表的基本操作。 線性表的順序存儲結(jié)構(gòu)與鏈?zhǔn)酱鎯Y(jié)構(gòu)(包括單(向)鏈表、循環(huán)鏈表和...
    澤澤馥澤澤閱讀 749評論 0 0
  • 今天畫的中心圖挺滿意,每天的計劃按部就班,有不停遺漏的點也有計劃外體驗到的點,都很好,日子過得很有印記
    茶語絲享閱讀 512評論 6 1
  • 這張相片是去年暑假,我和媽媽在公園散步我給媽媽拍的照。今年媽媽78歲,身體硬朗,她最大的優(yōu)點是許多事能夠放下,能寬...
    glx凌香閱讀 270評論 0 1

友情鏈接更多精彩內(nèi)容