解決小米miui系統呼叫系統裁剪圖片功能崩潰失敗的問題
阿新 • • 發佈:2019-01-29
專案中選擇圖片作為頭像,都要經過剪裁的過程。一般我們都呼叫系統剪裁的方法。不過該方法在其它系統上都顯示正常,但是在miui系統上就出錯了。經測試發現其他系統
cropBitmap = data.getParcelableExtra("data");
方法都是有值的,而miui系統卻沒有。查資料發現miui系統預設的裁剪圖片可能裁剪得過大,或對return-data分配的資源不足,造成return-data失敗。
失敗的剪裁方法如下:
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", 200); intent.putExtra("outputY", 200); intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString()); intent.putExtra("noFaceDetection", true); intent.putExtra("return-data", true); startActivityForResult(intent, REQUE_CODE_CROP);
解決方案:
剪裁後儲存資源路徑uri,在onActivityResult()方法中再提取uri圖片轉化成bitmap即可。
修改後的方法如下:
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", 200); intent.putExtra("outputY", 200); intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString()); intent.putExtra("noFaceDetection", true); /** * 此方法返回的圖片只能是小圖片(sumsang測試為高寬160px的圖片) * 故只儲存圖片Uri,呼叫時將Uri轉換為Bitmap,此方法還可解決miui系統不能return data的問題 */ // intent.putExtra("return-data", true); uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile); startActivityForResult(intent, REQUE_CODE_CROP);
try { cropBitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(uritempFile)); } catch (FileNotFoundException e) { e.printStackTrace(); }
好了,這樣就解決了,如果有更好的方法歡迎留言!