当我们在app上上传一些安卓的本地图片时,有时当上传某些图片时会莫名其妙的闪退,而检查时发现并没有oom异常。同样上传一些类似的图片却可以正常使用。
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, REQUEST_CODE_PICK_PHOTO);
/* 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内容提供者并没有记录这个文件的信息,于是返回了它的路径字符串。
由于可以返回该图片的路径,那么我们可以直接使用这个路径而绕过内容提供者。但是注意,该路径类似于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;
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lidec/article/details/46707245