Uri转Path。修复java.lang.IllegalArgumentException: Unknown URI: content://downloads/public_

```

package com.m7.imkfsdk.utils;importandroid.annotation.SuppressLint;importandroid.content.ContentUris;importandroid.content.Context;importandroid.database.Cursor;importandroid.net.Uri;importandroid.os.Build;importandroid.os.Environment;importandroid.provider.DocumentsContract;importandroid.provider.MediaStore;importandroid.provider.OpenableColumns;importandroid.support.annotation.NonNull;importandroid.support.annotation.Nullable;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;/**

* Created by pangw on 2018/5/23.

*/publicclassPickUtils{publicstaticfinalString DOCUMENTS_DIR="documents";@SuppressLint("NewApi")publicstaticStringgetPath(finalContext context,finalUri uri){finalboolean isKitKat=Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT;// DocumentProviderif(isKitKat&&DocumentsContract.isDocumentUri(context,uri)){// ExternalStorageProviderif(isExternalStorageDocument(uri)){finalString docId=DocumentsContract.getDocumentId(uri);finalString[]split=docId.split(":");finalString type=split[0];if("primary".equalsIgnoreCase(type)){returnEnvironment.getExternalStorageDirectory()+"/"+split[1];}}// DownloadsProviderelseif(isDownloadsDocument(uri)){finalString id=DocumentsContract.getDocumentId(uri);if(id!=null&&id.startsWith("raw:")){returnid.substring(4);}String[]contentUriPrefixesToTry=newString[]{"content://downloads/public_downloads","content://downloads/my_downloads"};for(String contentUriPrefix:contentUriPrefixesToTry){Uri contentUri=ContentUris.withAppendedId(Uri.parse(contentUriPrefix),Long.valueOf(id));try{String path=getDataColumn(context,contentUri,null,null);if(path!=null&&!path.equals("")){returnpath;}}catch(Exceptione){}}// path could not be retrieved using ContentResolver, therefore copy file to accessible cache using streamsString fileName=getFileName(context,uri);File cacheDir=getDocumentCacheDir(context);File file=generateFileName(fileName,cacheDir);String destinationPath=null;if(file!=null){destinationPath=file.getAbsolutePath();saveFileFromUri(context,uri,destinationPath);}returndestinationPath;}// MediaProviderelseif(isMediaDocument(uri)){finalString docId=DocumentsContract.getDocumentId(uri);finalString[]split=docId.split(":");finalString type=split[0];Uri contentUri=null;if("image".equals(type)){contentUri=MediaStore.Images.Media.EXTERNAL_CONTENT_URI;}elseif("video".equals(type)){contentUri=MediaStore.Video.Media.EXTERNAL_CONTENT_URI;}elseif("audio".equals(type)){contentUri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}finalString selection="_id=?";finalString[]selectionArgs=newString[]{split[1]};returngetDataColumn(context,contentUri,selection,selectionArgs);}}// MediaStore (and general)elseif("content".equalsIgnoreCase(uri.getScheme())){String path=getDataColumn(context,uri,null,null);if(path!=null&&!path.equals(""))returnpath;// path could not be retrieved using ContentResolver, therefore copy file to accessible cache using streamsString fileName=getFileName(context,uri);File cacheDir=getDocumentCacheDir(context);File file=generateFileName(fileName,cacheDir);String destinationPath=null;if(file!=null){destinationPath=file.getAbsolutePath();saveFileFromUri(context,uri,destinationPath);}returndestinationPath;}// Fileelseif("file".equalsIgnoreCase(uri.getScheme())){returnuri.getPath();}returnnull;}/**

    * @param uri The Uri to check.

    * @return Whether the Uri authority is ExternalStorageProvider.

    */publicstaticbooleanisExternalStorageDocument(Uri uri){return"com.android.externalstorage.documents".equals(uri.getAuthority());}/**

    * @param uri The Uri to check.

    * @return Whether the Uri authority is DownloadsProvider.

    */publicstaticbooleanisDownloadsDocument(Uri uri){return"com.android.providers.downloads.documents".equals(uri.getAuthority());}/**

    * @param uri The Uri to check.

    * @return Whether the Uri authority is MediaProvider.

    */publicstaticbooleanisMediaDocument(Uri uri){return"com.android.providers.media.documents".equals(uri.getAuthority());}publicstaticStringgetDataColumn(Context context,Uri uri,String selection,String[]selectionArgs){Cursor cursor=null;finalString column="_data";finalString[]projection={column};String path="";try{cursor=context.getContentResolver().query(uri,projection,selection,selectionArgs,null);if(cursor!=null&&cursor.moveToFirst()){finalint column_index=cursor.getColumnIndexOrThrow(column);path=cursor.getString(column_index);returnpath;}}catch(Exceptione){e.printStackTrace();}finally{if(cursor!=null)cursor.close();}returnpath;}publicstaticStringgetFileName(@NonNullContext context,Uri uri){String mimeType=context.getContentResolver().getType(uri);String filename=null;if(mimeType==null&&context!=null){String path=getPath(context,uri);if(path==null){filename=getName(uri.toString());}else{File file=newFile(path);filename=file.getName();}}else{Cursor returnCursor=context.getContentResolver().query(uri,null,null,null,null);if(returnCursor!=null){int nameIndex=returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);returnCursor.moveToFirst();filename=returnCursor.getString(nameIndex);returnCursor.close();}}returnfilename;}publicstaticStringgetName(String filename){if(filename==null){returnnull;}int index=filename.lastIndexOf('/');returnfilename.substring(index+1);}publicstaticFilegetDocumentCacheDir(@NonNullContext context){File dir=newFile(context.getCacheDir(),DOCUMENTS_DIR);if(!dir.exists()){dir.mkdirs();}returndir;}@NullablepublicstaticFilegenerateFileName(@NullableString name,File directory){if(name==null){returnnull;}File file=newFile(directory,name);if(file.exists()){String fileName=name;String extension="";int dotIndex=name.lastIndexOf('.');if(dotIndex>0){fileName=name.substring(0,dotIndex);extension=name.substring(dotIndex);}int index=0;while(file.exists()){index++;name=fileName+'('+index+')'+extension;file=newFile(directory,name);}}try{if(!file.createNewFile()){returnnull;}}catch(IOExceptione){returnnull;}returnfile;}privatestaticvoidsaveFileFromUri(Context context,Uri uri,String destinationPath){InputStreamis=null;BufferedOutputStream bos=null;try{is=context.getContentResolver().openInputStream(uri);bos=newBufferedOutputStream(newFileOutputStream(destinationPath,false));byte[]buf=newbyte[1024];is.read(buf);do{bos.write(buf);}while(is.read(buf)!=-1);}catch(IOExceptione){e.printStackTrace();}finally{try{if(is!=null)is.close();if(bos!=null)bos.close();}catch(IOExceptione){e.printStackTrace();}}}}

```

你可能感兴趣的:(Uri转Path。修复java.lang.IllegalArgumentException: Unknown URI: content://downloads/public_)