Android FileProvider配置報錯android.content.pm.ProviderInfo.loadXmlMetaData問題
阿新 • • 發佈:2019-02-10
專案中配置FileProvider,執行報錯android.content.res.XmlResourceParser錯誤。
ava.lang.NullPointerException: Attempt to invoke virtual method
'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:583)
at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:557)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:399)
Debug除錯
根據報錯的程式碼,最後鎖定在FileProvider#parsePathStrategy()中,其原始碼如下:
private static PathStrategy parsePathStrategy(Context context, String authority)
throws IOException, XmlPullParserException {
final SimplePathStrategy strat = new SimplePathStrategy(authority);
final ProviderInfo info = context.getPackageManager()
.resolveContentProvider(authority, PackageManager.GET_META_DATA);
final XmlResourceParser in = info.loadXmlMetaData(
context.getPackageManager(), META_DATA_FILE_PROVIDER_PATHS);
if (in == null) {
throw new IllegalArgumentException(
"Missing " + META_DATA_FILE_PROVIDER_PATHS + " meta-data");
}
// ............
return strat;
}
debug除錯發現,原始碼中的info物件為空,因此推斷出authority有問題,沒有找到。既然authority不存在,肯定是配置有問題。
查詢配置
先檢視AndroidManifest.xml中FileProvider配置:
<!-- FileProvider配置訪問路徑,適配7.0及其以上 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
在檢視呼叫時候,在 FileProvider.getUriForFile()中傳入的authorities:
FileProvider.getUriForFile(context.getApplicationContext(), BuildConfig.APPLICATION_ID+".provider",new File(picturePath))
這就奇怪了,感覺沒錯呀。 這時候,很大可能就是匯入BuildConfig錯誤了,檢視匯入包。
package xingencom.easypermissiondemo.utils;
import android.support.v4.BuildConfig;
果然如此,錯誤匯入v4包下的BuildConfig。這導致配置的authority與傳入的authority不一樣,當然會報錯的啦。
正確的做法:
匯入自己專案的包下的BuildConfig。
//匯入自己專案的包
import com.xingen.easypermissiondemo.BuildConfig;
FileProvider.getUriForFile(context.getApplicationContext(), BuildConfig.APPLICATION_ID+".provider",new File(picturePath))