关于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
    评论
根据引用中提到的Android Q的文件存储机制修改,Android Q之后的版本将应用程序限制在自己的沙盒目录和公共媒体文件中进行访问,而无法直接操作非沙盒路径下的数据。引用中提到,Android Q提供了requestLegacyExternalStorage机制来帮助应用程序继续读写存储卡,但这是一个过渡期的解决方案。所以根据引用中给出的解决方法,如果您想在Android Q及以上版本中继续访问非沙盒路径下的数据,可以在AndroidManifest.xml文件的application标签中添加android:requestLegacyExternalStorage="true"来进行临时解决。因此,根据以上信息,storage/emulator/0/Android属于非沙盒路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [解决Android10读取不到/sdcard/、/storage/emulated/0/文件的问题](https://blog.csdn.net/a518618718/article/details/127777692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [处理Android SDK 29及以上版本,读取不到/storage/emulated/0/(/storage/sdcard/)路径下文件问题](https://blog.csdn.net/SDDY_xiao/article/details/121054399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值