【问题标题】:FileProvider error文件提供程序错误
【发布时间】:2016-07-22 01:03:23
【问题描述】:

https://developer.android.com/training/camera/photobasics.html

我要做的就是用相机拍照,保存并在 ImageView 中显示。

我按照上面的 android 教程进行操作,但在线上不断收到错误(NullPointerException):

Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile);

我知道我需要在我的应用清单中配置 FileProvider 并且“权限”必须匹配。我不太明白应该在 authorities 参数中添加什么内容。我复制了教程中的所有代码,包括文件 res/xml/file_paths.xml。如有必要,请提出任何问题。

谢谢!

【问题讨论】:

  • 不,问题是关于如何使用 FileProvider,不一定是如何修复 NullPointer
  • 很高兴看到您相应地更新了标题。
  • Google 的本教程遇到了完全相同的问题。我已将提供程序的清单文件中的权限参数更改为“mypacketname.fileprovider”,并且在对 getUriForFile 的调用中也有完全匹配的字符串,但仍然得到 NPE 说:java.lang.NullPointerException:尝试调用虚拟空对象引用上的方法 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'

标签: android android-studio android-appwidget android-fileprovider


【解决方案1】:

我终于让它工作了!

请记住将提供程序标记放在清单文件中的应用程序标记内 - 这是我的错误(我的提供程序标记在应用程序标记之外),以及出现此错误的原因,基本上是说它找不到定义提供者的。

还要确保 .xml 文件中的路径正确。这是我的版本:

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

    <external-path
        name="my_images"   
        path="Android/data/org.projects.cameraapp/files/Pictures" />

</paths>

当然,您必须为自己的应用程序更改路径。

我的实际 Provider 如下所示:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="org.projects.cameraapp.fileprovider"          
    android:exported="false"
    android:grantUriPermissions="true">

    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />

</provider>

同样,您需要在自己的应用程序中更改权限值。

您可以从我的原始问题中查看 GitHub 存储库中的所有源代码。

【讨论】:

  • 我正在我的应用程序中生成一个文件,并希望将其发送到另一个应用程序进行保存。我在 android:resource 里面放什么 meta-data
【解决方案2】:

如果有人像我一样在 support.v4.content.FileProvider 上遇到困难,你可以用这个替换它。

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.camera.app.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths">

        </meta-data>
    </provider>

【讨论】:

    【解决方案3】:

    我也忘了把&lt;provider&gt;放在&lt;application&gt;里面;我错误地将它们放在了我已经修复的同一水平上。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="zm.mytestapplication">
    
    <application
        ...
        android:theme="@style/AppTheme">
    
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="zm.mytestapplication.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"></meta-data>
        </provider>
    </application>
    </manifest>
    

    file_paths.xml

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

    【讨论】:

    • 我们需要 Prebuild 文件夹还是它会创建自己的文件夹
    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多