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