Failed to find configured root that contains xxxx 的一次踩坑之旅

背景

在升級targetSDK的時候,應(yīng)用崩潰并拋出:

Failed to find configured root that contains xxxx

但是,由于網(wǎng)上資料與博客眾多,這一篇文章并不是講述如何使用FileProvider向外傳送內(nèi)部Uri,并且實際尚,我已經(jīng)對應(yīng)用進(jìn)行了一次FileProvider的改造,我也不想再撰寫重復(fù)的教程來指導(dǎo)你如何改造,所以這篇文章只是一次填坑之旅的記錄而已。

先描述崩潰的背景:

崩潰發(fā)生在調(diào)用攝像頭試圖拍照的時候,向攝像機(jī)的Intent傳遞了一個內(nèi)部的Uri。當(dāng)然我們知道,這個如果沒經(jīng)過FileProvider的處理,確實會發(fā)生崩潰,但是,其實我已經(jīng)對這部分做了FileProvider的處理了。有一點稍微特殊的是,我們的圖片選擇器是作為庫的形式編譯到我們的主工程中的(就是圖片選擇庫是在gradle中引入的)。
而在升級targetSDK的時候,我已經(jīng)對這個庫做了升級處理,在單獨運(yùn)行這個庫(這個庫帶一個簡易的運(yùn)行app殼)的時候,能正常運(yùn)行。

出事的代碼:

cameraPath = cameraFile.getAbsolutePath();
Uri uri = ImagePickerFileProvider.getUriForFile(activity, "com.xxxx.xxx.xx.x", cameraFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
activity.startActivityForResult(cameraIntent, ImageSelectorActivity.REQUEST_CAMERA);

Manifest:

<provider
            android:name=".xxx.ImagePickerFileProvider"
            android:authorities="com.xxxx.xxx.xx.x"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />

        </provider>

and provider_paths.xml :

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <cache-path
        name="tmp"
        path="tmp/" />

    <external-path
        name="imagePick"
        path="xxx/"/>

</paths>

(以上xxx為信息隱藏)

一切都非常地正確,而且在殼app(也就是圖片選擇庫自帶一個運(yùn)行app)上確實能運(yùn)行正常,一到了主app上運(yùn)行就崩潰。而且這里的external-path的配置確實沒有問題,出事的文件路徑也是

Environment.getExternalStorageDirectory() + "xxx"

解決方案

先公布我的解決方案吧,讓著急著找解決方案的朋友先把問題解決了:
在我的主app中,也定義了一個FileProvider(后稱AppFileProvider),而AppFileProvider的paths配置文件名也是 provider_paths.xml,在項目編譯的時候,圖片選擇器庫的provider_paths.xml文件被主工程的provider_paths.xml給覆蓋了,導(dǎo)致庫工程的FileProvider的配置失效,那么在 xxx目錄下的文件的FileProvider轉(zhuǎn)換自然也就會失敗了。
所以最終我的解決方案是:所有FileProvider的xml配置文件都單獨命名,不使用同一個名字
同時我也建議各位在使用FileProvider的時候,新創(chuàng)建一個類來繼承FileProvider并注冊到Manifest,同時在配置xml文件時,也使用唯一的命名。

Ps,附一篇 編譯時替換資源 - Android重疊包與資源合并一見 ,有需要的同學(xué)可以接著看

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

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

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