android呼叫系統圖片剪裁,相容小米
阿新 • • 發佈:2019-02-07
public void cropPhoto(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類變數 uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); startActivityForResult(intent, PHOTO_CUT); } 這樣呼叫系統時完全沒問題了,小米的return-data也解決了。但是呼叫系統照相後馬上呼叫剪裁報錯打不開圖片。 測試多個機型都行,就是小米的不行。 最後發現問題。這裡的uri必須是content:// 的uri file:// 的uri是不行的。 必須轉換一下就行了。 另附上fiel Uri 轉換成 content Uri的程式碼
public static Uri getImageContentUri(Context context, File imageFile) { String filePath = imageFile.getAbsolutePath(); Cursor cursor = context.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ", new String[]{filePath}, null); if (cursor != null && cursor.moveToFirst()) { int id = cursor.getInt(cursor .getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + id); } else { if (imageFile.exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, filePath); return context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { return null; } } }