一、问题现象
在小米手机选择相册图片-裁剪后发现拿不到图片 展示不出来,通过debug发现小米手机上的Intent返回了空
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
二、问题解决
因此小米手机的相册选择图片需要进行特殊处理
/**
* 小米
*
* @param intent
* @return
*/
public Uri getPictureUri(android.content.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 = this.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;
}
private void reSizeImage(Uri uri) {//重新剪裁图片的大小
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
/**
* 此方法返回的图片只能是小图片(sumsang测试为高宽160px的图片)
* 故只保存图片Uri,调用时将Uri转换为Bitmap,此方法还可解决miui系统不能return data的问题
*/
//intent.putExtra("return-data", true);
//裁剪后的图片Uri路径,uritempFile为Uri类变量
photoURI = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, REQUEST_SMALL_IMAGE_CUTTING);
}
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 回调成功 if (resultCode == RESULT_OK) { switch (requestCode) { // 小图切割 case REQUEST_SMALL_IMAGE_CUTTING: // 小米手机需要特殊适配 if (GmConstant.PHONE_XIAOMI.equals(android.os.Build.MANUFACTURER) || GmConstant.PHONE_VIVO.equals(android.os.Build.MANUFACTURER) || Build.VERSION.SDK_INT > 24) { try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(photoURI)); // 缩放图片大小 Bitmap resetSaveBitmap = Bitmap.createScaledBitmap(bitmap, 960, 1280, true); Uri uriPath = BitmapUtil.saveAlbum(MainActivity.this, resetSaveBitmap, Bitmap.CompressFormat.JPEG, 100, true); String imgpath = GmUriToPathUtil.getRealFilePath(MainActivity.this, uriPath); Intent intent = new Intent(MainActivity.this, TakeFaceActivity.class); intent.putExtra("facePath", imgpath); startActivity(intent); } catch (FileNotFoundException e) { e.printStackTrace(); } } else { if (data != null) { setPicToView(data); } } break; // 相册选取 case REQUEST_IMAGE_GET: // 小米的相册选择比较特殊、需要适配 if (GmConstant.PHONE_XIAOMI.equals(android.os.Build.MANUFACTURER) || GmConstant.PHONE_VIVO.equals(android.os.Build.MANUFACTURER) || Build.VERSION.SDK_INT > 24) { photoURI = getPictureUri(data); reSizeImage(photoURI); } else { try { photoURI = data.getData(); startSmallPhotoZoom(photoURI); } catch (NullPointerException e) { e.printStackTrace(); } } break; default: break; } } }
通过以上方式进行小米手机的图片获取