質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

769閲覧

XamarinにおけるFileUriExposedExceptionエラーの回避法をお教えください。

AoYaJi

総合スコア13

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2019/03/21 16:27

Visual Studio Community 2017/ Xamarinを使用。アプリ内で作成・保存したテキストファイルをメールに添付して送信するシステムを作っています。
Android7では、アプリでファイルを作成して、Gmailに添付するなどの処理を行おうとすると、FileUriExposedExceptionエラーが発生します。この問題をクリアするために、AndroidManifest.xmlにproviderの定義を、res/xml/filepaths.xmlに使用するパスを設定し、file:// uriをcontent:// uriに置き換えることによって、これらの問題をクリアしている報告を目にします。しかし、これらのサイトの情報はAndroid Studio上でJavaで書かれたコードです。Xamarinによる報告は見当たりません。私なりに下のようなコードを考えましたが、エラーになります。
よろしくアドバイスをお願いします。

参考:
https://codeday.me/jp/qa/20181212/63613.html
https://sankame.github.io/blog/2018-07-23-android_use_fileprovider/

エラーメッセージ:
Unhandled Exception: Java.Lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.ContentFrameLayout.setId(int)' on a null object reference

該当のソースコード

C# Xamarin

private void FileSend_Clicked(object sender, EventArgs e) { bool result = DependencyService.Get<IMailService>().ApMailer(“data.pdf”); } public interface IMailService { bool ApMailer(string file); } ### AndroidManifest.xml … <application … > <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> </application> … ### Resource/xml/filepaths.xml <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="share_name" path="."/> </paths> ### MailService.cs public class MailService : IMailService { public bool ApMailer(string file) { Context context = Android.App.Application.Context; Android.Net.Uri filePath = FileProvider.GetUriForFile(context, ".fileprovider", new Java.IO.File(file)); Intent intent = new Intent(); intent.SetAction(Intent.ActionSend); intent.AddFlags(ActivityFlags.NewTask); intent.SetDataAndType(filePath, "message/rfc822"); Android.App.Application.Context.StartActivity(intent); return true; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

GetUriForFileauthorityの指定が間違っています。
正しくはこうです。

C#

1Android.Net.Uri filePath = FileProvider.GetUriForFile(context, $"{context.PackageName}.fileprovider" new Java.IO.File(file));

また、ファイルを添付するなら、intent.SetDataAndType(filePath, "message/rfc822")ではなく以下のようにします。

C#

1intent.SetType("message/rfc822"); 2intent.PutExtra(Intent.ExtraStream, filepath);

投稿2019/03/22 02:41

f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AoYaJi

2019/03/22 05:10

早速のお返事ありがとうございます。 ご指摘に従い、コードを書き替えましたが、上記と同じエラーが発生しています。 AndroidManifest.xmlの android:authorities="${applicationId}.fileprovider" はこのままでよろしいでしょか? わからないことだけで申し訳ありません。よろしくお願いします。
f-miyu

2019/03/22 05:43

一旦プロジェクトをクリーンしてみてください。
AoYaJi

2019/03/22 08:27

ありがとうございます。 早速、クリーンを実行してみました。今回、プログラムはうまく起動できました。そこでFileSendをクリックし、目的のルーチンを実行してみると別のエラーメッセージ "Java.Lang.IllegalArgumentException: Failed to find configured root that contains /Test.amn" が表示されました。 Android.Net.Uri filePath = FileProvider.GetUriForFile(context, $"{context.PackageName}.fileprovider", new Java.IO.File(file)); この行をブレークポイントを設定してみると、contextが設定された段階で NoBackupFilesDir 以下に赤い×がついて "Function evaluation timeout." になっています。そこに PackageName も含まれています。この行を実行すると上記のエラーメッセージが表示されます。 いろいろとアドバイスを頂いているのに、エラーの報告にとどまっています。申し訳ありません。
f-miyu

2019/03/22 09:22

ファイルが指定したパスにないのが原因です。Test.amnはどこに置いてあるファイルですか?正しくパスを指定して下さい。
AoYaJi

2019/03/22 10:12

呼び出すときに、フルパスでファイル名を指定したらうまくいきました。 この問題をクリアできないのではととても心配していました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問