ユーザーからの質問をメールで送ってもらったりしたいときに、アプリの中からスマホのメーラーを呼び出す便利な仕組みです。
2021.1.1
メールを作成するIntent
はっきりとしたドキュメントはないのですが、API29というかAndroid 10からIntentの扱いが大きくかわったようです。このメーラーもIntentで簡単にメールを送信する方法なので以前の方法とは異なっています。
メーラー起動
Intentのインスタンスを生成して
- ACTION
- ACTION_SENDTO(添付ファイルがない場合)
- ACTION_SEND(添付ファイルが 1 つある場合)
- ACTION_SEND_MULTIPLE(添付ファイルが複数ある場合)
- setData
- putExtra
これらを設定して
startActivity(intent)
ACTION_SENDTOのケース
1 2 3 4 5 6 7 8 9 10 11 |
String[] addresses = {"xxx@yyy.zzz"};// 複数のアドレスを入れらる Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // only email apps should handle this intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, "test mail"); intent.putExtra(Intent.EXTRA_TEXT, "本文です"); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } |
まとめると
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.net.Uri; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // mailer 呼び出し callMailer(); } }); } private void callMailer(){ String[] addresses = {"xxx@yyy.zzz"};// 複数のアドレスを入れらる Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // only email apps should handle this intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, "test mail"); intent.putExtra(Intent.EXTRA_TEXT, "本文です"); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } } } |
別段変わり種はないですが、一応レイアウトです
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:background="#ccffdd" tools:context=".MainActivity"> <TextView android:text="@string/mail_send" android:textSize="20sp" android:textColor="#000000" android:layout_marginBottom="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/button" android:text="@string/mailer_start" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> |
strings.xml
1 2 3 4 5 |
<resources> <string name="app_name">YourAppName</string> <string name="mail_send">メールを送信</string> <string name="mailer_start">メーラー起動</string> </resources> |
インテントフィルタ
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... > <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest> |
CCやBCCを入れたい場合は、
Intent.EXTRA_CC
Intent.EXTRA_BCC
を使います。
メールに画像を添付
画像を添付するケースですが、
Intent.ACTION_OPEN_DOCUMENT
を使ってフォトから画像を選択します。
その画像のUriをメーラーに設定してメールを送信します。尚、Intent.ACTION_SEND を使うのでメーラー以外のアプリも候補にあがります。
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
//package your.package.name; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private Uri imageUri = null; private TextView textView; ActivityResultLauncher<Intent> resultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent resultData = result.getData(); if (resultData != null) { Uri uri = resultData.getData(); imageUri = uri; String str = uri.toString(); textView.setText(str); } } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button buttonPhoto = findViewById(R.id.button_photo); buttonPhoto.setOnClickListener(v -> { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); resultLauncher.launch(intent); }); textView = findViewById(R.id.text_view); Button button = findViewById(R.id.button); button.setOnClickListener(v -> { // mailer 呼び出し callMailer(); }); } private void callMailer(){ if(imageUri == null) return; String[] addresses = {"xxx@yyy.zzz"};// 複数のアドレスを入れらる Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, "test mail"); intent.putExtra(Intent.EXTRA_TEXT, "本文です"); intent.putExtra(Intent.EXTRA_STREAM, imageUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:background="#ccffdd" tools:context=".MainActivity"> <Button android:id="@+id/button_photo" android:text="@string/image_select" android:layout_width="200dp" android:layout_height="wrap_content"/> <TextView android:id="@+id/text_view" android:text="@string/image_uri" android:layout_margin="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/button" android:text="@string/mailer_start" android:layout_width="200dp" android:layout_height="wrap_content"/> </LinearLayout> |
strings.xml
1 2 3 4 5 6 7 |
<resources> <string name="app_name">YourAppName</string> <string name="image_select">画像を選択</string> <string name="mailer_start">メーラー起動</string> <string name="description">attached image</string> <string name="image_uri">image uri</string> </resources> |
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... > <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest> |
Reference:
一般的なインテント, メール