意圖可讓您藉由描述
要執行的動作,例如「查看地圖」或
圖片」在 Intent
物件中。這類意圖
稱為「隱含」意圖,因為這個意圖並未指定應用程式
啟動,但會指定動作,並提供
一些資料,用來執行動作。
撥打 startActivity()
時
或 startActivityForResult()
,然後將隱含意圖 (系統)
已解決
向可處理意圖並啟動相關意圖的應用程式意圖
對應的 Activity
。如有多個應用程式
能處理意圖,而系統會向使用者顯示對話方塊
選擇要使用的應用程式
本頁說明幾種可用於執行的隱含意圖 常見動作,按照處理意圖的應用程式類型排列。每項 以及如何建立意圖 篩選器,宣傳應用程式執行特定操作的能力。
注意:如果裝置上沒有應用程式
接收隱含意圖,但應用程式呼叫 startActivity()
時會異常終止。首先
現有應用程式可以接收意圖,請在 Intent
物件上呼叫 resolveActivity()
。如果結果不是空值,表示至少有
一個可處理意圖的應用程式,您可以放心呼叫 startActivity()
。如果結果是
null,不要使用意圖,並且盡可能停用
叫用意圖的功能
如果您不熟悉如何建立意圖或意圖篩選器,請先參閱「意圖和意圖和意圖」一文 篩選器。
瞭解如何從開發作業中觸發本頁列出的意圖 主機,請參閱使用 Android 偵錯功能驗證意圖 橋樑區段。
Google 語音操作
Google Voice 動作會觸發本頁列出的部分意圖以回應 語音指令。如需詳細資訊,請參閱 開始使用系統語音操作。
鬧鐘
以下是鬧鐘應用程式的常見動作,包括所需資訊 建立意圖篩選器,宣傳應用程式執行各項動作的能力。
建立鬧鐘
如要建立新鬧鐘,請使用「ACTION_SET_ALARM
」
動作,以及使用以下額外功能指定鬧鐘詳細資訊,例如時間和訊息。
注意:僅提供小時、分鐘和訊息額外資訊 Android 2.3 (API 級別 9) 以下版本。其他額外功能適用於較新版本的 平台。
- 動態
ACTION_SET_ALARM
- 資料 URI
- 無
- MIME 類型
- 無
- 額外內容
-
EXTRA_HOUR
- 鬧鐘的時間。
EXTRA_MINUTES
- 鬧鐘的分鐘數。
EXTRA_MESSAGE
- 用於辨識鬧鐘的自訂訊息。
EXTRA_DAYS
ArrayList
,包括這個鬧鐘的每週日 重複執行。每天都必須使用Calendar
中的整數進行宣告 例如MONDAY
如果是單次鬧鐘,請不要指定這項額外項目。
EXTRA_RINGTONE
content:
URI,用於指定與鬧鐘搭配使用的鈴聲,VALUE_RINGTONE_SILENT
則是指不發出鈴聲的鈴聲。如要使用預設鈴聲,請不要指定這項額外設定。
EXTRA_VIBRATE
- 布林值,指定是否要為這個鬧鐘震動。
EXTRA_SKIP_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
- 布林值,用於指定回應的應用程式在設定計時器時,是否必須略過使用者介面。 如果為 true,應用程式必須略過任何確認使用者介面,並啟動指定的計時器。
意圖範例:
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
動作並指定資料 URI
Events.CONTENT_URI
。
然後,您可以使用下列額外項目指定各種活動詳細資訊。
- 動態
ACTION_INSERT
- 資料 URI
Events.CONTENT_URI
- MIME 類型
"vnd.android.cursor.dir/event"
- 額外內容
-
EXTRA_EVENT_ALL_DAY
- 布林值,用於指定是否為全天事件。
EXTRA_EVENT_BEGIN_TIME
- 事件的開始時間 (自 Epoch 紀元時間起算的毫秒數)。
EXTRA_EVENT_END_TIME
- 事件的結束時間 (自 Epoch 紀元時間起算的毫秒數)。
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
動作。此外,請指定要更新資料的 URI 位置
例如使用相機儲存相片或影片。在 EXTRA_OUTPUT
外加。
- 動態
ACTION_IMAGE_CAPTURE
或
ACTION_VIDEO_CAPTURE
- 資料 URI 配置
- 無
- MIME 類型
- 無
- 額外內容
-
EXTRA_OUTPUT
- 相機應用程式儲存相片的 URI 位置,或
影片檔案 (做為
Uri
物件)。
相機應用程式成功傳回時間
專注於活動,也就是應用程式收到 onActivityResult()
回呼。
可透過您指定的 URI 存取相片或影片
的值為 EXTRA_OUTPUT
值。
注意:使用 ACTION_IMAGE_CAPTURE
時
拍攝相片時,相機也可能會傳回
結果 Intent
中相片的縮小副本或縮圖,已儲存在名為「Bitmap
」的額外欄位
"data"
。
意圖範例:
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. ... } }
如要在 Android 12 (API 級別 31) 以上版本執行這項作業,請參考以下意圖範例。
意圖範例:
Kotlin
val REQUEST_IMAGE_CAPTURE = 1 private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
如要進一步瞭解如何使用此意圖擷取相片,包括
如何為輸出位置建立適當的 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
額外項目,然後將擷取的圖片或影片儲存到
由該額外指定的位置,並使用 Intent
呼叫 setResult()
,其中額外含有經過壓縮的縮圖
名為 "data"
。
以靜態影像模式啟動相機應用程式
如要在靜態圖片模式下開啟相機應用程式,請使用 INTENT_ACTION_STILL_IMAGE_CAMERA
動作。
- 動態
INTENT_ACTION_STILL_IMAGE_CAMERA
- 資料 URI 配置
- 無
- MIME 類型
- 無
- 額外內容
- 無
意圖範例:
Kotlin
private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
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); } }
意圖篩選器範例:
<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()
回呼的結果 Intent
中包含
指向所選聯絡人的 content:
URI。回應授予
應用程式暫時權限,以便透過 Contacts Provider API 讀取該聯絡人。
您的應用程式不含 READ_CONTACTS
權限。
提示:如果只需要存取特定聯絡人 資訊 (例如電話號碼或電子郵件地址),請改為參閱下一節,瞭解如何 選取特定聯絡人資料。
- 動態
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
讀取該聯絡人基本詳細資料的權限,例如顯示名稱和
是否要將聯絡人加上星號不過,如果您想嘗試
閱讀特定聯絡人的更多特定資料,例如
做為對方的電話號碼或電子郵件地址,您需要 READ_CONTACTS
權限。
選取特定聯絡人資料
如要讓使用者從聯絡人中選取特定資訊,例如
電話號碼、電子郵件地址或其他資料類型,請使用
ACTION_PICK
動作,並將 MIME 類型指定為一
包含下列內容類型
CommonDataKinds.Phone.CONTENT_TYPE
取得聯絡人的電話號碼。
注意: 在許多情況下,應用程式必須符合下列條件:
READ_CONTACTS
查看特定聯絡人相關資訊的權限。
如果只需要從聯絡人擷取一種類型的資料,這項技巧使用
CONTENT_TYPE
的
ContactsContract.CommonDataKinds
類別效率比
使用 Contacts.CONTENT_TYPE
,如上一節所示。這種做法可以幫助您
存取所需資料,而無須執行較複雜的查詢向聯絡人供應商查詢。
傳送至 onActivityResult()
回呼的結果 Intent
中包含
指向所選聯絡人資料的 content:
URI。回應授予
應用程式暫時權限,可讀取該聯絡人資料 (即使應用程式不含 READ_CONTACTS
權限)。
- 動態
ACTION_PICK
- 資料 URI 配置
- 無
- MIME 類型
-
CommonDataKinds.Phone.CONTENT_TYPE
- 從有電話號碼的聯絡人中選擇。
CommonDataKinds.Email.CONTENT_TYPE
- 從具有電子郵件地址的聯絡人中選擇。
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- 從有郵寄地址的聯絡人中選擇。
或其他
CONTENT_TYPE
值的其中一個 低於ContactsContract
。
意圖範例:
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 主要有兩種:
- 使用
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 的主要方式有兩種:
- 使用
ACTION_PICK
動作傳回的聯絡人 URI 如上一節所示這種做法不需要任何應用程式權限。 - 直接存取所有聯絡人清單,如擷取
聯絡人。這個方法需要
READ_CONTACTS
權限。
- 動態
ACTION_EDIT
- 資料 URI 配置
content:<URI>
- MIME 類型
- 系統會從聯絡人 URI 推論類型。
- 額外內容
ContactsContract.Intents.Insert
中定義的一或多個額外項目。 以便填入聯絡人詳細資料
意圖範例:
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
動作。
將 Contacts.CONTENT_TYPE
指定為
並且會在
ContactsContract.Intents.Insert
中的常數。
- 動態
ACTION_INSERT
- 資料 URI 配置
- 無
- MIME 類型
Contacts.CONTENT_TYPE
- 額外內容
ContactsContract.Intents.Insert
中定義的一或多個額外項目。
意圖範例:
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
(用於一個附件) 或
ACTION_SEND_MULTIPLE
(用於多個附件)- 資料 URI 配置
- 無
- MIME 類型
-
"text/plain"
"*/*"
- 額外內容
-
Intent.EXTRA_EMAIL
- 所有「To」的字串陣列收件者的電子郵件地址
Intent.EXTRA_CC
- 所有「CC」的字串陣列收件者的電子郵件地址
Intent.EXTRA_BCC
- 所有「密件副本」的字串陣列收件者的電子郵件地址
Intent.EXTRA_SUBJECT
- 含有電子郵件主旨的字串。
Intent.EXTRA_TEXT
- 包含電子郵件內文的字串,
Intent.EXTRA_STREAM
- 指向連結的
Uri
。 如果使用ACTION_SEND_MULTIPLE
這個動作,而是ArrayList
內含 多個Uri
物件。
意圖範例:
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 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 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
。
接著,您可以在 ClipData
中存取每個所選檔案
物件。getClipData()
- 動態
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 上執行時,使用 ACTION_GET_CONTENT
動作擷取必須匯入到應用程式的檔案副本,而不是擷取必須匯入到應用程式的檔案副本
4.4 以上版本,您可以改為要求開啟其他應用程式管理的檔案,做法如下:
方法是使用 ACTION_OPEN_DOCUMENT
動作並指定 MIME 類型
如要也讓使用者建立應用程式可以寫入的新文件,請改用 ACTION_CREATE_DOCUMENT
動作。
舉例來說
選取現有的 PDF 文件後,ACTION_CREATE_DOCUMENT
意圖可讓使用者選取要建立新文件的位置,例如在其他應用程式中
用於管理文件儲存空間接著,您的應用程式會接收其來源的 URI 位置
就能寫入新文件
傳送至 onActivityResult()
的意圖
ACTION_GET_CONTENT
動作中的方法可能會
傳回任何類型的 URI,即 ACTION_OPEN_DOCUMENT
的結果意圖
且 ACTION_CREATE_DOCUMENT
一律會將所選檔案指定為 content:
,並由 DocumentsProvider
支援的 URI。您可以開啟
含有「openFileDescriptor()
」和
使用 DocumentsContract.Document
中的資料欄查詢其詳細資料。
傳回的 URI 可授予應用程式長期的讀取權限,
授予寫入權限ACTION_OPEN_DOCUMENT
動作為
如果您想讀取現有檔案,但不想複製檔案,這項功能就特別實用
或想開啟及編輯檔案時
您也可以讓使用者一次選取多個檔案,方法是將
將 EXTRA_ALLOW_MULTIPLE
設為意圖,並設為 true
。
如果使用者只選取一個項目,您就可以從 getData()
擷取該項目。
如果使用者選取多個項目,getData()
會傳回空值,而您必須改為
從 ClipData
擷取每個項目
物件。getClipData()
注意:您的意圖必須指定 MIME 類型,
必須宣告 CATEGORY_OPENABLE
類別。如果
您可以指定多個 MIME 類型,方法是在 MIME 類型陣列中加入
以及 EXTRA_MIME_TYPES
。如果這麼做,您就必須將
主要 MIME 類型 (位於 setType()
至 "*/*"
)。
- 動態
ACTION_OPEN_DOCUMENT
或
ACTION_CREATE_DOCUMENT
- 資料 URI 配置
- 無
- MIME 類型
- 與使用者所需檔案類型相對應的 MIME 類型。
- 額外內容
-
EXTRA_MIME_TYPES
- 與應用程式檔案類型相對應的 MIME 類型陣列
資源。使用這個額外項目時,您必須在主要 MIME 類型中設定
setType()
到"*/*"
。 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 代表整個地球,其中心為指定的 lat, lng。最高
(最近) 縮放等級為 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
- 顯示「我的街道地址」的位置,可以是特定的地址或位置查詢。
範例:
"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
(必填)-
指出搜尋模式:指出使用者是否為特定藝人、專輯、歌曲、 或播放清單大部分的搜尋模式都會提供額外額外項目。舉例來說,如果使用者 此意圖可能提供另外三種額外功能: 歌名、演出者和專輯。這項意圖支援下列搜尋模式: 每個
EXTRA_MEDIA_FOCUS
的值:不限 -
"vnd.android.cursor.item/*"
-
可播放任何音樂。接收應用程式會根據您的智慧選擇播放部分音樂,例如 做為使用者上次收聽的播放清單
其他額外福利:
QUERY
(必要):空白字串。這項額外功能總是 回溯相容性。現有應用程式不瞭解搜尋模式 這項意圖會以非結構化搜尋方式處理。
非結構化 -
"vnd.android.cursor.item/*"
-
從非結構化的搜尋查詢中播放特定歌曲、專輯或類型。應用程式可以產生 這個搜尋模式的意圖,在無法辨別使用者想要的內容類型時,就顯示意圖 。盡可能使用更精確的搜尋模式。
其他額外福利:
QUERY
(必要):包含任意組合的字串 演出者、專輯、歌曲名稱或類型。
-
播放特定類型的音樂。
其他額外福利:
"android.intent.extra.genre"
(必要):類型,QUERY
(必填):類型,系統一律會提供這項額外功能 以便回溯相容性不瞭解搜尋模式的現有應用程式可處理 視為非結構化搜尋
-
播放指定藝人的音樂。
其他額外福利:
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
(必要):包含下列任一組合的字串 專輯、演出者、類型或名稱。系統一律會為 回溯相容性現有應用程式不瞭解搜尋模式,也能處理這個問題 將意圖視為非結構化搜尋
-
播放符合特定條件的播放清單或播放清單 其他額外功能
其他額外福利:
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>
在活動中處理此意圖時,請檢查
來電次數多 EXTRA_MEDIA_FOCUS
按 Intent
鍵即可決定搜尋模式。系統辨識您的活動後
讀取該搜尋模式其他額外項目的值。
有了這些資訊,您的應用程式就能在廣告空間內執行搜尋,以顯示
符合搜尋查詢的內容。如以下範例所示。
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 might 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 might 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"
- 郵件主旨的字串 (通常僅適用於多媒體訊息)。
"sms_body"
- 簡訊字串。
EXTRA_STREAM
Uri
指向 要附加的圖片或影片如果使用ACTION_SEND_MULTIPLE
動作 這個額外是ArrayList
Uri
物件,指向要附加的圖片或影片。
- 動態
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 配置指定電話號碼。「電話」應用程式開啟時,
開始通話。使用者不需要輕觸「Call」按鈕。
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
動作,如以下意圖篩選器範例所示。
注意:我們不建議使用 SEARCH_ACTION
搜尋應用程式。
請改為將
GET_THING
操作,利用 Google 助理內建的應用程式內搜尋功能。若需更多資訊,請參閲
Google 助理
應用程式動作說明文件。
意圖篩選器範例:
<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); } }
發送簡訊
透過簡訊應用程式撰寫含有附件的簡訊/多媒體訊息。 使用以下程式碼建立意圖篩選器,宣傳應用程式能否執行這項動作: 請參閱下一節的資訊
撰寫含有附件的簡訊/多媒體訊息
如要傳送簡訊或多媒體訊息,請使用下列其中一個意圖動作並指定訊息 詳細資訊,例如電話號碼、主旨和郵件內文。
意圖範例:
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:") // Only SMS apps respond to this. 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:")); // Only SMS apps respond to this. 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 以上版本)。詳情請參閱說明文件
通知時間:Telephony
。
網路瀏覽器
載入網址是網路瀏覽器應用程式的常見動作。 使用以下程式碼建立意圖篩選器,宣傳應用程式能否執行這項動作: 請參閱下一節的資訊
載入網址
如要開啟網頁,請使用 ACTION_VIEW
動作
並在意圖資料中指定網址
意圖範例:
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 應用程式提供的功能類似 請在你的網站中加入意圖篩選器,指定指向你網站的網址。接著: 如果使用者已安裝您的應用程式,如果電子郵件或其他網頁中指向您網站的連結 開啟 Android 應用程式,而不是網頁。詳情請參閱: 處理 Android 應用程式連結。
從 Android 12 (API 級別 31) 開始,一般網路意圖會解析為 應用程式獲准在特定網域內的活動 包含在該網路意圖中如果應用程式未通過核准,無法用於網域 意圖會改為解析為使用者的預設瀏覽器應用程式。
使用 Android Debug Bridge 驗證意圖
如要驗證應用程式是否會回應您想支援的意圖,您可以使用
adb
工具,透過執行的動作來觸發特定意圖
包括:
若需更多資訊,請參閲 問題殼層指令。