1. 程式人生 > 其它 >Android 裁切踩坑

Android 裁切踩坑

Android 裁切圖片功能

  1. 動態申請許可權


    申請檔案的讀寫許可權


  2. Android 7以上適配FileProvider

    Android 7 以後,Android對檔案的保護變得十分嚴格,應用只有在呼叫自己的私有目錄時才不需要許可權,其他目錄都需要動態申請許可權。並且uri的建立不能再使用uri.fromFile();的方法,需要使用FileProvider的靜態方法進行建立。

    Uri out = FileProvider.getUriForFile()。

  3. 從系統圖庫選擇圖片

    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);
    
  4. 呼叫系統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);//裁剪時是否保留寬高比
    
  5. 兩種方法返回資料

    1. 通過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);
      
    2. 通過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);
      
  6. 圖片回顯

    同樣不能使用uri.fromFile();的方法獲取圖片,需要改成這種Uri out = FileProvider.getUriForFile()

    Uri out =FileProvider.getUriForFile(getApplicationContext(),"com.basicsdk.sdkdemo.provider", new File(photoPath));
    imageView.setImageURI(out);