見出し画像

Androidでストレージのファイルを添付メールで送る

Androidでストレージのファイルを添付メールで送る方法を備忘録で残します。

昔は内部ストレージのファイルのURLをインテントに渡すだけで、
添付メールとして送信できましたが、API Level 24以降では、ファイルプロバイダーが必須になりました。以下のようなエラーがでます。

android.os.FileUriExposedException: <ファイルパス> exposed beyond app through ClipData.Item.getUri()

1. AndroidManifest.xmlにファイルプロバイダーを追加

 AndroidManifest.xmlにファイルプロバイダーを追加します。

   <application
       android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="false"
       android:theme="@style/AppTheme">

       <provider
           android:name="android.support.v4.content.FileProvider"
           android:authorities="com.package.name.fileprovider"
           android:grantUriPermissions="true"
           android:exported="false">
           <meta-data
               android:name="android.support.FILE_PROVIDER_PATHS"
               android:resource="@xml/filepaths" />
       </provider>

       ・・・
   </application>
</manifest>

2. res/xmlにfilepaths.xmlを追加

res/xmlにfilepaths.xmlを追加します。

内部ストレージのファイルを使う時は、次のように記述します。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
   <files-path path="." name="name" />
</paths>

外部ストレージのファイルを使う時は、次のように記述します。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
   <external-path name="external_files" path="." />
</paths>

3. 添付メールの送信

添付メールを送信するコードは次の通りです。
以下の「<メールアドレス>」は送信先のメアドを指定してください。

   //添付メールの送信
   private void sendMain(File file) {
       try {
           Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
           shareIntent.putExtra(Intent.EXTRA_SUBJECT,"Subject");
           shareIntent.setType("text/plain");
           shareIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"<メールアドレス>"});
           Uri uri = FileProvider.getUriForFile(this, "com.package.name.fileprovider", file);
           ArrayList<Uri> uris = new ArrayList<Uri>();
           uris.add(uri);
           shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
           startActivity(Intent.createChooser(shareIntent , "Email:").
               addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
       } catch (Exception e) {
           e.printStackTrace();
       }
   }


この記事が気に入ったらサポートをしてみませんか?