解決小米miui系統調用系統裁剪圖片功能camera.action.CROP后崩潰、重新打開app的問題、無法獲取裁剪圖片


選擇相冊圖片(或調用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.}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM