1. 程式人生 > >Android FileProvider配置報錯android.content.pm.ProviderInfo.loadXmlMetaData問題

Android FileProvider配置報錯android.content.pm.ProviderInfo.loadXmlMetaData問題

專案中配置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))