Android10调用系统剪裁时的一个小问题

直接上代码:

剪裁方法

public static Intent crop(Activity activity, Uri uri, int w, int h, int aspectX, int aspectY) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        if (aspectX != 0 && aspectX == aspectY) {
            /*宽高比例相同时,华为设备的系统默认裁剪框是圆形的,这里统一改成方形的*/
            if (Build.MANUFACTURER.equals("HUAWEI")) {
                aspectX = 9998;
                aspectY = 9999;
            }
        }
        if (w != 0 && h != 0) {
            intent.putExtra("outputX", w);
            intent.putExtra("outputY", h);
        }
        if (aspectX != 0 || aspectY != 0) {
            intent.putExtra("aspectX", aspectX);
            intent.putExtra("aspectY", aspectY);
        }

        /*解决图片有黑边问题*/
        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true);
        //++++++++++++++注意这一句+++++++++++++++
        cropPictureTempUri = createImagePathUri(activity);
        //++++++++++++++注意这一句+++++++++++++++
        BsFileUtil.grantUriPermission(activity, intent, cropPictureTempUri, true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, cropPictureTempUri);
        //输出路径(裁剪后的保存路径)
        //        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        // 输出格式
        intent.putExtra("outputFormat", "JPEG");
        // 不启用人脸识别
        intent.putExtra("noFaceDetection", true);
        //是否将数据保留在Bitmap中返回
        intent.putExtra("return-data", false);
        return intent;
    }

剪裁时创建临时文件的方法:

public static Uri createImagePathUri(Activity activity) {
        Uri resultUri;
        //适配 Android Q
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            String displayName = String.valueOf(System.currentTimeMillis());
            ContentValues values = new ContentValues(2);
            values.put(MediaStore.Images.Media.DISPLAY_NAME, displayName);
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
            //这样写会导致Android10上拍照后剪裁界面无按钮
            //values.put(MediaStore.Images.Media.MIME_TYPE, "image/*");

            //values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
            //SD 卡是否可用,可用则用 SD 卡,否则用内部存储
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                resultUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            } else {
                resultUri = activity.getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
            }
        } else {
            String pathName = new StringBuffer().append(getExtPicturesPath()).append(File.separator)
                    .append(System.currentTimeMillis()).append(".jpg").toString();
            File file = new File(pathName);
            resultUri = AndPermission.getFileUri(activity, file);
        }
        return resultUri;
    }

如果在这一句values.put(MediaStore.Images.Media.MIME_TYPE, "image/");中使用 image/,则会导致在Android10上调用剪裁方法后,只显示图片,没有剪裁框也没有任何按钮。只能按返回键或home键退出。
暂时不知道原因,先记录下来,再研究吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
调用系统剪裁功能,你需要使用 Android 的 Intent API,具体步骤如下: 1. 创建 Intent 对象,设置 Action 为 Intent.ACTION_PICK, Data 为 MediaStore.Images.Media.EXTERNAL_CONTENT_URI。 ```java Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ``` 2. 调用 startActivityForResult() 方法,将 Intent 对象传入,并传入一个请求码,以便在 onActivityResult() 方法中识别结果。 ```java startActivityForResult(intent, REQUEST_CODE); ``` 3. 在 onActivityResult() 方法中获取剪裁后的图片。 ```java @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) { if (data != null) { Uri uri = data.getData(); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); intent.putExtra("return-data", true); startActivityForResult(intent, CROP_REQUEST_CODE); } } else if (resultCode == RESULT_OK && requestCode == CROP_REQUEST_CODE) { if (data != null) { Bundle bundle = data.getExtras(); if (bundle != null) { Bitmap bitmap = bundle.getParcelable("data"); imageView.setImageBitmap(bitmap); } } } } ``` 在这段代码中,我们首先检查是否成功返回结果,并检查 requestCode 是否与我们之前传入的 requestCode 匹配。如果匹配,我们从 Intent 中获取返回的 Uri,并使用它来创建另一个 Intent 对象,用于调用剪裁功能。在这个 Intent 对象中,我们设置了剪裁的相关参数,包括裁剪后的宽度和高度。最后,我们再次调用 startActivityForResult() 方法,以便在 onActivityResult() 方法中处理剪裁后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值