FileProvider在GetUriForFile上抛出exception

我遵循FileProviders上的Android开发人员参考上的示例代码,但它不会工作。

我已经在我的Manifest中的文件提供者定义中设置了pathfiles/exports/ ,并且引用的文件确实存在于该path中。

在我的清单:

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

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

但我不知道为什么…

Solutions Collecting From Web of "FileProvider在GetUriForFile上抛出exception"

我终于find了如何在https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider上创buildContentProviders和FileProviders的很好的示例代&#x7801;

我的代码中的实际错误是,在Manifest文件中,我在application provider标记外有provider标记,但它必须在里面。 Manifest看起来像这样:

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

这个错误发生在我的情况下,因为我已经传递了错误的包名称到GetUriForFile的第二个参数。 我用BuildConfig.PACKAGE_NAME解决了android.support.multidex的错误。