最近做项目测试小米机器时发现小米设备在调用系统相机以及相册时选取的数据一直返回为null,下面是我的解决方法:
// 权限申请这里就不写了,默认已经申请了权限
// 打开系统相机有两种方式,一种就是指定Intent然后开启相机,另一种是指定相机拍照存储图片的路径拍照
private static final int TAKE_PHOTO = 0;
private static final int IMAGE_ALBUM = 1;
// 第一种调用系统相机的方法
// click方法中
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_PHOTO);
// 第二种在打开相机时就指定拍照时存储路径
// click方法中
private Uri _OutPutFileUri;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 指定拍摄的图片的存储的路径
File imgFilePath = new File(Environment.getExternalStorageDirectory().toString()+ "/filename");
if (!imgFilePath .exists())
{
imgFilePath .mkdirs();
}
// 图片名
File file = new File(path1, System.currentTimeMillis() + ".jpg");
_OutPutFileUri = Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT, _OutPutFileUri);
startActivityForResult(intent, TAKE_PHOTO);
// 打开系统相册
// click方法中
Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, IMAGE_ALBUM);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// 当data为空的时候表明没有指定Uri,为空是表明指定了Uri
if (data != null)
{
switch (requestCode)
{
case TAKE_PHOTO:
// 没有指定文件路径拍照时会在这里接受到拍照的照片,你会发现获取的uri一直是null
//,这可能是小米机器的问题所以第一种方法没有我们用第二种方法
Uri uri= data.getData();
break;
case IMAGE_ALBUM:
// 调用图库在这里返回的Uri在小米上面显示为空
getSelectAlbumUri(data);
break;
}
return;
}
switch (requestCode)
{
case TAKE_PHOTO:
// 这里就能获取到我们调用相机拍照的照片了,但是这里又有一个问题就是当我们打开相机不拍照返回时默认会返回一个空白照片给我们原因是因为我们在调用相机一开始就已经创建了文件,但是这里只有文件名不存在图片,
Bitmap bitmap = getBitmapFromUri(_OutPutFileUri, getContext());
if (bitmap == null)
{
// 有路径没有图片
return;
}
// 有图片
// TODO something
break;
}
}
// 将Uri转换成Bitmap,从而判断用户有没有进行拍照(因为在打开相机时就默认创建了文件路径)
public static Bitmap getBitmapFromUri(Uri uri, Context mContext)
{
Bitmap bitmap = null;
try
{
// 读取uri所在的图片
bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);
}
catch (Exception e)
{
e.printStackTrace();
}
return bitmap;
}
// 解决小米在选在图片数据返回为null为题
public Uri getSelectAlbumUri(Intent intent) {
Uri uri = intent.getData();
String type = intent.getType();
if (uri.getScheme().equals("file") && (type.contains("image/"))) {
String path = uri.getEncodedPath();
if (path != null) {
path = Uri.decode(path);
ContentResolver cr = getActivity().getContentResolver();
StringBuffer buff = new StringBuffer();
buff.append("(").append(MediaStore.Images.ImageColumns.DATA).append("=")
.append("'" + path + "'").append(")");
Cursor cur = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.ImageColumns._ID },
buff.toString(), null, null);
int index = 0;
for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
index = cur.getColumnIndex(MediaStore.Images.ImageColumns._ID);
// set _id value
index = cur.getInt(index);
}
if (index == 0) {
// do nothing
} else {
Uri uri_temp = Uri
.parse("content://media/external/images/media/"
+ index);
if (uri_temp != null) {
uri = uri_temp;
}
}
}
}
return uri;
}
以上就是解决小米在拍照和选择系统相册数据的时候为null的情况处理。