本文共 5249 字,大约阅读时间需要 17 分钟。
一、问题现象
在小米手机选择相册图片-裁剪后发现拿不到图片 展示不出来,通过debug发现小米手机上的Intent返回了空
@Overridepublic 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; } } }
通过以上方式进行小米手机的图片获取
转载地址:http://dyvef.baihongyu.com/