最近在做文件上傳,滿足斷點(diǎn)續(xù)傳,大致方案是文件選擇器選擇文件,存儲文件的uri(轉(zhuǎn)成string)到本地。如果文件沒有上傳完,則可以點(diǎn)擊重新上傳,重新上傳只需要降之前的存儲文件uri字符串轉(zhuǎn)換回uri類,然后交給上傳任務(wù)。這一切在比較老的系統(tǒng)版本上都沒有問題,然后比較新的系統(tǒng)(如Android14)上卻會(huì)發(fā)生致命錯(cuò)誤,如下
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
報(bào)上面的錯(cuò)是發(fā)生在app重啟后再去上傳文件,這權(quán)限問題,需要在選擇文件后獲取的uri中對其中的intent做授權(quán)
@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);
}
}
}
}
授權(quán)后,即便是app重啟,也能正常的上傳文件