Android如何通过URI获取文件路径示例代码
前言
最近在工作的过程中,遇到不同Android版本下URI采用不同方式来获取文件路径的问题。
因为需求的原因,要求拍照上传或者从相册中选择图片上传,而且图片是需要经过压缩的,大小不能超过2M。
很快,拍照的这部分就搞定了。那么相册中选择图片的也是一样的道理,应该也是轻松解决了。
至于选择图片的代码,如下所示:
intent=newIntent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent,FILE_CHOOSER_RESULT_CODE);
之后就是在onActivityResult(intrequestCode,intresultCode,Intentdata)中获取到URI。
最关键的来了,如果通过URI来获取文件呢?
比如,现在URI为content://media/extenral/images/media/17766,而我们需要得到对应的文件路径。
if(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())){ Cursorcursor=context.getContentResolver().query(uri,newString[]{MediaStore.Images.Media.DATA},null,null,null); if(cursor!=null){ if(cursor.moveToFirst()){ intcolumnIndex=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if(columnIndex>-1){ path=cursor.getString(columnIndex); } } cursor.close(); } returnpath; }
原以为万事大吉,但是在Android4.4及以上的手机上一试,发现根本不行。因为在Android4.4及以上的手机上,获取到的URI变成了content://com.android.providers.media.documents/document/image%3A235700,和之前我们预期的不是同一种类型。
这是因为在Android4.4及以上的机型,使用了DocumentUri来代表获取到文件的URI。
所以我们又要对于DocumentUri进行适配。
if(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())){ if(DocumentsContract.isDocumentUri(context,uri)){ if(isExternalStorageDocument(uri)){ //ExternalStorageProvider finalStringdocId=DocumentsContract.getDocumentId(uri); finalString[]split=docId.split(":"); finalStringtype=split[0]; if("primary".equalsIgnoreCase(type)){ path=Environment.getExternalStorageDirectory()+"/"+split[1]; returnpath; } }elseif(isDownloadsDocument(uri)){ //DownloadsProvider finalStringid=DocumentsContract.getDocumentId(uri); finalUricontentUri=ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); path=getDataColumn(context,contentUri,null,null); returnpath; }elseif(isMediaDocument(uri)){ //MediaProvider finalStringdocId=DocumentsContract.getDocumentId(uri); finalString[]split=docId.split(":"); finalStringtype=split[0]; UricontentUri=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; } finalStringselection="_id=?"; finalString[]selectionArgs=newString[]{split[1]}; path=getDataColumn(context,contentUri,selection,selectionArgs); returnpath; } } } privatestaticStringgetDataColumn(Contextcontext,Uriuri,Stringselection,String[]selectionArgs){ Cursorcursor=null; finalStringcolumn="_data"; finalString[]projection={column}; try{ cursor=context.getContentResolver().query(uri,projection,selection,selectionArgs,null); if(cursor!=null&&cursor.moveToFirst()){ finalintcolumn_index=cursor.getColumnIndexOrThrow(column); returncursor.getString(column_index); } }finally{ if(cursor!=null) cursor.close(); } returnnull; } privatestaticbooleanisExternalStorageDocument(Uriuri){ return"com.android.externalstorage.documents".equals(uri.getAuthority()); } privatestaticbooleanisDownloadsDocument(Uriuri){ return"com.android.providers.downloads.documents".equals(uri.getAuthority()); } privatestaticbooleanisMediaDocument(Uriuri){return"com.android.providers.media.documents".equals(uri.getAuthority()); }
好了,上面的代码还是容易看懂的。这下就解决了对于Android4.4及以上的机型适配。顺便把以file://开头的URI适配也补上:
if(ContentResolver.SCHEME_FILE.equals(uri.getScheme())){ path=uri.getPath(); returnpath; }
完美了,下面就贴出完整的FileUtils代码,拿去用吧:
publicfinalclassFileUtils{ publicstaticStringgetFilePathByUri(Contextcontext,Uriuri){ Stringpath=null; //以file://开头的 if(ContentResolver.SCHEME_FILE.equals(uri.getScheme())){ path=uri.getPath(); returnpath; } //以content://开头的,比如content://media/extenral/images/media/17766 if(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())&&Build.VERSION.SDK_INT-1){ path=cursor.getString(columnIndex); } } cursor.close(); } returnpath; } //4.4及之后的是以content://开头的,比如content://com.android.providers.media.documents/document/image%3A235700 if(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())&&Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){ if(DocumentsContract.isDocumentUri(context,uri)){ if(isExternalStorageDocument(uri)){ //ExternalStorageProvider finalStringdocId=DocumentsContract.getDocumentId(uri); finalString[]split=docId.split(":"); finalStringtype=split[0]; if("primary".equalsIgnoreCase(type)){ path=Environment.getExternalStorageDirectory()+"/"+split[1]; returnpath; } }elseif(isDownloadsDocument(uri)){ //DownloadsProvider finalStringid=DocumentsContract.getDocumentId(uri); finalUricontentUri=ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); path=getDataColumn(context,contentUri,null,null); returnpath; }elseif(isMediaDocument(uri)){ //MediaProvider finalStringdocId=DocumentsContract.getDocumentId(uri); finalString[]split=docId.split(":"); finalStringtype=split[0]; UricontentUri=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; } finalStringselection="_id=?"; finalString[]selectionArgs=newString[]{split[1]}; path=getDataColumn(context,contentUri,selection,selectionArgs); returnpath; } } } returnnull; } privatestaticStringgetDataColumn(Contextcontext,Uriuri,Stringselection,String[]selectionArgs){ Cursorcursor=null; finalStringcolumn="_data"; finalString[]projection={column}; try{ cursor=context.getContentResolver().query(uri,projection,selection,selectionArgs,null); if(cursor!=null&&cursor.moveToFirst()){ finalintcolumn_index=cursor.getColumnIndexOrThrow(column); returncursor.getString(column_index); } }finally{ if(cursor!=null) cursor.close(); } returnnull; } privatestaticbooleanisExternalStorageDocument(Uriuri){ return"com.android.externalstorage.documents".equals(uri.getAuthority()); } privatestaticbooleanisDownloadsDocument(Uriuri){ return"com.android.providers.downloads.documents".equals(uri.getAuthority()); } privatestaticbooleanisMediaDocument(Uriuri){return"com.android.providers.media.documents".equals(uri.getAuthority()); } }
讲完了,讲完了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。