当前位置: 首页 > 知识库问答 >
问题:

FileProvider在GetUriForFile上引发异常

苏彭薄
2023-03-14

我遵循了android开发者参考文件提供者上的示例代码,但它不起作用。

我已经在清单中的文件提供程序定义中设置了路径files/exports/,并且引用的文件确实存在于该路径中。

在我的清单中:

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

xml/file\u路径中。xml

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

然后我尝试用下面的代码获取内容uri:

Java.IO.File exportFile = 
    new Java.IO.File ("/data/data/com.company.app/files/exports/file.pdf"); 
Android.Net.Uri exportUri = 
    Android.Support.V4.Content.FileProvider.GetUriForFile (this, "com.company.app.fileprovider", exportFile);

但是我得到了这个错误:

Exception of type 'Java.Lang.NullPointerException' was thrown.
  at Android.Runtime.JNIEnv.CallStaticObjectMethod (IntPtr jclass, IntPtr jmethod, Android.Runtime.JValue[] parms) [0x00064] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.2-branch/4b53fbd0/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:1160 
  at Android.Support.V4.Content.FileProvider.GetUriForFile (Android.Content.Context context, System.String authority, Java.IO.File file) [0x00000] in <filename unknown>:0 
  at com.company.App.ImageAndSubtitle.cloudStorageDidDownloadFile (System.Object sender, com.company.App.CloudStorageEventArgs args) [0x001f7] in /app_path/Screens/ImageAndSubtitle.cs:187 
  --- End of managed exception stack trace ---
java.lang.NullPointerException
    at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:243)
    at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:217)
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:130)
    at mono.java.lang.RunnableImplementor.n_run(Native Method)
    at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:29)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4838)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:642)
    at dalvik.system.NativeStart.main(Native Method)

最新消息

从Android的源代码,我可以追捕到目前为止,因为我现在知道这个命令在android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:243)将失败并返回null

final ProviderInfo info = context.getPackageManager().resolveContentProvider(authority, PackageManager.GET_META_DATA);

但我不知道为什么。。。

共有3个答案

孟浩慨
2023-03-14

在我的例子中发生此错误是因为我向GetUriForFile的第二个参数传递了错误的包名。我使用了BuildConfig。已解析为android的包名称。支持不正确的多重索引。

司马萧迟
2023-03-14

在尝试设置文件提供商以获取设备上的PDF文件并通过电子邮件发送出去时,我也遇到了这个异常。阅读不同的答案-手动正确设置文件提供程序似乎有点复杂(至少这是第一次)。

最后,对我来说有效的是将这个例子中的组件复制到一个空的新项目中:https://github.com/IanDarwin/Android-Cookbook-Examples/tree/master/PdfShare

一旦我看到它在独立环境中工作,那么我就能够将更改引入到我的实际项目中。

具体来说,这里是要复制的文件:

1.AndroidManifest。xml—所有棘手的FileProvider配置都在这里

  • html" target="_blank">https://github.com/IanDarwin/Android-Cookbook-Examples/blob/master/PdfShare/AndroidManifest.xml

2.文件路径。xml—这是一个很小但很重要的组件。因此,有各种各样的答案放在那里,但只有从这个项目做了我的设置工作

  • https://github.com/IanDarwin/Android-Cookbook-Examples/blob/master/PdfShare/res/xml/file_paths.xml

3.主要活动。java—对应的java设置,用于处理清单中配置的内容;当然,不要忘记关联的布局文件

  • https://github.com/IanDarwin/Android-Cookbook-Examples/blob/master/PdfShare/src/main/java/com/example/pdfshare/MainActivity.java
司徒河
2023-03-14

我终于找到了关于如何在上创建ContentProviders和FileProviders的好示例代码https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider

我的代码中的实际错误是,在清单文件中,provider标记位于应用程序标记的外部,但它必须位于内部。清单必须如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.company.app">
<uses-sdk android:minSdkVersion="13" />

<permission
    android:name="com.company.app.fileprovider.READ"
    android:description="@string/perm_read"
    android:label="@string/perm_read_label"/>
<uses-permission android:name="com.company.app.fileprovider.READ"/>

<application android:label="MyApp">

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

</application>
<uses-permission android:name="android.permission.INTERNET" />

</manifest>
 类似资料:
  • 我正在尝试运行检查数据库并获得连接不存在错误!我在MySQL中有一个名为myapp的数据库以及其他数据库。 这是我的settings.py 项目结构: 这就是发生的情况: root @ IP-10-202-209-99:~/Desktop/my site # python manage.py inspectdb-database myapp trace back(最近一次调用last):< br

  • 问题内容: 是否有可能在Java 引用上创建方法引用的原因 ?这样做可能永远是不正确的,但是会导致错误,以后很难找到: 问题答案: 是否有可能在Java 引用上创建方法引用的原因 ? 不是 ,但是Eclipse在这方面显然存在一个错误(编辑:此问题已得到修复)。根据规范,当您使用JDK的工具时,它会失败,并且在线上会出现NPE 。 证明:http://ideone.com/APWXna(或编译和本

  • 我正尝试在类的方法中使用(以支持拖放)。我想显示我拖动的文件的导入进度。然而,它并不起作用。我不明白问题是什么,或者是什么引起的。 例外情况:

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 我正在使用Mojang API从Minecraft玩家的用户名返回UUID。此方法在参数(我们想要知道UUID的播放器的用户名)中接受一个字符串。为了使用API的resultat,我使用SimpleJSON库(将JSON结果解析为要返回的字符串)。 我的方法抛出2个检查过的异常:IOExeption和Parse异常,因为我想要。当错误的用户名(因此不存在用户名)时,API返回一个空JSON对象,在

  • 问题内容: 有没有一种优雅的方法来处理块中引发的异常? 例如: 如何避免在/ 在块? 问题答案: 我通常这样做: 别处: