最近在做文件上傳逻淌,滿足斷點續(xù)傳肥惭,大致方案是文件選擇器選擇文件,存儲文件的uri(轉(zhuǎn)成string)到本地紊搪。如果文件沒有上傳完务豺,則可以點擊重新上傳,重新上傳只需要降之前的存儲文件uri字符串轉(zhuǎn)換回uri類嗦明,然后交給上傳任務笼沥。這一切在比較老的系統(tǒng)版本上都沒有問題,然后比較新的系統(tǒng)(如Android14)上卻會發(fā)生致命錯誤娶牌,如下
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
報上面的錯是發(fā)生在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重啟汹桦,也能正常的上傳文件