android打开系统相册(解决api19的兼容问题)

最近做的一个应用里有二维码扫描的功能,其中要求支持对相册中的二维码照片进行扫描。一开始在网上找了些资料并按照他们说的做了,应用跑起来能够正常的解析。但后来用了4.4.2的手机跑的时候,在打开系统相册选择完照片之后,总是提示扫描失败。

经过一番排查,发现是读取照片的uri路径的问题。在小于api19的系统的手机上得到的uri路径是 “content://media/external/images/media/3951”这样子的,但是在api19及以上的手机得到的uri路径是“content://com.android.providers.media.documents/document/image%3A5504”。

知道问题之后,我在网上找了资料,发现可以做一些判断,但是那些方法都是在api19提供的,由于目前的target 版本小于19,所以那些方法都没发用。于是我根据用到的方法,在源码里面找,最后的解决方法如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
switch(requestCode){
case REQUEST_CODE:
Cursor cursor = null;

String photo_path = "";//照片路径

String[] proj = { MediaStore.Images.Media.DATA};  
                cursor = getContentResolver().query(data.getData(), proj, null, null, null);  
if (cursor.moveToFirst()) {
photo_path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
//api>=19时,photo_path的值为null,此时再做处理
if(photo_path == null) {
String wholeID = getDocumentId(data.getData());
    String id = wholeID.split(":")[1];
    String[] column = { MediaStore.Images.Media.DATA };
    String sel = MediaStore.Images.Media._ID +"=?";
    cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[] { id }, null);
   int columnIndex = cursor.getColumnIndex(column[0]);
    if (cursor.moveToFirst())
    photo_path = cursor.getString(columnIndex);//此时的路径为照片路径
}
}
cursor.close();

break;

}

}


private static final String PATH_DOCUMENT = "document";
public static String getDocumentId(Uri documentUri) {
        final List paths = documentUri.getPathSegments();
        if (paths.size() < 2) {
            throw new IllegalArgumentException("Not a document: " + documentUri);
        }
        if (!PATH_DOCUMENT.equals(paths.get(0))) {
            throw new IllegalArgumentException("Not a document: " + documentUri);
        }
        return paths.get(1);
   }

经过本人测试,通过这种方法是可以在target api版本小于19的情况下,在19及以上的系统的手机上也能正确获得图片路径

还有,网上说在打开系统相册的时候要做如下判断:

if (Build.VERSION.SDK_INT <19) {  
innerIntent.setAction(Intent.ACTION_GET_CONTENT);  
}else {  
innerIntent.setAction( Intent.ACTION_OPEN_DOCUMENT);  
}  

但是Intent.ACTION_OPEN_DOCUMENT在低版本的api中并没有,我测试过,即使不用做这个判断,直接用Intent.ACTION_GET_CONTENT通过上述的方法也能奏效。

你可能感兴趣的:(android打开系统相册(解决api19的兼容问题))