背景
在升級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é)可以接著看