最近在做文件上传,满足断点续传,大致方案是文件选择器选择文件,存储文件的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重启,也能正常的上传文件