Android 裁切踩坑
阿新 • • 發佈:2022-03-17
Android 裁切圖片功能
-
動態申請許可權
申請檔案的讀寫許可權
-
Android 7以上適配FileProvider
Android 7 以後,Android對檔案的保護變得十分嚴格,應用只有在呼叫自己的私有目錄時才不需要許可權,其他目錄都需要動態申請許可權。並且uri的建立不能再使用
uri.fromFile();
的方法,需要使用FileProvider的靜態方法進行建立。Uri out = FileProvider.getUriForFile()。
-
從系統圖庫選擇圖片
Intent intent = new Intent(Intent.ACTION_PICK,null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*"); activity.startActivityForResult(intent, BasicSDK.REQUEST_CUT_IMAGE_CAPTURE);
-
呼叫系統CROP方法進行裁切
android系統有圖片裁切的方法,需要通過intent進行呼叫。
Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*");//設定要處理的圖片資源 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);// 這兩句是在7.0以上版本 intent.putExtra("crop", "true"); intent.putExtra("aspectX", ox);//裁切框的比例 intent.putExtra("aspectY", oy); intent.putExtra("outputX", x);//輸出圖片的寬高畫素數 intent.putExtra("outputY", y); intent.putExtra("scale", true);//裁剪時是否保留寬高比
-
兩種方法返回資料
-
通過return-data返回資料
通過return-data返回資料時需要將return-data設定為true,之後裁切後的資料會通過intent返回到回撥函式中。
intent.putExtra("return-data", true); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//輸出格式 intent.putExtra("noFaceDetection", true); // 取消人臉識別 intent = Intent.createChooser(intent, "裁剪圖片"); activity.startActivityForResult(intent, BasicSDK.REQUEST_CUT_IMAGE);
-
通過MediaStore.EXTRA_OUTPUT返回資料
將return-data設定為false之後,裁切到的圖片會儲存到自定義的地址。
intent.putExtra("return-data", false); Uri out = FileProvider.getUriForFile(activity,"com.basicsdk.sdkdemo.provider", new File(getSave_file()));//這裡不能用這種方法建立uri,否則會報錯,不理解 String save_file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath()+"/save_"+UUID.randomUUID().toString()+".jpg";//自定義儲存地址,這裡需要將檔案的儲存地址定義到公共目錄中,不能放到應用的私有目錄,否則會儲存不了,因為一般情況下只有應用本身能訪問自己的私有目錄。 setSave_file(save_file);//忽略 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(save_file)));//儲存地址 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); // 取消人臉識別 intent = Intent.createChooser(intent, "裁剪圖片"); activity.startActivityForResult(intent, BasicSDK.REQUEST_CUT_IMAGE);
-
-
圖片回顯
同樣不能使用
uri.fromFile();
的方法獲取圖片,需要改成這種Uri out = FileProvider.getUriForFile()
Uri out =FileProvider.getUriForFile(getApplicationContext(),"com.basicsdk.sdkdemo.provider", new File(photoPath)); imageView.setImageURI(out);