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());
}
}
讲完了,讲完了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。