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

最近在做文件上傳,滿足斷點(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重啟,也能正常的上傳文件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容