FileProvider создает исключение для GetUriForFile
Я следовал примеру кода наAndroid Developer reference on FileProviders , но это не сработает.
Я установил путь 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);
Но я понятия не имею почему...3 ответа:
Наконец-то я нашел хороший пример кода о том, как создавать ContentProviders и FileProviders на https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider
Фактическая ошибка в моем коде заключалась в том, что в файле манифеста у меня был тег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>
Пытаясь настроить FileProvider для получения PDF-файла, который находится на устройстве, и возможности отправить его по электронной почте, я также столкнулся с этим исключением. Чтение различных ответов там-это кажется немного сложным, чтобы правильно настроить FileProvider вручную (по крайней мере, в этот первый раз).
Наконец, то, что сработало для меня, было скопировать компоненты из этого примера в пустой новый проект: https://github.com/IanDarwin/Android-Cookbook-Examples/tree/master/PdfShare
Как только я вижу, что он работает в автономном режиме, я могу внести изменения в свой реальный проект.
В частности, вот файлы для репликации:
1. AndroidManifest.xml - где все хитрые настройки FileProvider is
2. путь к файлу.xml - Это небольшой, но важный компонент. Глядя на так есть множество ответов на то, что положить туда, однако только из этого проекта была создана работа для я
3. Основная активность.java - соответствующая настройка Java для работы с тем, что настроено в манифесте; и, конечно, не забудьте о соответствующем макете файл