Permission Denial: opening provider com.xxx.xxProvider from ProcessRecord equires that you obtain...

最近在做文件上传,满足断点续传,大致方案是文件选择器选择文件,存储文件的uri(转成string)到本地。如果文件没有上传完,则可以点击重新上传,重新上传只需要降之前的存储文件uri字符串转换回uri类,然后交给上传任务。这一切在比较老的系统版本上都没有问题,然后比较新的系统(如Android14)上却会发生致命错误,如下

AndroidRuntime: java.lang.SecurityException: Permission Denial: opening provider com.xxx.xxProvider from ProcessRecord{ce54c34 32178:com.xxx/u0a1588} (pid=32178, uid=11588) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs

报上面的错是发生在app重启后再去上传文件,这权限问题,需要在选择文件后获取的uri中对其中的intent做授权

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Uri selectedUri = data.getData();

    try {
        requireContext().getContentResolver().takePersistableUriPermission(selectedUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
    } catch (Exception e) {
        Logger.INSTANCE.e("grant permission err:", e);
    }

    ClipData clipData = data.getClipData();
    if (null != clipData) {
        for (int i = 0; i < clipData.getItemCount(); i++) {
            ClipData.Item itemAt = clipData.getItemAt(i);
            try {
                requireContext().getContentResolver().takePersistableUriPermission(itemAt.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION);
            } catch (Exception e) {
                Logger.INSTANCE.e("grant permission err:", e);
            }
        }
    }

}

授权后,即便是app重启,也能正常的上传文件

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容