【问题标题】:FileProvider NPE null object referenceFileProvider NPE 空对象引用
【发布时间】:2017-12-02 18:11:34
【问题描述】:

您好,由于 FileProvider 导致 NPE,我目前在启动 Intent 时遇到错误。我按照here 提供的步骤操作,但仍然出现错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

我也不确定这里是否使用了 provider_paths.xml。到目前为止,这是我的代码:

清单:

<application>... <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></application>

res/xml:

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

代码:

Uri uri=FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID+".provider", file);

这里似乎是错误的原因。

【问题讨论】:

  • 我不知道为什么我对这个问题投了反对票。我知道有些人会说这是重复的,但我已经检查了我可以在此处找到的每个解决方案,并且都说相同。现在我选择只使用: StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build());可悲的事情SO社区。 :(

标签: android android-fileprovider


【解决方案1】:

BuildConfig.APPLICATION_ID 应该返回您的包名,但是,在我的情况下它返回“android.support.v4”。我考虑使用 getPackagename() ,它会工作得很好!

所以改变

FileProvider.getUriForFile(this,
                            BuildConfig.APPLICATION_ID + ".provider", file);

到:

FileProvider.getUriForFile(this,
                            getPackagename() + ".provider", file);

【讨论】:

    【解决方案2】:

    请参阅此链接以获取答案。 enter link description here

    首先,这个:

    android:authorities="${applicationId}.fileprovider"
    

    你正在使用这个:

    FileProvider.getUriForFile(this,
                                BuildConfig.APPLICATION_ID + ".provider", file);
    

    这个:

    FileProvider.getUriForFile(this,
                                BuildConfig.APPLICATION_ID + ".fileprovider", file);
    

    由于我不知道你真正想要的是哪一个,所以我无法建议修复。

    【讨论】:

      【解决方案3】:

      我正在使用这个:

      清单:

      <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>
      

      XML 文件:

      <paths xmlns:android="http://schemas.android.com/apk/res/android">
          <external-path name="media_folder" path="." />
      </paths>
      

      在 Java 中:

      FileProvider.getUriForFile(this,
                                      BuildConfig.APPLICATION_ID + ".provider", file);
      

      【讨论】:

      • 可悲的是,它和我用的一样。
      • 很高兴听到这个消息,但这不适合我。我正在使用支持 Android N 的设备
      • 它仅在 android n 中有用。请尝试使用此
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多