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字段还不没查到应该如何处理。