首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >FileProvider在GetUriForFile上抛出异常

FileProvider在GetUriForFile上抛出异常
EN

Stack Overflow用户
提问于 2014-02-21 18:06:58
回答 3查看 31.5K关注 0票数 25

我遵循了android developer reference on FileProviders上的示例代码,但它不起作用。

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

在我的清单中:

代码语言:javascript
复制
<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_paths.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="exports" path="exports/"/>
</paths>

然后,我尝试使用以下代码获取content-uri:

代码语言:javascript
复制
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);

然而,我得到了这个错误:

代码语言:javascript
复制
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.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:243)中的这个命令将失败并返回null

代码语言:javascript
复制
final ProviderInfo info = context.getPackageManager().resolveContentProvider(authority, PackageManager.GET_META_DATA);

但我不知道为什么..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-24 21:25:58

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

我代码中的实际错误是,在清单文件中,我将provider标记放在了application标记之外,但它必须在里面。清单必须如下所示:

代码语言:javascript
复制
<?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>
票数 36
EN

Stack Overflow用户

发布于 2018-01-05 05:05:24

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

最后,对我起作用的是将本例中的组件复制到一个空的新项目中:https://github.com/IanDarwin/Android-Cookbook-Examples/tree/master/PdfShare

一旦我看到它在单机版中工作,那么我就能够将更改引入到我的实际项目中。

具体地说,下面是要复制的文件:

1. AndroidManifest.xml -所有棘手的FileProvider配置

2. file_paths.xml -这是一个很小但很重要的组件。看着,所以有各种各样的答案放在那里,但是只有从这个项目为我做了设置工作

Java3.JavaSetup-用于处理清单中配置的内容的相应设置;当然,不要忘记相关的布局文件

票数 9
EN

Stack Overflow用户

发布于 2017-09-14 21:30:44

在我的例子中出现这个错误是因为我向GetUriForFile的第二个参数传递了一个不正确的包名。我使用了解析为android.support.multidex的BuildConfig.PACKAGE_NAME,这是不正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21931169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档