关于Android11图片沙盒适配的问题

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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值