1、Android10是需要使用沙盒访问图片, 使用File是不能访问的;
2、Android11又恢复了File访问;
3、我们使用android:requestLegacyExternalStorage=“true”,这样子Android10和11都可以使用File访问;
4、我们把所有图片保存到Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)目录下;
5、保存图片到相册,version大于30时,把原图片拷贝一份保存到相册,代码如下:
@RequiresApi(api = Build.VERSION_CODES.R)
public static File saveImageWithAndroidR(Context context, File sourceFile, String saveFileName) {
OutputStream os = null;
File file = null;
BufferedInputStream inputStream = null;
try {
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, “文件名”);
values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
//Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)--不能使用这个
//Environment.DIRECTORY_PICTURES--要使用这个
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
ContentResolver contentResolver = context.getContentResolver();
Uri insertUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
inputStream = new BufferedInputStream(new FileInputStream(sourceFile));
if (insertUri != null) {
os = contentResolver.openOutputStream(insertUri);
}
if (os != null) {
byte[] buffer = new byte[1024 * 4];
int len;
while ((len = inputStream.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.flush();
}
file = new File(PhotoTools.imageUri2Path(context, insertUri));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return file;
}
然后使用如下方法,可以获取到图片Url:
public static String imageUri2Path(Context context, Uri uri) {
if (null == uri) return null;
String[] filePathColumns = new String[]{MediaStore.Images.Media.DATA};
Cursor c = context.getContentResolver().query(uri, filePathColumns, null, null, null);
String picturePath = null;
if (null != c && c.moveToFirst()) {
int columnIndex = c.getColumnIndex(filePathColumns[0]);
picturePath = c.getString(columnIndex);
}
if (null != c) {
c.close();
}
return picturePath;
}
保存到相册要区分版本:
if (Build.VERSION.SDK_INT >= 30) {
File newFile = saveImageWithAndroidR(context, sourceFile, name);
} else {
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(sourceFile);
intent.setData(uri);
context.sendBroadcast(intent);
}