Android 读取媒体库文件 4.4

Nexus 4更新Android 4.4之后Doplus无法发送图片微博,今晚修复了这个问题,记录一下。

获取图片资源是通过Intent来调用媒体库。示例如下:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
   intent.setType("image/*");
   startActivityForResult(intent, 0x01);

Android4.4之前会默认调用Galley Provider选择图片,对应返回的URI是

content://media/external/images/media/65360

Android4.4则会调用Document Provider选择图片,在Document Provider整合了最近查看、内部存储器、SD卡、下载内容等本地资源,以及第三方的图片资源读取Provider比如Galley、Photos(Google+独立出来的图片应用)、Drive、Dropbox、Box、SkyDrive等等。

本地资源通过Document Provider选择后返回的URI如下:

content://com.android.providers.media.documents/document/image:65360

读取Document Provider的图片资源,需要做如下处理:

String wholeID = DocumentsContract.getDocumentId(uri);
 
  //获得资源唯一ID
  String id = wholeID.split(":")[1];
  //定义索引字段
  String[] column = { MediaStore.Images.Media.DATA };    
 
  //          
  String sel = MediaStore.Images.Media._ID + "=?";
 
  Cursor cursor = getContentResolver().
                            query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            column, sel, new String[]{ id }, null);
 
  int columnIndex = cursor.getColumnIndex(column[0]);
 
  if (cursor.moveToFirst()) {
      //DATA字段就是本地资源的全路径
      String filePath = cursor.getString(columnIndex);
  }  
  //切记要关闭游标
  cursor.close();

其他第三方媒体资源获取时会返回相对应的URI:

  • Galley、Photos提供的本地资源遵循原有默认URI:

content://media/external/images/media/65360

通过Cursor读取MediaStore.Images.Media.DATA字段获得本地图片文件的全路径。

  • Dropbox返回的URI为File协议:

file:///storage/emulated/0/Android/data/com.dropbox.android/files/scratch/go.png

这里可以直接uri.getPath()获取本地图片文件的全路径。

  • Photos提供的网络存储资源,返回URI:

content://com.google.android.apps.photos.content/0/https://lh3.googleusercontent.com/_jPtnn4W-HPeGzL4fDnCSGd

通过uri.getPath()获得的字符串去掉/0/就是网络资源URL,可以下载到本地资源中。

  • Google Drive:

content://com.google.android.apps.docs.storage/document/acc=1;doc=220

  • Skydrive:

content://com.microsoft.skydrive.content.external/external_property/AD!9343/06.jpg

在Doplus之前的版本中,默认处理Galley返回的本地图片URI,导致Android4.4中Document Provider返回的URI无效,这次修复中还额外增加File协议的支持,Google Photos由于Google+在国内的不稳定性暂时不做处理,Skydrive通过URI获取的DATA字段还不没查到应该如何处理。