Android10调用系统剪裁时的一个小问题
Posted hiperion
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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键退出。
暂时不知道原因,先记录下来,再研究吧
以上是关于Android10调用系统剪裁时的一个小问题的主要内容,如果未能解决你的问题,请参考以下文章
Android调用系统的图片剪裁,剪裁框大小能设置吗?outputX和outputY不是
Android7.0调用系统相机拍照读取系统相册照片+CropImageView剪裁照片
Android 路径(Path)与剪裁(Clipping)详解
安卓开发 第八篇 我的安卓应用架构设计-----图片选择以及剪裁
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )(代码片