FileProvidersの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_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);
_
しかし、私には理由がわかりません...
https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider でContentProvidersとFileProvidersを作成する方法の良いサンプルコードを見つけました
私のコードの実際のエラーは、マニフェストファイルでは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>
デバイス上にあるPDFファイルを取得し、それをメールで送信できるようにするためにFileProviderをセットアップしようとすると、この例外も発生しました。 FileProviderを手動で正しくセットアップするのは少し複雑に思えます(少なくとも今回は初めて)。
最後に私のために働いたのは、この例のコンポーネントを空の新しいプロジェクトにコピーすることでした: https://github.com/IanDarwin/Android-Cookbook-Examples/tree/master/PdfShare
スタンドアロンで動作していることが確認できたら、実際のプロジェクトに変更を取り込むことができます。
具体的には、複製するファイルは次のとおりです。
1。 AndroidManifest.xml-ここですべてのトリッキーなFileProvider構成は
2。 file_paths.xml-これは小さくても重要なコンポーネントです。探しているSOそこに何を置くかについてはさまざまな答えがありますが、このプロジェクトからのみ私のためにセットアップ作業を行いました
3。 MainActivity.Java-対応するJavaマニフェストで設定されたもので動作するようにセットアップします;もちろん、忘れないでください関連するレイアウトファイル
私の場合、GetUriForFile
の2番目のパラメーターに誤ったパッケージ名を渡したため、このエラーが発生しました。 BuildConfig.PACKAGE_NAME
を使用しましたが、これはAndroid.support.multidexに解決されましたが、これは正しくありません。