安卓上传本地图片闪退

1.现象

当我们在app上上传一些安卓的本地图片时,有时当上传某些图片时会莫名其妙的闪退,而检查时发现并没有oom异常。同样上传一些类似的图片却可以正常使用。

1.1 开启选择本地图片

Intent intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, REQUEST_CODE_PICK_PHOTO);

1.2 onActvityResult中处理返回结果

/* data为onActvityResult的第三个参数 */
Uri uri = data.getData();

String[] proj = { MediaStore.Images.Media.DATA };

Cursor cursor = context.getContentResolver().query(uri, proj, null,null, null);
int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(index);

这样就得到了图片的路径。但是问题就出在这里。当调试的时候发现,闪退的原因是cursor值为null。也就是说,当前数据库中根本就没有这条记录。以下分别是可用图片和闪退图片的url示例

/* 可用url */
content://media/external/images/media/117231
由此url在内容提供者中查到的对应路径为:/storage/emulated/0/DCIM/Camera/IMG_20150624_180203.jpg

/* 造成cursor为null的url  */
file:///storage/emulated/0/MIUI/Gallery/cloud/.thumbnailFile/3a55c22cfe329906fcfbfe62f8b910bca4ad7d54.jpg

显然,这并不是一个url,也不是一个直接可用的路径,所以cursor不会查到任何值。

路径中的.thumbnailFile文件是一个系统的默认的图片缓存文件。所以,这里我猜想由于是缓存文件,所以MideaStore内容提供者并没有记录这个文件的信息,于是返回了它的路径字符串。

2.解决办法

由于可以返回该图片的路径,那么我们可以直接使用这个路径而绕过内容提供者。但是注意,该路径类似于file:///storage/emulated… 的格式,我们并不能直接使用,需要将其file://字符串去掉,转换为可以使用的路径字符串。

String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(uri, proj, null,null, null);

//针对部分手机,图片在缓存文件中,MediaStore中没有对应url,则判断传入url是否为类似"file:///storage/emulated/0/..."路径
//如果是路径,则直接截取为类似/storage/emulated/0/..的字符串,并用这个字符串当做路径
if(cursor == null){
    String str = uri.toString();
    System.out.println(str);
    if(str.contains("file:///")){
            Utility.closeSafely(cursor);
            str = str.substring(7);
            return str;
           }
}

int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String path = cursor.getString(index);
    Utility.closeSafely(cursor);
    return path;

你可能感兴趣的:(Android)