在Android 10中,无法直接访问应用程序之外的公共存储的图像文件。因此,必须先将图像文件复制到应用程序内部存储中,然后再使用Picasso加载该图像。同时,为了正确旋转图像,需要使用ExifInterface获取图像的方向,并将其应用于Picasso。以下是解决该问题的代码示例:
String filePath = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues).toString();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// Copy the image to the app's internal storage
ContentResolver resolver = getContext().getContentResolver();
try (InputStream is = resolver.openInputStream(uri)) {
FileOutputStream os = getContext().openFileOutput("temp_image", Context.MODE_PRIVATE);
FileUtils.copy(is, os);
}
// Load the image with Picasso and apply the correct rotation
File file = new File(getContext().getFilesDir(), "temp_image");
ExifInterface exif = new ExifInterface(file.getPath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
Picasso.get()
.load(file)
.rotate(getRotationForImage(orientation))
.into(imageView);
} else {
Picasso.get()
.load(uri)
.into(imageView);
}
// Helper method to get the correct rotation angle
private static float getRotationForImage(int orientation) {
float rotate = 0;
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
return rotate;
}