【问题标题】:FileProvider throws exception on GetUriForFileFileProvider 在 GetUriForFile 上引发异常
【发布时间】:2014-02-21 10:06:58
【问题描述】:

我按照android developer reference on FileProviders 上的示例代码进行操作,但它不起作用。

我在 Manifest 的文件提供程序定义中设置了路径 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_paths.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>

然后我尝试使用以下代码获取 content-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);

但我不知道为什么......

【问题讨论】:

    标签: android uri android-fileprovider


    【解决方案1】:

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

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

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

    【讨论】:

    • @codingFriend1 我也有同样的错误,你可以帮我在stackoverflow中发布一个问题,这里是链接:stackoverflow.com/questions/26398255/…
    • 感谢您指出这一点。这是一个愚蠢的错误。有时我的大脑表现得很奇怪,我在做其他事情的同时看到了一些东西..
    • 在cordova的config.xml中更改应用程序名称后,我使用cordova-plugin-x-socialsharing发生了这种情况。我必须删除并重新安装插件才能使其正常工作
    • 这是金子。没注意到,谢谢指出。
    • 拯救了我的一天。我还需要file_paths.xml 中的&lt;root-path name="root" path="." /&gt;
    【解决方案2】:

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

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

    一旦我看到它在独立环境中运行,我就可以将更改引入到我的实际项目中。

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

    1. AndroidManifest.xml - 所有棘手的 FileProvider 配置都在哪里

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

    3. MainActivity.java - 相应的 Java 设置以使用清单中的配置;当然也不要忘记相关的布局文件

    【讨论】:

    • 我也遇到了一堆答案,但这个汇编是我找到的最接近的集合。我不得不做一些小的调整来适应 Xamarin.Android。谢谢!
    【解决方案3】:

    在我的情况下发生此错误是因为我将错误的包名称传递给GetUriForFile 的第二个参数。我使用 BuildConfig.PACKAGE_NAME 解析为 android.support.multidex 这是不正确的。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2018-08-21
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2012-04-17
    相关资源
    最近更新 更多