常用意圖

意圖可讓您藉由描述 要執行的動作,例如「查看地圖」或 圖片」在 Intent 物件中。這類意圖 稱為「隱含」意圖,因為這個意圖並未指定應用程式 啟動,但會指定動作,並提供 一些資料,用來執行動作。

撥打 startActivity() 時 或 startActivityForResult(),然後將隱含意圖 (系統) 已解決 向可處理意圖並啟動相關意圖的應用程式意圖 對應的 Activity。如有多個應用程式 能處理意圖,而系統會向使用者顯示對話方塊 選擇要使用的應用程式

本頁說明幾種可用於執行的隱含意圖 常見動作,按照處理意圖的應用程式類型排列。每項 以及如何建立意圖 篩選器,宣傳應用程式執行特定操作的能力。

注意:如果裝置上沒有應用程式 接收隱含意圖,但應用程式呼叫 startActivity() 時會異常終止。首先 現有應用程式可以接收意圖,請在 Intent 物件上呼叫 resolveActivity()。如果結果不是空值,表示至少有 一個可處理意圖的應用程式,您可以放心呼叫 startActivity()。如果結果是 null,不要使用意圖,並且盡可能停用 叫用意圖的功能

如果您不熟悉如何建立意圖或意圖篩選器,請先參閱「意圖和意圖和意圖」一文 篩選器

瞭解如何從開發作業中觸發本頁列出的意圖 主機,請參閱使用 Android 偵錯功能驗證意圖 橋樑區段。

Google 語音操作

Google Voice 動作會觸發本頁列出的部分意圖以回應 語音指令。如需詳細資訊,請參閱 開始使用系統語音操作

鬧鐘

以下是鬧鐘應用程式的常見動作,包括所需資訊 建立意圖篩選器,宣傳應用程式執行各項動作的能力。

建立鬧鐘

Google 語音操作

  • 「設定早上 7 點的鬧鐘」

如要建立新鬧鐘,請使用「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>

建立計時器

Google 語音操作

  • 「設定 5 分鐘的計時器」

如要建立倒數計時器,請使用 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_CAPTUREACTION_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"

以靜態影像模式啟動相機應用程式

Google 語音操作

  • 「拍照」

如要在靜態圖片模式下開啟相機應用程式,請使用 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>

在影片模式中啟動相機應用程式

Google 語音操作

  • 「錄影」

如要在影片模式中開啟相機應用程式,請使用 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_TYPEContactsContract.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 supports OpenableColumns
             and ContentResolver.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>

如要進一步瞭解如何將應用程式管理的檔案設為可從其他應用程式開啟,請參閱 請參閱「使用儲存空間存取架構開啟檔案」。

本地動作

叫車是常見的本地動作。建立意圖篩選器來宣傳應用程式的 能使用下一節的資訊執行此操作。

叫計程車

Google 語音操作

  • 「幫我計程車」
  • 「打電話給我。」

(僅限 Wear OS)

如要叫計程車,請使用 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>

根據搜尋查詢播放音樂

Google 語音操作

  • 「播放 michael jackson Billie jean」

如要根據搜尋查詢播放音樂,請使用 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 (必要):包含任意組合的字串 演出者、專輯、歌曲名稱或類型。

類型 - Audio.Genres.ENTRY_CONTENT_TYPE

播放特定類型的音樂。

其他額外福利:

  • "android.intent.extra.genre" (必要):類型,
  • QUERY (必填):類型,系統一律會提供這項額外功能 以便回溯相容性不瞭解搜尋模式的現有應用程式可處理 視為非結構化搜尋

藝人Audio.Artists.ENTRY_CONTENT_TYPE

播放指定藝人的音樂。

其他額外福利:

  • EXTRA_MEDIA_ARTIST (必填):藝人。
  • "android.intent.extra.genre":類型。
  • QUERY (必要):包含下列任一組合的字串 演出者或音樂類型系統為了顧及回溯相容性,一律提供這個額外項目。 現有應用程式不瞭解搜尋模式,可將這項意圖視為非結構化 搜尋。

專輯 - Audio.Albums.ENTRY_CONTENT_TYPE

播放指定專輯中的音樂。

