在 Android 11 上,访问图库需要通过 MediaStore API 进行,而且需要配置添加读写权限。以下是一种解决方法,可以在 onActivityResult 回调中处理裁剪后的图片并保存到图库中:
// 定义一个请求码
private static final int REQUEST_CODE_PICK_IMAGE = 1001;
// 启动图库选择器
private void startImagePicker() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
}
// 处理图库选择器回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == RESULT_OK) {
Uri uri = data.getData();
if (uri != null) {
// 启动裁剪器进行裁剪
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);
intent.putExtra("scale", true);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 256);
intent.putExtra("outputY", 256);
intent.putExtra("return-data", false);
File file = createTempFile();
if (file != null) {
Uri outputUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE);
}
}
} else if (requestCode == REQUEST_CODE_CROP_IMAGE && resultCode == RESULT_OK) {
// 裁剪后的图片保存到图库中
File croppedImage = getTempFile();
try (InputStream inputStream = getContentResolver().openInputStream(Uri.fromFile(croppedImage))) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, croppedImage.getName());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if (uri != null) {
OutputStream outputStream = getContentResolver().open