選擇相冊圖片(或調用MediaStore.ACTION_IMAGE_CAPTURE拍照),然后裁剪。在其他系統上都測試正常,但是在小米上出現了問題。小米2s上,裁剪后點擊確定直接卡死系統;小米3上,裁剪后點擊確定直接回到主界面,相當於重新打開app。就是說,裁剪后,無法響應onActivityResult(),裁剪方法如下: [java] view plain copy 01./** 02. * 裁剪圖片 03. */ 04.private void startPhotoZoom(Uri uri, int size) { 05. Intent intent = new Intent("com.android.camera.action.CROP"); 06. intent.setDataAndType(uri, "image/*"); 07. // crop為true是設置在開啟的intent中設置顯示的view可以剪裁 08. intent.putExtra("crop", "true"); 09. 10. // aspectX aspectY 是寬高的比例 11. intent.putExtra("aspectX", 1); 12. intent.putExtra("aspectY", 1); 13. 14. // outputX,outputY 是剪裁圖片的寬高 15. intent.putExtra("outputX", size); 16. intent.putExtra("outputY", size); 17. intent.putExtra("return-data", true); 18. 19. startActivityForResult(intent, PHOTO_REQUEST_CUT); 20.} 上述方法中,裁剪后的圖片通過Intent的putExtra("return-data",true)方法進行傳遞,miui系統問題就出在這里,return-data的方式只適用於小圖,miui系統默認的裁剪圖片可能裁剪得過大,或對return-data分配的資源不足,造成return-data失敗。 解決思路是:裁剪后,將裁剪的圖片保存在Uri中,在onActivityResult()方法中,再提取對應的Uri圖片轉換為Bitmap使用。 其實大家直觀也能感覺出來,Intent主要用於不同Activity之間通信,是一種動態的小巧的資源占用,類似於Http請求中的GET,並不適用於傳遞圖片之類的大數據。於是當A生成一個大數據要傳遞給B,往往不是通過Intent直接傳遞,而是在A生成數據的時候將數據保存到C,B再去調用C,C相當於一個轉換的中間件。 [java] view plain copy 01./** 02. * 裁剪圖片 03. */ 04.private void startPhotoZoom(Uri uri, int size) { 05. Intent intent = new Intent("com.android.camera.action.CROP"); 06. intent.setDataAndType(uri, "image/*"); 07. // crop為true是設置在開啟的intent中設置顯示的view可以剪裁 08. intent.putExtra("crop", "true"); 09. 10. // aspectX aspectY 是寬高的比例 11. intent.putExtra("aspectX", 1); 12. intent.putExtra("aspectY", 1); 13. 14. // outputX,outputY 是剪裁圖片的寬高 15. intent.putExtra("outputX", size); 16. intent.putExtra("outputY", size); 17. 18. /** 19. * 此方法返回的圖片只能是小圖片(sumsang測試為高寬160px的圖片) 20. * 故將圖片保存在Uri中,調用時將Uri轉換為Bitmap,此方法還可解決miui系統不能return data的問題 21. */ 22. //intent.putExtra("return-data", true); 23. 24. //uritempFile為Uri類變量,實例化uritempFile 25. uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg"); 26. intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile); 27. intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 28. 29. startActivityForResult(intent, PHOTO_REQUEST_CUT); 30.} 然后在onActivityResult()中處理: [java] view plain copy 01./** 02. * 處理返回結果 03. */ 04.@Override 05.protected void onActivityResult(int requestCode, int resultCode, Intent data) { 06. // TODO Auto-generated method stub 07. case PHOTO_REQUEST_CUT: 08. //將Uri圖片轉換為Bitmap 09. Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uritempFile)); 10. //TODO,將裁剪的bitmap顯示在imageview控件上 11. break; 12. } 13. super.onActivityResult(requestCode, resultCode, data); 14.}