其他額外福利:

  • 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>

在活動中處理此意圖時,請檢查 來電次數多 EXTRA_MEDIA_FOCUSIntent 鍵即可決定搜尋模式。系統辨識您的活動後 讀取該搜尋模式其他額外項目的值。 有了這些資訊,您的應用程式就能在廣告空間內執行搜尋,以顯示 符合搜尋查詢的內容。如以下範例所示。

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
用於表示記事文字的字串。

意圖範例:

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 配置「電話」應用程式開啟時,會顯示電話號碼。 ,且使用者必須輕觸「通話」按鈕才能開始通話。

Google 語音操作

  • 「撥打 555-5555」
  • 「打給小巴」
  • 「撥打語音信箱」

如要直接撥打電話,請使用 ACTION_CALL 動作 ,然後透過以下 URI 配置指定電話號碼。「電話」應用程式開啟時, 開始通話。使用者不需要輕觸「Call」按鈕。

ACTION_CALL 動作會要求您新增 CALL_PHONE 權限存取資訊清單檔案:

<uses-permission android:name="android.permission.CALL_PHONE" />
動態
資料 URI 配置
  • tel:<phone-number>
  • voicemail:<phone-number>
MIME 類型

有效的電話號碼是指 網際網路工程任務組 (IETF RFC 3966) 中所述。 有效範例包括:

  • tel:2125551212
  • tel:(212) 555 1212

「電話」應用程式的撥號程式非常適合正規化處理網路,例如: 電話號碼因此,這裡描述的配置程序並不是 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);
    }
}

以下是搜尋應用程式的常見動作,包括所需資訊 建立意圖篩選器,宣傳應用程式執行各項動作的能力。

使用特定應用程式進行搜尋

Google 語音操作

  • 「搜尋 myvideoapp 上的貓咪影片」

如要在應用程式情境中支援搜尋功能,請在應用程式中使用以下內容宣告意圖篩選器: SEARCH_ACTION 動作,如以下意圖篩選器範例所示。

注意:我們不建議使用 SEARCH_ACTION 搜尋應用程式。 請改為將 GET_THING 操作,利用 Google 助理內建的應用程式內搜尋功能。若需更多資訊,請參閲 Google 助理 應用程式動作說明文件。

動態
"com.google.android.gms.actions.SEARCH_ACTION"
支援來自 Google Voice Actions 的搜尋查詢。
額外內容
QUERY
包含搜尋查詢的字串。

意圖篩選器範例:

<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

動態
ACTION_WEB_SEARCH
資料 URI 配置
MIME 類型
額外內容
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);
    }
}

設定

如要在應用程式要求使用者進行變更時,透過系統「設定」應用程式開啟畫面, 請使用下列其中一個意圖動作:

動態
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 類型

意圖範例:

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);
    }
}

發送簡訊

透過簡訊應用程式撰寫含有附件的簡訊/多媒體訊息。 使用以下程式碼建立意圖篩選器,宣傳應用程式能否執行這項動作: 請參閱下一節的資訊

撰寫含有附件的簡訊/多媒體訊息

如要傳送簡訊或多媒體訊息,請使用下列其中一個意圖動作並指定訊息 詳細資訊,例如電話號碼、主旨和郵件內文。

動態
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 物件,指向要附加的圖片或影片。

意圖範例:

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

網路瀏覽器

載入網址是網路瀏覽器應用程式的常見動作。 使用以下程式碼建立意圖篩選器,宣傳應用程式能否執行這項動作: 請參閱下一節的資訊

載入網址

Google 語音操作

  • 「開啟 example.com」

如要開啟網頁,請使用 ACTION_VIEW 動作 並在意圖資料中指定網址

動態
ACTION_VIEW
資料 URI 配置
http:<URL>
https:<URL>
MIME 類型
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

意圖範例:

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 工具,透過執行的動作來觸發特定意圖 包括:

  1. 設定要開發的 Android 裝置 或使用虛擬裝置
  2. 安裝能處理您所需意圖的應用程式版本。
  3. 使用 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
    
  4. 如果您已定義必要的意圖篩選器,請處理意圖。

若需更多資訊,請參閲 問題殼層指令