インテントを使用すると、実行したい簡単なアクション(「地図を表示する」、「写真を撮る」など)を Intent
オブジェクトに記述することによって、別のアプリでアクティビティを開始できます。このタイプのインテントは、暗黙的インテントと呼ばれます。開始するアプリのコンポーネントは指定せず、代わりにアクションを指定し、そのアクションの実行に使用される一部のデータを指定するからです。
startActivity()
や startActivityForResult()
を呼び出して暗黙的インテントを渡すと、システムはそのインテントを扱うことができるアプリを判断するためにインテントの解決を行い、対応する Activity
を起動します。インテントを扱うことができるアプリが複数存在する場合は、ユーザーが使用するアプリを選択できるダイアログが表示されます。
このページでは、インテントを扱うことができるアプリの種類別に、一般的なアクションを実行できる暗黙的インテントについて説明します。各セクションには、あなたのアプリが同じアクションを実行できることを告知するインテント フィルタの作成方法も記載されています。
注意:端末に暗黙的インテントを受け取ることができるアプリがない場合、startActivity()
を呼び出すとアプリがクラッシュします。まず、インテントを受け取るアプリの存在を確認するために、Intent
オブジェクトの resolveActivity()
を呼び出してください。結果が null 以外の場合は、インテントを処理できるアプリが少なくとも 1 つあるということなので、startActivity()
を安全に呼び出すことができます。結果が null の場合は、そのインテントは使用しないでください。可能であればそのインテントを呼び出す機能を無効にしてください。
インテントやインテント フィルタの作成方法に精通していない方は、まずインテントとインテント フィルタをお読みください。
このページに記載されているインテントを開発用のホストから発行する方法については、Android Debug Bridge でインテントを検証するを参照してください。
Google Voice Actions
このページに記載されているインテントの中には、Google Voice Actions により、音声コマンドへの応答として発行されるものもあります。詳細については、Google Voice Actions から発行されるインテントをご覧ください。
アラーム クロック
アラームを作成する
新しいアラームを作成するには、ACTION_SET_ALARM
アクションを使用し、以下に定義されているエクストラで時間やメッセージなどのアラームの詳細を指定します。
注:時間、分、メッセージのエクストラは、Android 2.3(API レベル 9)以前のすべての端末で利用できます。その他のエクストラは、それ以降のバージョンのプラットフォームで追加されたものです。
- アクション
ACTION_SET_ALARM
- データ URI
- なし
- MIME タイプ
- なし
- エクストラ
-
EXTRA_HOUR
- アラームの時間。
EXTRA_MINUTES
- アラームの分。
EXTRA_MESSAGE
- アラームを識別するカスタム メッセージです。
EXTRA_DAYS
- このアラームが繰り返される曜日を格納した
ArrayList
です。曜日は、たとえばMONDAY
のようにCalendar
クラスの整数で指定します。1 回限りのアラームの場合は、このエクストラは設定しないでください。
EXTRA_RINGTONE
- アラームで使用する着信音を指定する
content:
URI。着信音を使用しない場合は、VALUE_RINGTONE_SILENT
を指定します。デフォルトの着信音を使用する場合は、このエクストラは指定しないでください。
EXTRA_VIBRATE
- アラームでバイブレーションを使用するかどうかを示すブール値です。
EXTRA_SKIP_UI
- アラームを設定する際に応答アプリが UI をスキップするかどうかを示すブール値です。true の場合、アプリは確認画面の UI をすべてスキップして指定されたアラームを設定します。
インテントの例:
Kotlin
fun createAlarm(message: String, hour: Int, minutes: Int) { val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_HOUR, hour) putExtra(AlarmClock.EXTRA_MINUTES, minutes) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createAlarm(String message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_HOUR, hour) .putExtra(AlarmClock.EXTRA_MINUTES, minutes); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ACTION_SET_ALARM
インテントを呼び出すには、アプリに SET_ALARM
パーミッションが必要です。
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
タイマーを作成する
カウントダウンタイマーを作成するには、ACTION_SET_TIMER
アクションを使用し、以下に定義されているエクストラで時間などのタイマーの詳細を指定します。
注:このインテントは、Android 4.4(API レベル 19)で追加されました。
- アクション
ACTION_SET_TIMER
- データ URI
- なし
- MIME タイプ
- なし
- エクストラ
-
EXTRA_LENGTH
- 秒単位のタイマーの長さです。
EXTRA_MESSAGE
- タイマーを識別するカスタム メッセージです。
EXTRA_SKIP_UI
- タイマーを設定する際にアプリが UI をスキップするかどうかを示すブール値です。true の場合、アプリは確認画面の UI をすべてスキップして指定されたタイマーを開始します。
インテントの例:
Kotlin
fun startTimer(message: String, seconds: Int) { val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ACTION_SET_TIMER
インテントを呼び出すには、アプリに SET_ALARM
パーミッションが必要です。
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
すべてのアラームを表示する
アラームの一覧を表示するには、ACTION_SHOW_ALARMS
アクションを使用します。
このインテントを呼び出すアプリは多くありませんが(このインテントを使用するのは主にシステムアプリです)、アラーム クロックとして動作するアプリには必ずこのインテント フィルタを実装し、応答として現在のアラームの一覧を表示する必要があります。
注:このインテントは、Android 4.4(API レベル 19)で追加されました。
- アクション
ACTION_SHOW_ALARMS
- データ URI
- なし
- MIME タイプ
- なし
インテント フィルタの例
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
カレンダー
カレンダー イベントを追加する
ユーザーのカレンダーに新しいイベントを追加するには、ACTION_INSERT
アクションを使用し、Events.CONTENT_URI
でデータ URI を指定します。その後、以下に定義されているエクストラでイベントの詳細を指定します。
- アクション
ACTION_INSERT
- データ URI
Events.CONTENT_URI
- MIME タイプ
"vnd.android.cursor.dir/event"
- エクストラ
-
EXTRA_EVENT_ALL_DAY
- 終日のイベントかどうかを示すブール値。
EXTRA_EVENT_BEGIN_TIME
- イベントの開始時間(エポックからのミリ秒単位)。
EXTRA_EVENT_END_TIME
- イベントの終了時間(エポックからのミリ秒単位)。
TITLE
- イベントのタイトル。
DESCRIPTION
- イベントの説明。
EVENT_LOCATION
- イベントの場所。
EXTRA_EMAIL
- 参加者のメールアドレスのコンマ区切りリスト。
CalendarContract.EventsColumns
クラスで定義されている定数を使用すると、イベントの詳細をさらに細かく指定できます。
インテントの例:
Kotlin
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
カメラ
写真や動画を撮影して返す
カメラアプリを開き、撮影した写真や動画を受け取るには、ACTION_IMAGE_CAPTURE
または ACTION_VIDEO_CAPTURE
アクションを使用します。EXTRA_OUTPUT
エクストラで、カメラが写真や動画を保存する URI ロケーションも指定します。
- アクション
ACTION_IMAGE_CAPTURE
または
ACTION_VIDEO_CAPTURE
- データ URI スキーム
- なし
- MIME タイプ
- なし
- エクストラ
-
EXTRA_OUTPUT
- カメラアプリが写真や動画のファイルを保存する URI ロケーション(
Uri
オブジェクト)。
カメラアプリが正常にフォーカスをアクティビティに戻す(アプリが onActivityResult()
callback を受け取る)と、EXTRA_OUTPUT
値で指定した URI にある写真や動画にアクセスできるようになります。
注:ACTION_IMAGE_CAPTURE
を使用して写真を撮影すると、カメラが写真の縮小コピー(サムネイル)も一緒に返す場合があります。これは、結果の Intent
の "data"
という追加の項目に Bitmap
として保存されています。
インテントの例:
Kotlin
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos ... } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos ... } }
出力場所として適切な Uri
の作成方法など、このインテントを使って写真を撮影する方法の詳細については、簡単な写真撮影または簡単な動画撮影をご覧ください。
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
このインテントを処理する際にアクティビティが、受け取った Intent
に EXTRA_OUTPUT
エクストラがあるかをチェックし、撮影した画像や動画をエクストラで指定されたロケーションに保存し、"data"
というエクストラに圧縮版のサムネイルが含まれている Intent
を指定して setResult()
を呼び出すようにしてください。
静止画モードでカメラアプリを起動する
静止画モードでカメラアプリを起動するには、INTENT_ACTION_STILL_IMAGE_CAMERA
アクションを使用します。
- アクション
INTENT_ACTION_STILL_IMAGE_CAMERA
- データ URI スキーム
- なし
- MIME タイプ
- なし
- エクストラ
- なし
インテントの例:
Kotlin
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
動画モードでカメラアプリを起動する
動画モードでカメラアプリを起動するには、INTENT_ACTION_VIDEO_CAMERA
アクションを使用します。
- アクション
INTENT_ACTION_VIDEO_CAMERA
- データ URI スキーム
- なし
- MIME タイプ
- なし
- エクストラ
- なし
インテントの例:
Kotlin
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
連絡先 / 連絡帳アプリ
連絡先を選択する
ユーザーが連絡先を選択し、アプリがすべての連絡先情報にアクセスできるようにするには、ACTION_PICK
アクションを使用し、MIME タイプを Contacts.CONTENT_TYPE
に指定します。
onActivityResult()
callback に配信される結果の Intent
には、選択された連絡先を指す content:
URI が含まれています。アプリに READ_CONTACTS
パーミッションがなくても、この応答により、連絡先プロバイダ API を使用して当該連絡先を読み取る一時的なパーミッションが付与されます。
ヒント:電話番号やメールアドレスなど、連絡先情報の一部のみにアクセスする場合は、次のセクションの特定の連絡先データを選択する方法をご覧ください。
- アクション
ACTION_PICK
- データ URI スキーム
- なし
- MIME タイプ
Contacts.CONTENT_TYPE
インテントの例:
Kotlin
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri //... } }
Java
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri ... } }
連絡先の URI を受け取った後に連絡先の詳細を取得する方法については、連絡先の詳細の取得をご覧ください。上記のインテントで連絡先 URI を受け取った場合、その連絡先の詳細の読み取りに READ_CONTACTS
パーミッションは不要であることにご注意ください。
特定の連絡先データを選択する
ユーザーが連絡先から一部の情報を(電話番号やメールアドレスなど)選択できるようにするには、ACTION_PICK
アクションを使用し、MIME タイプを以下のリストされているいずれかのコンテンツタイプに指定します。たとえば、連絡先の電話番号を取得する場合は、CommonDataKinds.Phone.CONTENT_TYPE
を指定します。
前のセクションで説明したとおり、連絡先から 1 つのタイプのデータだけを取得する場合は、この方式で ContactsContract.CommonDataKinds
クラスの CONTENT_TYPE
を利用する方が、Contacts.CONTENT_TYPE
を利用するよりも効率的です。この方式なら、連絡先プロバイダに複雑なクエリを行わずに目的のデータに直接アクセスできます。
onActivityResult()
callback に配信される結果の Intent
には、選択された連絡先を指す content:
URI が含まれています。アプリに READ_CONTACTS
パーミッションがなくても、この応答により、連絡先データを読み取る一時的なパーミッションが付与されます。
- アクション
ACTION_PICK
- データ URI スキーム
- なし
- MIME タイプ
-
CommonDataKinds.Phone.CONTENT_TYPE
- 連絡先から電話番号を取得します。
CommonDataKinds.Email.CONTENT_TYPE
- 連絡先からメールアドレスを取得します。
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- 連絡先から住所を取得します。
ほかにも、
ContactsContract
で定義されているさまざまなCONTENT_TYPE
値を利用できます。
インテントの例:
Kotlin
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number ... } } } }
Java
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number //... } } }
連絡先を表示する
既存の連絡先の詳細を表示するには、ACTION_VIEW
アクションを使用し、インテント データとして content:
URI で連絡先を指定します。
最初に連絡先の URI を取得する方法は主に次の 2 つです。
- 前のセクションで説明した
ACTION_PICK
によって返される連絡先 URI を使用する(この方法の場合、アプリにパーミッションは不要です)。 - 連絡先の一覧の取得で説明されているように、すべての連絡先のリストに直接アクセスする(この方法の場合
READ_CONTACTS
パーミッションが必要です)。
- アクション
ACTION_VIEW
- データ URI スキーム
content:<URI>
- MIME タイプ
- なし。タイプは連絡先 URI から推測します。
インテントの例:
Kotlin
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
既存の連絡先を編集する
既存の連絡先を編集するには、ACTION_EDIT
アクションを使用し、インテント データとして content:
URI で連絡先を指定します。さらに、ContactsContract.Intents.Insert
内の定数により指定されたエクストラに連絡先情報を指定します。
最初に連絡先 URI を取得する方法は主に次の 2 つです。
- 前のセクションで説明した
ACTION_PICK
によって返される連絡先 URI を使用する(この方法の場合、アプリにパーミッションは不要です)。 - 連絡先の一覧の取得で説明されているように、すべての連絡先のリストに直接アクセスする(この方法の場合
READ_CONTACTS
パーミッションが必要です)。
- アクション
ACTION_EDIT
- データ URI スキーム
content:<URI>
- MIME タイプ
- タイプは連絡先 URI から推測します。
- エクストラ
ContactsContract.Intents.Insert
で定義されている 1 つまたは複数のエクストラ。これで連絡先詳細の項目にデータを入力することができます。
インテントの例:
Kotlin
fun editContact(contactUri: Uri, email: String) { val intent = Intent(Intent.ACTION_EDIT).apply { data = contactUri putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void editContact(Uri contactUri, String email) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setData(contactUri); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
連絡先を編集する方法の詳細については、インテントによる連絡先の変更をご覧ください。
連絡先を挿入する
新しい連絡先を挿入するには、ACTION_INSERT
アクションを使用し、MIME タイプに Contacts.CONTENT_TYPE
を指定します。さらに、ContactsContract.Intents.Insert
の定数により指定されたエクストラに既知の連絡先情報を含めます。
- アクション
ACTION_INSERT
- データ URI スキーム
- なし
- MIME タイプ
Contacts.CONTENT_TYPE
- エクストラ
ContactsContract.Intents.Insert
で定義されている 1 つまたは複数のエクストラ。
インテントの例:
Kotlin
fun insertContact(name: String, email: String) { val intent = Intent(Intent.ACTION_INSERT).apply { type = ContactsContract.Contacts.CONTENT_TYPE putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void insertContact(String name, String email) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(Contacts.CONTENT_TYPE); intent.putExtra(Intents.Insert.NAME, name); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
連絡先を挿入する方法の詳細については、インテントによる連絡先の変更をご覧ください。
メール
任意の添付ファイル付きのメールを作成する
メールを作成するには、添付ファイルの有無に応じて次のいずれかのアクションを利用します。さらに、下記に列挙したエクストラキーを使用して受信者や件名などのメールの詳細を含めます。
- アクション
ACTION_SENDTO
(添付ファイルがない場合)
ACTION_SEND
(添付ファイルが 1 つある場合)
ACTION_SEND_MULTIPLE
(添付ファイルが複数ある場合)- データ URI スキーム
- なし
- MIME タイプ
-
"text/plain"
"*/*"
- エクストラ
-
Intent.EXTRA_EMAIL
- 「宛先」の受信者のすべてのメールアドレスを格納した文字列配列です。
Intent.EXTRA_CC
- 「CC」の受信者のすべてのメールアドレスを格納した文字列配列です。
Intent.EXTRA_BCC
- 「BCC」の受信者のすべてのメールアドレスを格納した文字列配列です。
Intent.EXTRA_SUBJECT
- 電子メールの件名となる文字列です。
Intent.EXTRA_TEXT
- 電子メールの本文となる文字列です。
Intent.EXTRA_STREAM
- 添付ファイルを指す
Uri
です。ACTION_SEND_MULTIPLE
アクションを使用する場合は、複数のUri
オブジェクトを含むArrayList
を代わりに指定してください。
インテントの例:
Kotlin
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
このインテントを確実にメールアプリのみで処理するようにしたい(その他のテキスト メッセージングやソーシャルのアプリで処理されたくない)場合は、ACTION_SENDTO
アクションを使用し、"mailto:"
データスキームを含めます。以下に例を示します。
Kotlin
fun composeEmail(addresses: Array<String>, subject: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // only email apps should handle this putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject) { 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, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
ファイル ストレージ
特定のタイプのファイルを取得する
ユーザーがドキュメントや写真などのファイルを選択し、アプリにその参照を返すようリクエストするには、ACTION_GET_CONTENT
アクションを使用し、目的の MIME タイプを指定します。アプリに返されるファイルへの参照は、アクティビティの現在のライフサイクル内でのみ利用できます。そのため、後でファイルにアクセスしたい場合は、ファイルのコピーをインポートして後から読み取れるようにする必要があります。このインテントでは、ユーザーが途中で新しいファイルを作成することもできます(たとえば、既存の写真を選択する代わりに、カメラで新しい写真を撮影することができます)。
onActivityResult()
メソッドに配信される結果のインテントには、ファイルを指す URI があるデータが含まれています。この URI は、http:
URI、file:
URI、content:
URI など、さまざまなものが考えられます。ただし、選択できるファイルを、コンテンツ プロバイダ(content:
URI)からアクセスでき、かつopenFileDescriptor()
でファイル ストリームとして利用できるファイルに限定したい場合は、インテントに CATEGORY_OPENABLE
カテゴリを追加してください。
Android 4.3(API レベル 18)以降では、インテントに EXTRA_ALLOW_MULTIPLE
を追加して true
に設定すると、ユーザーが複数のファイルを選択できます。こうするとあなたのアプリは、getClipData()
で返される ClipData
オブジェクトにある各選択済みファイルにアクセスできます。
- アクション
ACTION_GET_CONTENT
- データ URI スキーム
- なし
- MIME タイプ
- ユーザーが選択するファイル タイプに対応する MIME タイプを指定します。
- エクストラ
-
EXTRA_ALLOW_MULTIPLE
- ユーザーが一度に複数のファイルを選択できるかどうかを宣言するブール値です。
EXTRA_LOCAL_ONLY
- リモート サービスからダウンロードすることなく、返されたファイルに端末から直接アクセス可能にしなければいけないかどうかを宣言するブール値です。
- カテゴリ(省略可能)
-
CATEGORY_OPENABLE
openFileDescriptor()
でファイル ストリームとして表せる、「オープン可能」なファイルのみを返します。
写真を取得するインテントの例:
Kotlin
const val REQUEST_IMAGE_GET = 1 fun selectImage() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") val fullPhotoUri: Uri = data.data // Do work with photo saved at fullPhotoUri ... } }
Java
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri ... } }
写真を返すインテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
--> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
特定のタイプのファイルを開く
Android 4.4 以降で実行している場合は、ACTION_GET_CONTENT
アクションでファイルのコピーを取得してアプリにインポートする代わりに、別のアプリが管理しているファイルを開くことができるようにリクエストできます。これを行うには、ACTION_OPEN_DOCUMENT
アクションを使用し、MIME タイプを指定します。あなたのアプリが書き込むことができる新しい文書をユーザーが作成することも許可するには、ACTION_CREATE_DOCUMENT
アクションを使用します。たとえば、ACTION_CREATE_DOCUMENT
インテントを使用すると、ユーザーは既存の PDF ドキュメントを選択するのではなく、新しいドキュメントを作成する場所(ドキュメントの保管を管理する別のアプリ内の場所)を選択することができます — この時あなたのアプリは、書き込み可能な新しいドキュメントの URI ロケーションを受け取ります。
ACTION_GET_CONTENT
アクションから onActivityResult()
メソッドに配信されるインテントはいずれのタイプの URI も返しますが、ACTION_OPEN_DOCUMENT
と ACTION_CREATE_DOCUMENT
からの結果インテントは、DocumentsProvider
がサポートする content:
URI で選択したファイルを常に指定します。このファイルを openFileDescriptor()
で開いたり、DocumentsContract.Document
のカラムを使用して詳細情報をクエリしたりすることができます。
返された URI により、ファイルへの長期的な読み取りアクセス権が(書き込みアクセス権と一緒に)アプリに付与されます。そのため、アプリ内にコピーを作成せずに既存のファイルを読み取りたい場合や、ファイルをその場で開いて編集したい場合は特に、ACTION_GET_CONTENT
アクションではなく ACTION_OPEN_DOCUMENT
アクションを利用すると便利です。
インテントに EXTRA_ALLOW_MULTIPLE
を追加して true
に設定することで、ユーザーが複数のファイルを選択できるようにもなります。ユーザーが 1 つのアイテムのみを選択した場合は、getData()
からそのアイテムを取得できます。ユーザーが複数のアイテムを選択した場合、getData()
は null を返します。この場合は、getClipData()
が返す ClipData
オブジェクトから各アイテムを取得する必要があります。
注:インテントでは、MIME タイプの指定と CATEGORY_OPENABLE
カテゴリの宣言が必須です。適切な場合は、EXTRA_MIME_TYPES
エクストラに MIME タイプの配列を追加して複数の MIME タイプを指定することもできます。— この場合、setType()
のプライマリ MIME タイプを "*/*"
に設定しなければなりません。
- アクション
ACTION_OPEN_DOCUMENT
または
ACTION_CREATE_DOCUMENT
- データ URI スキーム
- なし
- MIME タイプ
- ユーザーが選択するファイル タイプに対応する MIME タイプを指定します。
- エクストラ
-
EXTRA_MIME_TYPES
- アプリがリクエストしているファイル タイプに対応する MIME タイプの配列です。このエクストラを使用する時は、
setType()
のプライマリ MIME タイプを"*/*"
に設定する必要があります。 EXTRA_ALLOW_MULTIPLE
- ユーザーが一度に複数のファイルを選択できるかどうかを宣言するブール値です。
EXTRA_TITLE
ACTION_CREATE_DOCUMENT
を使用して、最初のファイル名を指定します。EXTRA_LOCAL_ONLY
- リモート サービスからダウンロードすることなく、返されたファイルに端末から直接アクセス可能にしなければいけないかどうかを宣言するブール値です。
- カテゴリ
-
CATEGORY_OPENABLE
openFileDescriptor()
でファイル ストリームとして表せる、「オープン可能」なファイルのみを返します。
写真を取得するインテントの例:
Kotlin
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri ... } }
Java
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri ... } }
ACTION_OPEN_DOCUMENT
アクションのインテントに実際に応答しているのは第三者のアプリではありません。実際にはシステムがこのインテントを受け取り、さまざまなアプリからアクセスできるすべてのファイルを統一されたユーザー インターフェースで表示しています。
あなたのアプリのファイルをこの UI に表示し、別のアプリから開けるようにするには、DocumentsProvider
を実装して PROVIDER_INTERFACE
用のインテント フィルタ("android.content.action.DOCUMENTS_PROVIDER"
)を含める必要があります。以下に例を示します。
<provider ... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>
あなたのアプリが管理するファイルを別のアプリから開けるようにする方法について詳しくは、ストレージ アクセス フレームワーク ガイドをご覧ください。
ローカル アクション
タクシーを呼ぶ
タクシーを呼ぶには、ACTION_RESERVE_TAXI_RESERVATION
アクションを使用します。
注:アプリがこのアクションを完了するには、ユーザーの確認が必要です。
- アクション
ACTION_RESERVE_TAXI_RESERVATION
- データ URI
- なし
- MIME タイプ
- なし
- エクストラ
- なし
インテントの例:
Kotlin
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
地図
地図上の場所を表示する
地図を開くには、ACTION_VIEW
アクションを使用し、以下に定義されているいずれかのスキームを使ってインテント データに位置情報を指定します。
- アクション
ACTION_VIEW
- データ URI スキーム
-
geo:latitude,longitude
- 指定された経度と緯度の地図を表示します。
例:
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
- 指定された経度と緯度の地図を一定の縮尺レベルで表示します。縮尺レベル 1 では、指定された経度と緯度を中心として地球全体を表示します。最高の(もっとも詳細な)縮尺レベルは 23 です。
例:
"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
- 指定された経度と緯度の地図を文字列ラベル付きで表示します。
例:
"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
- 「my street address」(特定の住所や位置クエリ)の場所を表示します。
例:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
注:
geo
URI で渡す文字列はすべてエンコードする必要があります。たとえば、文字列1st & Pike, Seattle
は1st%20%26%20Pike%2C%20Seattle
とする必要があります。文字列内の空白文字は%20
にエンコードするか、プラス記号(+
)に置き換えます。
- MIME タイプ
- なし
インテントの例:
Kotlin
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
音楽と動画
メディア ファイルを再生する
音楽ファイルを再生するには、ACTION_VIEW
アクションを使用し、インテント データにファイルの URI ロケーションを指定します。
- アクション
ACTION_VIEW
- データ URI スキーム
-
file:<URI>
content:<URI>
http:<URL>
- MIME タイプ
-
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
- その他、アプリが要求するものであれば何でも構いません。
インテントの例:
Kotlin
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
検索クエリに基づいて音楽を再生する
検索クエリに基づいて音楽を再生するには、INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
インテントを使用します。アプリは、音楽を再生するというユーザーの音声コマンドへの応答としてこのインテントを呼び出すことができます。このインテントを受け取ったアプリは、インベントリ内を検索し、指定されたクエリにマッチする既存のコンテンツを見つけ、そのコンテンツの再生を開始します。
このインテントには、検索モードを指定する EXTRA_MEDIA_FOCUS
文字列エクストラを含めてください。たとえば、検索モードによって、アーティスト名の検索か、曲名の検索かを指定できます。
- アクション
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- データ URI スキーム
- なし
- MIME タイプ
- なし
- エクストラ
-
MediaStore.EXTRA_MEDIA_FOCUS
(必須)-
検索モード(アーティスト、アルバム、曲、プレイリストのいずれを探すか)を指定します。ほとんどの検索モードでは、エクストラをさらに追加できます。たとえば、ユーザーが特定の曲を聴きたい場合、曲名、アーティスト、アルバムという 3 つのエクストラがさらにインテントに指定されることがあります。このインテントは、
EXTRA_MEDIA_FOCUS
の各値で、以下の検索モードをサポートしています。任意 -
"vnd.android.cursor.item/*"
-
任意の音楽を再生します。インテントを受け取るアプリは、適切な方法(ユーザーが直近に聴いたプレイリストなど)で音楽を選択して再生する必要があります。
追加のエクストラ:
QUERY
(必須): 空文字列。このエクストラは下方互換性を提供するために常に指定されます。検索モードを認識できない既存のアプリは、このインテントを非構造化検索として処理する場合があります。
非構造化 -
"vnd.android.cursor.item/*"
-
非構造化検索クエリから、特定の曲、アルバム、ジャンルのいずれかを再生します。ユーザーが聴きたいコンテンツのタイプをアプリで特定できない場合は、この検索モードでインテントを生成することができます。可能な場合は、アプリでより具体的な検索モードを使用してください。
追加のエクストラ:
QUERY
(必須): アーティスト、アルバム、曲名、ジャンルを自由に組み合わせた文字列です。
-
特定のジャンルの音楽を再生します。
追加のエクストラ値
"android.intent.extra.genre"
(必須): ジャンル。QUERY
(必須): ジャンル。このエクストラは下方互換性を提供するために常に指定されます。検索モードを認識できない既存のアプリは、このインテントを非構造化検索として処理する場合があります。
アーティスト -
Audio.Artists.ENTRY_CONTENT_TYPE
-
特定のアーティストの音楽を再生します。
追加のエクストラ:
EXTRA_MEDIA_ARTIST
(必須): アーティスト。"android.intent.extra.genre"
: ジャンル。QUERY
(必須): アーティストとジャンルを自由に組み合わせた文字列です。このエクストラは下方互換性を提供するために常に指定されます。検索モードを認識できない既存のアプリは、このインテントを非構造化検索として処理する場合があります。
-
特定のアルバムの音楽を再生します。
追加のエクストラ:
EXTRA_MEDIA_ALBUM
(必須): アルバム。EXTRA_MEDIA_ARTIST
: アーティスト。"android.intent.extra.genre"
: ジャンル。QUERY
(必須): アルバムとアーティストを自由に組み合わせた文字列です。このエクストラは下方互換性を提供するために常に指定されます。検索モードを認識できない既存のアプリは、このインテントを非構造化検索として処理する場合があります。
曲 -
"vnd.android.cursor.item/audio"
-
特定の曲を再生します。
追加のエクストラ:
EXTRA_MEDIA_ALBUM
: アルバム。EXTRA_MEDIA_ARTIST
: アーティスト。"android.intent.extra.genre"
: ジャンル。EXTRA_MEDIA_TITLE
(必須): 曲名。QUERY
(必須): アルバム、アーティスト、ジャンル、曲名を自由に組み合わせた文字列です。このエクストラは下方互換性を提供するために常に指定されます。検索モードを認識できない既存のアプリは、このインテントを非構造化検索として処理する場合があります。
プレイリスト -
Audio.Playlists.ENTRY_CONTENT_TYPE
-
特定のプレイリストまたは追加エクストラで指定された条件に一致するプレイリストを再生します。
追加のエクストラ:
EXTRA_MEDIA_ALBUM
: アルバム。EXTRA_MEDIA_ARTIST
: アーティスト。"android.intent.extra.genre"
: ジャンル。"android.intent.extra.playlist"
: プレイリスト。EXTRA_MEDIA_TITLE
: プレイリストに含まれる曲名です。QUERY
(必須): アルバム、アーティスト、ジャンル、プレイリスト、曲名を自由に組み合わせた文字列です。このエクストラは下方互換性を提供するために常に指定されます。検索モードを認識できない既存のアプリは、このインテントを非構造化検索として処理する場合があります。
インテントの例:
ユーザーが特定のアーティストの音楽を聴きたい場合、検索アプリは次のようなインテントを生成することができます。
Kotlin
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
このインテントを処理する際にアクティビティは、受け取った Intent
の EXTRA_MEDIA_FOCUS
エクストラの値をチェックして検索モードを判別します。アクティビティが検索モードを特定すると、その検索モードの追加エクストラの値を読み取ります。アプリはこの情報を使用してインベントリ内を検索し、検索クエリにマッチするコンテンツを再生します。以下に例を示します。
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras may not be available depending on the search mode val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode playUnstructuredSearch(query) } else { // 'Any' search mode playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode playPlaylist(album, artist, genre, playlist, title) } } } }
Java
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras may not be available depending on the search mode String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode playResumeLastPlaylist(); } else { // 'Unstructured' search mode playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode playPlaylist(album, artist, genre, playlist, title); } } }
新しいノート
ノートを作成する
新しいノートを作成するには、ACTION_CREATE_NOTE
アクションを使用し、以下に定義されているエクストラを使って件名やテキストなどのノートの詳細を指定します。
注:アプリがこのアクションを完了するには、ユーザーの確認が必要です。
- アクション
-
ACTION_CREATE_NOTE
- データ URI スキーム
- なし
- MIME タイプ
-
PLAIN_TEXT_TYPE
- "*/*"
- エクストラ
-
-
EXTRA_NAME
- ノートのタイトルまたは件名を示す文字列です。
-
EXTRA_TEXT
- ノートのテキストを示す文字列です。
-
- アクション
-
ACTION_DIAL
- ダイヤラーまたは電話アプリを開きます。ACTION_CALL
- 電話をかけます(CALL_PHONE
パーミッションが必要です)。
- データ URI スキーム
-
tel:<phone-number>
voicemail:<phone-number>
- MIME タイプ
- なし
tel:2125551212
tel:(212) 555 1212
- アクション
-
"com.google.android.gms.actions.SEARCH_ACTION"
- Google Voice Actions の検索クエリをサポートします。
- エクストラ
-
QUERY
- 検索クエリを含む文字列。
- アクション
ACTION_WEB_SEARCH
- データ URI スキーム
- なし
- MIME タイプ
- なし
- エクストラ
-
SearchManager.QUERY
- 検索文字列。
- アクション
-
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS
利用可能なその他の設定画面については、
Settings
のドキュメントをご覧ください。 - データ URI スキーム
- なし
- MIME タイプ
- なし
- アクション
ACTION_SENDTO
または
ACTION_SEND
または
ACTION_SEND_MULTIPLE
- データ URI スキーム
-
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>
いずれのスキームも同じように処理されます。
- MIME タイプ
-
"text/plain"
"image/*"
"video/*"
- エクストラ
-
"subject"
- メッセージの件名を示す文字列です(通常は MMS にのみ使用します)。
"sms_body"
- テキスト メッセージの文字列。
EXTRA_STREAM
- 添付する画像や動画を指す
Uri
。ACTION_SEND_MULTIPLE
アクションを使用する場合、このエクストラは添付する画像や動画を指すUri
のArrayList
にしてください。
- アクション
ACTION_VIEW
- データ URI スキーム
http:<URL>
https:<URL>
- MIME タイプ
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
- 開発用の Android 端末をセットアップするか、仮想デバイスを使用します。
- サポートしたいインテントを処理するバージョンのアプリをインストールします。
- 次のようにして
adb
でインテントを呼び出します。adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \ -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
次に例を示します。
adb shell am start -a android.intent.action.DIAL \ -d tel:555-5555 -n org.example.MyApp/.MyActivity
- 必要なインテント フィルタが定義されていれば、アプリがインテントを処理するはずです。
インテントの例:
Kotlin
fun createNote(subject: String, text: String) { val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply { putExtra(NoteIntents.EXTRA_NAME, subject) putExtra(NoteIntents.EXTRA_TEXT, text) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createNote(String subject, String text) { Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE) .putExtra(NoteIntents.EXTRA_NAME, subject) .putExtra(NoteIntents.EXTRA_TEXT, text); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.CREATE_NOTE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </activity>
電話
電話をかける
電話アプリを開いて電話番号をダイヤルするには、ACTION_DIAL
アクションを使用し、以下に定義されている URI スキームを使って電話番号を指定します。電話アプリが開くと電話番号が表示されますが、ユーザーは通話ボタンを押して呼び出しを行う必要があります。
直接電話をかけるには、ACTION_CALL
アクションを使用し、以下に定義されている URI スキームを使って電話番号を指定します。電話アプリが開くと呼び出しが始まります。ユーザーが通話ボタンを押す必要はありません。
ACTION_CALL
アクションを使用するには、CALL_PHONE
パーミッションをマニフェスト ファイルに追加する必要があります。
<uses-permission android:name="android.permission.CALL_PHONE" />
有効な電話番号は、IETF RFC 3966 で定義されている番号です。次に有効な電話番号の例を示します。
電話のダイヤラーは、スキームを正規化することができます。たとえば、電話番号の正規化が可能です。そのため、Uri.parse()
メソッドでは、記載されたスキームが厳密に要求されるわけではありません。ただし、試したことがないスキームや処理の可否が定かでないスキームに対しては Uri.fromParts()
メソッドを使用するようにしてください。
インテントの例:
Kotlin
fun dialPhoneNumber(phoneNumber: String) { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void dialPhoneNumber(String phoneNumber) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
検索
特定のアプリを使用して検索する
アプリのコンテキスト内の検索をサポートするには、下記のインテント フィルタの例で示されているように、SEARCH_ACTION
アクションを使ってアプリのインテント フィルタを宣言します。
インテント フィルタの例
<activity android:name=".SearchActivity"> <intent-filter> <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
ウェブ検索を行う
ウェブ検索を開始するには、ACTION_WEB_SEARCH
アクションを使用し、SearchManager.QUERY
エクストラで検索文字列を指定します。
インテントの例:
Kotlin
fun searchWeb(query: String) { val intent = Intent(Intent.ACTION_WEB_SEARCH).apply { putExtra(SearchManager.QUERY, query) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void searchWeb(String query) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, query); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
設定
設定の特定のセクションを開く
アプリのユーザーに何らかの設定を変えてもらうためにシステム設定の画面を開くには、次のインテント アクションのいずれかを使用します。アクション名に対応する設定画面が開きます。
インテントの例:
Kotlin
fun openWifiSettings() { val intent = Intent(Settings.ACTION_WIFI_SETTINGS) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void openWifiSettings() { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
テキスト メッセージ
添付ファイル付きの SMS / MMS メッセージを作成する
SMS や MMS でテキスト メッセージを作成するには、次のインテント アクションのいずれかを使用し、電話番号、件名、メッセージ本文などの詳細情報を下記に挙げたエクストラキーを使って指定します。
インテントの例:
Kotlin
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SENDTO).apply { type = HTTP.PLAIN_TEXT_TYPE putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType(HTTP.PLAIN_TEXT_TYPE); intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
このインテントを確実にテキスト メッセージ アプリのみで処理するようにしたい(その他のメールアプリやソーシャル アプリで処理されたくない)場合は、ACTION_SENDTO
アクションを使用し、"smsto:"
データスキームを含めます。以下に例を示します。
Kotlin
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { data = Uri.parse("smsto:") // This ensures only SMS apps respond putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("smsto:")); // This ensures only SMS apps respond intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="text/plain" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
注:Android 4.4 以降でデフォルトの SMS アプリとして使用できるようにする SMS / MMS メッセージング アプリを開発している場合は、他にいくつかのアクション用のインテント フィルタを実装する必要があります。詳細については、Telephony
のドキュメントをご覧ください。
ウェブブラウザ
ウェブの URL を読み込む
ウェブページを開くには、ACTION_VIEW
アクションを使用し、インテント データでウェブの URL を指定します。
インテントの例:
Kotlin
fun openWebPage(url: String) { val webpage: Uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void openWebPage(String url) { Uri webpage = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, webpage); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
インテント フィルタの例:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <!-- Include the host attribute if you want your app to respond only to URLs with your app's domain. --> <data android:scheme="http" android:host="www.example.com" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The BROWSABLE category is required to get links from web pages. --> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity>
ヒント:Android アプリでウェブサイトと同じような機能を提供したい場合は、ウェブサイトを指す URL のインテント フィルタを含めてください。そうすると、ユーザーがアプリをインストールし、あなたのウェブサイトに飛ぶリンクをメールや他のウェブページからタップすると、ウェブページではなく Android アプリが開くようになります。
Android Debug Bridge でインテントを検証する
サポートしたいインテントにアプリが応答することを検証するには、adb
ツールを使用して対象のインテントを発行します。
詳細については、ADB shell コマンドをご覧ください。