安卓Q 裁剪图库选中图片

安卓裁剪图片,第一步要在AndroidManifest.xml写申请权限,如下:
  1. <!--* 读写外部存储-->  
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
  3. <!-- * 允许程序设置内置sd卡的写权限-->  
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
第一步还没完,除了申请权限,Android Q还需要在application加上下面一行
  1. android:requestLegacyExternalStorage="true"  
否则会引发Android权限问题,引发报错java.io.FileNotFoundException:open failed: EACCES (Permission denied),就算动态申请权限也不行。
第二步就是检查权限,然后打开图库,代码如下:
  1. //检查权限  
  2. String[] strPermissions = new String[]{  
  3.       Manifest.permission.WRITE_EXTERNAL_STORAGE, //外部存储写入权限  
  4. };  
  5. MPermissionUtils.requestPermissionsResult(UserFragment.this, REQUEST_EXTERNAL_STORAGE_CODE, strPermissions,      new MPermissionUtils.OnPermissionListener() {  
  6.   //权限通过回调  
  7.   @Override  
  8.   public void onPermissionGranted() {  
  9.        //做需要的事件  
  10.        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);  
  11.        intent.addCategory(Intent.CATEGORY_OPENABLE);//设置打开文件描述    
  12.        intent.setType("image/*");//告诉系统我要获取图片  
  13.        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  
  14.           //Android7.0及以上  
  15.           Uri uriForFile = FileProvider.getUriForFile(mActivityContext, "com.ts.takeaway.provider", mGalleryFile);  
  16.           intent.putExtra(MediaStore.EXTRA_OUTPUT, uriForFile);  
  17.           intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//写入  
  18.           intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//读取  
  19.           //启动界面,设置请求码  
  20.           startActivityForResult(intent, IMAGE_REQUEST_CODE_GE7);  
  21.        } else {  
  22.           //Android7.0以下  
  23.           intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mGalleryFile));  
  24.           startActivityForResult(intent, IMAGE_REQUEST_CODE);  
  25.        }  
  26.        dialog.dismiss();//关闭dialog  
  27.     }  
  28.   
  29.     //权限不通过的回调  
  30.     @Override  
  31.     public void onPermissionDenied() {  
  32.         //判断是否有永久拒绝的权限  
  33.         if (MPermissionUtils.hasAlwaysDeniedPermission(mActivityContext, strPermissions)) {  
  34.               MPermissionUtils.showTipsDialog(mActivityContext);  
  35.         } else {  
  36.               Toast.makeText(mActivityContext, "您拒绝了应用需要的权限,将无法在图库中选择头像。请再试一次,并同意权限。", Toast.LENGTH_LONG).show();  
  37.         }  
  38.      }  
  39.  });  
第三步在onActivityResult方法回调里面处理图库选中图片,然后打开裁剪,代码如下:
  1.      /** 
  2.      * 图片返回 
  3.      * 
  4.      * @param requestCode 
  5.      * @param resultCode 
  6.      * @param data 
  7.      */  
  8.     @Override  
  9.     public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {  
  10.         super.onActivityResult(requestCode, resultCode, data);  
  11.         if (resultCode == Activity.RESULT_OK && (data != null || requestCode == CAMERA_REQUEST_CODE)) {  
  12.             switch (requestCode) {  
  13.                 case IMAGE_REQUEST_CODE://版本<7.0  图库返回  
  14.                     //获取图片的全路径  
  15.                     Uri uri = data.getData();  
  16.                     Log.e("ImagUri===", uri.getPath());  
  17.                     //进行图像裁剪  
  18.                     startPhotoZoom(uri);  
  19.                     break;  
  20.                 case IMAGE_REQUEST_CODE_GE7://版本>= 7.0 图库返回  
  21.                     //获取文件路径  
  22.                     String strPath = GetImagePath.getPath(mActivityContext, data.getData());  
  23.                     if (Tools.isNotNull(strPath)) {  
  24.                         File imgFile = new File(strPath);  
  25.                         //通过FileProvider创建一个content类型的Uri  
  26.                         Uri dataUri = FileProvider.getUriForFile(mActivityContext, "com.gx.takeaway.provider", imgFile);    
  27.                         Log.e("imgFile===", dataUri.getPath());    
  28.                         //获取手机sd存储卡  
  29.                         File sd = Environment.getExternalStorageDirectory();  
  30.                         //获取sd存储卡是否可写  
  31.                         boolean can_write = sd.canWrite();  
  32.                         if (can_write) {  
  33.                             //打开图像裁剪  
  34.                             startPhotoZoom(dataUri);  
  35.                         }  
  36.                     } else {  
  37.                         Toast.makeText(mActivityContext, "选择图片失败", Toast.LENGTH_SHORT).show();  
  38.                     }  
  39.                     break;  
  40.                }  
  41.         }  
  42.     }  
最后就是打开裁剪,至此Android Q图库选中图片打开裁剪完成,打开裁剪代码如下:
  1.      /** 
  2.      * 图片裁剪 
  3.      * 
  4.      * @param uri 
  5.      */  
  6.     public void startPhotoZoom(Uri uri) {  
  7.         //裁剪后保存到文件中  
  8.         Uri cropFileUri = Uri.fromFile(mCropFile);  
  9.         UCrop uCrop = UCrop.of(uri, cropFileUri);//源文件url,裁剪后输出文件uri  
  10.         UCrop.Options options = new UCrop.Options();  
  11.         //设置裁剪图片可操作的手势  
  12.         options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);  
  13.         //是否能调整裁剪框  
  14.         options.setFreeStyleCropEnabled(false);  
  15.         uCrop.withOptions(options);  
  16.         //设置比例为1:1  
  17.         uCrop.withAspectRatio(11);  
  18.         //注意!!!Fragment中使用uCrop 必须这样,否则FragmentonActivityResult接收不到回调  
  19.         uCrop.start(mActivityContext, this);  
  20.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值