常见 intent
36365最新线路检测
📅 2025-10-04 00:01:15
✍️ admin
👁️ 2027
❤️ 802
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.
}
}
如需详细了解如何使用此 intent 拍摄照片,包括如何为输出位置创建适当的 Uri,请参阅拍摄照片或拍摄视频。
intent 过滤器示例:
处理此 intent 时,让您的 activity 检查传入的 Intent 中是否包含 EXTRA_OUTPUT extra,然后将捕获的图片或视频保存到该 extra 指定的位置,并使用 setResult() 调用 Intent,该 Intent 包含一个名为 "data" 的 extra 中的压缩缩略图。
以静态图像模式启动相机应用
Google 语音操作
“拍摄照片”
要以静态图像模式打开相机应用,请使用 INTENT_ACTION_STILL_IMAGE_CAMERA 操作。
操作
INTENT_ACTION_STILL_IMAGE_CAMERA
数据 URI 方案
无
MIME 类型
无
Extra
无
示例 intent:
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);
}
}
intent 过滤器示例:
以视频模式启动相机应用
Google 语音操作
“录制视频”
要以视频模式打开相机应用,请使用 INTENT_ACTION_VIDEO_CAMERA 操作。
操作
INTENT_ACTION_VIDEO_CAMERA
数据 URI 方案
无
MIME 类型
无
Extra
无
示例 intent:
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);
}
}
intent 过滤器示例:
“通讯录”/“人员”应用
以下是联系人管理应用的常见操作,包括您需要创建 intent 过滤器来宣传应用执行每项操作的能力所需的信息。
选择联系人
如需让用户选择联系人并向您的应用授予对所有联系人信息的访问权限,请使用 ACTION_PICK 操作并将 MIME 类型指定为 Contacts.CONTENT_TYPE。
传递给 onActivityResult() 回调的结果 Intent 包含指向所选联系人的 content: URI。该响应会授予您的应用使用 Contacts Provider API 读取相应联系人的临时权限,即使您的应用未包含 READ_CONTACTS 权限也是如此。
提示:如果您只需要访问特定的联系信息(例如电话号码或电子邮件地址),请参阅下一部分,了解如何选择特定的联系数据。
操作
ACTION_PICK
数据 URI 方案
无
MIME 类型
Contacts.CONTENT_TYPE
示例 intent:
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 后检索联系人详细信息,请参阅检索联系人的详细信息。
使用此 intent 检索联系人 URI 时,您通常不需要 READ_CONTACTS 权限即可读取相应联系人的基本详细信息,例如显示名称和联系人是否已加星标。不过,如果您想读取有关特定联系人的更具体的数据(例如电话号码或电子邮件地址),则需要 READ_CONTACTS 权限。
选择特定联系人数据
如需让用户从联系人中选择特定信息(例如电话号码、电子邮件地址或其他数据类型),请使用 ACTION_PICK 操作,并将 MIME 类型指定为以下内容类型之一,例如 CommonDataKinds.Phone.CONTENT_TYPE 可获取联系人的电话号码。
注意: 在许多情况下,您的应用需要具有 READ_CONTACTS 权限才能查看特定联系人的具体信息。
如果您只需要从联系人处检索一种类型的数据,那么与使用 Contacts.CONTENT_TYPE 相比,这种使用来自 ContactsContract.CommonDataKinds 类的 CONTENT_TYPE 的技术更高效,如上一部分所示。该结果可让您直接访问所需数据,而无需对联系人提供程序执行更复杂的查询。
传递给 onActivityResult() 回调的结果 Intent 包含指向所选联系人数据的 content: URI。该响应会授予您的应用临时权限来读取相应联系人数据,即使您的应用不包含 READ_CONTACTS 权限也是如此。
操作
ACTION_PICK
数据 URI 方案
无
MIME 类型
CommonDataKinds.Phone.CONTENT_TYPE
从有电话号码的联系人中选择。
CommonDataKinds.Email.CONTENT_TYPE
从包含电子邮件地址的联系人中选择。
CommonDataKinds.StructuredPostal.CONTENT_TYPE
从拥有邮寄地址的联系人中选择。
或者 ContactsContract 下的许多其他 CONTENT_TYPE 值之一。
示例 intent:
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 = 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 将相应联系人指定为 intent 数据。
最初检索联系人的 URI 主要有两种方式:
使用上一部分中显示的 ACTION_PICK 操作返回的联系人 URI。此方法不需要任何应用权限。
直接访问所有联系人的列表,如检索联系人列表中所述。此方法需要 READ_CONTACTS 权限。
操作
ACTION_VIEW
数据 URI 方案
content:
MIME 类型
无。类型是从联系人 URI 推断出来的。
示例 intent:
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 的 intent 数据,并在 ContactsContract.Intents.Insert 中由常量指定的 extra 中包含任何已知的联系人信息。
最初检索联系人 URI 主要有两种方式:
使用上一部分中显示的 ACTION_PICK 操作返回的联系人 URI。此方法不需要任何应用权限。
直接访问所有联系人的列表,如检索联系人列表中所述。此方法需要 READ_CONTACTS 权限。
操作
ACTION_EDIT
数据 URI 方案
content:
MIME 类型
类型是从联系人 URI 推断出来的。
Extra
ContactsContract.Intents.Insert中定义的一个或多个 extra,以便您填充联系人详细信息的字段。
示例 intent:
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);
}
}
如需详细了解如何修改联系人,请参阅使用 intent 修改联系人。
插入联系人
如需插入新联系人,请使用 ACTION_INSERT 操作,将 Contacts.CONTENT_TYPE 指定为 MIME 类型,并在 ContactsContract.Intents.Insert 中由常量指定的 extra 中包含任何已知的联系人信息。
操作
ACTION_INSERT
数据 URI 方案
无
MIME 类型
Contacts.CONTENT_TYPE
Extra
ContactsContract.Intents.Insert 中定义的一个或多个 extra。
示例 intent:
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);
}
}
如需详细了解如何插入联系人,请参阅使用 intent 修改联系人。
电子邮件
撰写包含可选附件的电子邮件是电子邮件应用的常见操作。
使用下一部分中的信息创建一个 intent 过滤器,以宣传您的应用执行此操作的能力。
撰写带有可选附件的电子邮件
如需撰写电子邮件,请根据是否要添加附件,使用以下操作之一,并使用列出的额外键添加收件人、主题等电子邮件详细信息。
操作
ACTION_SENDTO(无附件)或
ACTION_SEND(一个附件)或
ACTION_SEND_MULTIPLE(多个附件)
数据 URI 方案
无
MIME 类型
"text/plain"
"*/*"
Extra
Intent.EXTRA_EMAIL
包含所有“收件人”电子邮件地址的字符串数组。
Intent.EXTRA_CC
包含所有“抄送”收件人电子邮件地址的字符串数组。
Intent.EXTRA_BCC
包含所有“密送”收件人电子邮件地址的字符串数组。
Intent.EXTRA_SUBJECT
包含电子邮件主题的字符串。
Intent.EXTRA_TEXT
包含电子邮件正文的字符串。
Intent.EXTRA_STREAM
指向附件的 Uri。
如果使用 ACTION_SEND_MULTIPLE 操作,则此属性改为包含多个 Uri 对象的 ArrayList。
示例 intent:
Kotlin
fun composeEmail(addresses: Array, 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);
}
}
如果您想确保您的 intent 仅由电子邮件应用处理,而不是由短信应用或社交应用处理,请使用 ACTION_SENDTO 操作并添加 "mailto:" 数据方案,如以下示例所示:
Kotlin
fun composeEmail(addresses: Array, 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);
}
}
intent 过滤器示例:
文件存储空间
以下是文件存储应用的常见操作,包括您需要创建 intent 过滤器来宣传应用执行每项操作的能力所需的信息。
检索特定类型的文件
要请求用户选择文档或照片等文件并向您的应用返回引用,请使用 ACTION_GET_CONTENT 操作并指定所需的 MIME 类型。返回给应用的文件引用对 Activity 当前生命周期而言是临时引用,因此如果您之后想访问该文件,则必须导入可之后读取的副本。
此 intent 还允许用户在此过程中创建新文件。例如,用户可以不选择现有照片,而是使用相机拍摄新照片。
传递给 onActivityResult() 方法的结果 intent 包含指向相应文件的 URI 数据。该 URI 可以是任何 URI,例如 http: URI、file: URI 或 content: URI。不过,如果您想将可选择的文件限制为仅限那些可从内容提供程序 (content: URI) 访问且可作为具有 openFileDescriptor() 的文件流使用的文件,请向 intent 添加 CATEGORY_OPENABLE 类别。
在 Android 4.3(API 级别 18)及更高版本中,您还可以通过向 intent 添加 EXTRA_ALLOW_MULTIPLE(设置为 true)来让用户选择多个文件。然后,您就可以访问 getClipData() 返回的 ClipData 对象中的每个所选文件。
操作
ACTION_GET_CONTENT
数据 URI 方案
无
MIME 类型
与用户需要选择的文件类型对应的 MIME 类型。
Extra
EXTRA_ALLOW_MULTIPLE
一个布尔值,用于声明用户是否可以一次选择多个文件。
EXTRA_LOCAL_ONLY
一个布尔值,用于声明返回的文件是否必须直接从设备获取,而不是需要从远程服务下载。
类别(可选)
CATEGORY_OPENABLE
仅返回可表示为具有 openFileDescriptor() 的文件流的“可打开”文件。
获取照片的 intent 示例:
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.
...
}
}
用于返回照片的 Intent 过滤器示例:
打开特定类型的文件
在 Android 4.4 或更高版本上运行时,您可以使用 ACTION_OPEN_DOCUMENT 操作并指定 MIME 类型,请求打开由其他应用管理的文件,而不是检索必须导入到应用中的文件副本。ACTION_GET_CONTENT如需同时允许用户创建您的应用可以写入的新文档,请改用 ACTION_CREATE_DOCUMENT 操作。
例如,ACTION_CREATE_DOCUMENT intent 可让用户选择要在何处创建新文档,例如在管理文档存储空间的另一个应用中,而不是从现有 PDF 文档中进行选择。然后,您的应用会收到可用于写入新文档的 URI 位置。
虽然从 ACTION_GET_CONTENT 操作传递到 onActivityResult() 方法的 intent 可能会返回任何类型的 URI,但来自 ACTION_OPEN_DOCUMENT 和 ACTION_CREATE_DOCUMENT 的结果 intent 始终将所选文件指定为由 DocumentsProvider 支持的 content: URI。您可以使用 openFileDescriptor() 打开文件,并使用 DocumentsContract.Document 中的列查询其详细信息。
返回的 URI 会授予您的应用对文件的长期读取权限,也可能包括写入权限。如果您想读取现有文件,但不想将其复制到应用中,或者想就地打开并修改文件,ACTION_OPEN_DOCUMENT 操作会特别有用。
您还可以通过向 intent 添加 EXTRA_ALLOW_MULTIPLE(设置为 true)来允许用户选择多个文件。如果用户仅选择了一项内容,则可以从 getData() 中检索该内容。
如果用户选择多项内容,则 getData() 会返回 null,您必须改为从 getClipData() 返回的 ClipData 对象中检索每项内容。
注意:您的 intent 必须指定 MIME 类型,并且必须声明 CATEGORY_OPENABLE 类别。如果合适,您可以通过添加包含 MIME 类型的数组来指定多个 MIME 类型(使用 EXTRA_MIME_TYPES extra)。如果这样做,您必须将 setType() 中的主要 MIME 类型设置为 "*/*"。
操作
ACTION_OPEN_DOCUMENT 或
ACTION_CREATE_DOCUMENT
数据 URI 方案
无
MIME 类型
与用户需要选择的文件类型对应的 MIME 类型。
Extra
EXTRA_MIME_TYPES
与应用请求的文件类型对应的 MIME 类型数组。使用此 extra 时,您必须将 setType() 中的主要 MIME 类型设置为 "*/*"。
EXTRA_ALLOW_MULTIPLE
一个布尔值,用于声明用户是否可以一次选择多个文件。
EXTRA_TITLE
与 ACTION_CREATE_DOCUMENT 搭配使用,用于指定初始文件名。
EXTRA_LOCAL_ONLY
一个布尔值,用于声明返回的文件是否必须直接从设备获取,而不是需要从远程服务下载。
类别
CATEGORY_OPENABLE
仅返回可表示为具有 openFileDescriptor() 的文件流的“可打开”文件。
获取照片的 intent 示例:
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 操作的 intent。而是由系统接收此 Intent,并在统一界面中显示各类应用提供的所有文件。
如需在此界面中提供应用的文件并允许其他应用打开这些文件,您必须实现 DocumentsProvider 并包含 PROVIDER_INTERFACE ("android.content.action.DOCUMENTS_PROVIDER") 的 intent 过滤器,如下例所示:
android:grantUriPermissions="true"
android:exported="true"
android:permission="android.permission.MANAGE_DOCUMENTS">
如需详细了解如何使其他应用能够打开由您的应用管理的文件,请参阅使用存储访问框架打开文件。
本地操作
叫车是一项常见的本地操作。使用下一部分中的信息创建一个 intent 过滤器,以宣传您的应用执行此操作的能力。
叫车
Google 语音操作
“给我叫辆出租车”
“给我叫辆车”
(仅适用于 Wear OS)
如需叫出租车,请使用 ACTION_RESERVE_TAXI_RESERVATION 操作。
注意:应用必须先征得用户确认,然后才能完成此操作。
操作
ACTION_RESERVE_TAXI_RESERVATION
数据 URI
无
MIME 类型
无
Extra
无
示例 intent:
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);
}
}
intent 过滤器示例:
Google 地图
在地图上显示位置是地图应用的常见操作。
使用下一部分中的信息创建一个 intent 过滤器,以宣传您的应用执行此操作的能力。
显示地图上的位置
如需打开地图,请使用 ACTION_VIEW 操作,并通过以下任一方案在 intent 数据中指定位置信息。
操作
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
显示“我的街道地址”的位置,可以是具体地址或位置查询。
示例:"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
注意:geo URI 中传递的所有字符串都必须进行编码。例如,字符串 1st & Pike, Seattle 会变为 1st%20%26%20Pike%2C%20Seattle。字符串中的空格使用 %20 进行编码,或替换为加号 (+)。
MIME 类型
无
示例 intent:
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);
}
}
intent 过滤器示例:
音乐或视频
以下是音乐和视频应用的常见操作,包括您需要创建 intent 过滤器来宣传应用执行每项操作的能力所需的信息。
播放媒体文件
要播放音乐文件,请使用 ACTION_VIEW 操作,并在 Intent 数据中指定文件的 URI 位置。
操作
ACTION_VIEW
数据 URI 方案
file:
content:
http:
MIME 类型
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
或者您的应用所需的任何其他权限。
示例 intent:
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);
}
}
intent 过滤器示例:
基于搜索查询播放音乐
Google 语音操作
“播放 michael jackson 的《billie jean》”
要根据搜索查询播放音乐,请使用 INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH Intent。应用可能会响应用户播放音乐的语音指令而触发此 intent。接收此 Intent 的应用会在其音乐库内搜索与指定查询匹配的现有内容,并在找到后开始播放该内容。
在此 intent 中,添加 EXTRA_MEDIA_FOCUS 字符串 extra,用于指定预期搜索模式。例如,搜索模式可指定搜索的是音乐人姓名还是歌曲名称。
操作
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
数据 URI 方案
无
MIME 类型
无
Extra
MediaStore.EXTRA_MEDIA_FOCUS(必需)
表示搜索模式:用户是在寻找特定音乐人、专辑、歌曲还是播放列表。大多数搜索模式都需要用到其他 extra。例如,如果用户想要收听某一首特定的歌曲,Intent 可能需要用到另外三个 extra:歌曲名称、音乐人和专辑。对于 EXTRA_MEDIA_FOCUS 的每个值,此 Intent 都支持下列搜索模式:
任意 - "vnd.android.cursor.item/*"
随机播放音乐。接收应用会根据智能选择播放一些音乐,例如用户上次听过的播放列表。
其他 extra:
QUERY(必需):一个空字符串。此 extra 始终提供,以实现向后兼容性。不知道搜索模式的现有应用可以将此 intent 处理为非结构化搜索。
非结构化 - "vnd.android.cursor.item/*"
通过非结构化搜索查询播放特定歌曲、专辑或流派的音乐。如果应用无法确定用户想要收听的内容类型,则可以生成具有此搜索模式的 intent。尽可能使用更具体的搜索模式。
其他 extra:
QUERY(必需):一个字符串,其中包含音乐人、专辑、歌曲名称或流派的任意组合。
类型 -
Audio.Genres.ENTRY_CONTENT_TYPE
播放特定类型的音乐。
其他 extra:
"android.intent.extra.genre"(必需)- 类型。
QUERY(必需):流派。此 extra 始终提供,以实现向后兼容性。不知道搜索模式的现有应用可以将此 intent 处理为非结构化搜索。
音乐人 -
Audio.Artists.ENTRY_CONTENT_TYPE
播放特定艺术家的音乐。
其他 extra:
EXTRA_MEDIA_ARTIST(必需):音乐人。
"android.intent.extra.genre":流派。
QUERY(必需):包含艺术家或流派的任意组合的字符串。此 extra 始终提供,以实现向后兼容性。
不知道搜索模式的现有应用可以将此 intent 处理为非结构化搜索。
专辑 -
Audio.Albums.ENTRY_CONTENT_TYPE
播放特定专辑的音乐。
其他 extra:
EXTRA_MEDIA_ALBUM(必需):相册。
EXTRA_MEDIA_ARTIST:音乐人。
"android.intent.extra.genre":流派。
QUERY(必需):一个字符串,包含专辑或艺术家的任意组合。此 extra 始终提供,以实现向后兼容性。不知道搜索模式的现有应用可以将此 intent 处理为非结构化搜索。
歌曲 - "vnd.android.cursor.item/audio"
播放特定歌曲。
其他 extra:
EXTRA_MEDIA_ALBUM:相册。
EXTRA_MEDIA_ARTIST:音乐人。
"android.intent.extra.genre":流派。
EXTRA_MEDIA_TITLE(必需):歌曲名称。
QUERY(必需):一个字符串,包含专辑、音乐人、流派或歌名的任意组合。此 extra 始终提供,以实现向后兼容性。不知道搜索模式的现有应用可以将此 intent 处理为非结构化搜索。
播放列表 - Audio.Playlists.ENTRY_CONTENT_TYPE
Android 播放列表已被弃用。我们不再维护该 API,但为了兼容性而保留了当前的功能。
播放特定播放列表或符合其他 extra 指定的某些条件的播放列表。
其他 extra:
EXTRA_MEDIA_ALBUM:相册。
EXTRA_MEDIA_ARTIST:音乐人。
"android.intent.extra.genre":流派。
"android.intent.extra.playlist":播放列表。
EXTRA_MEDIA_TITLE:播放列表所依据的歌曲名称。
QUERY(必需):一个字符串,包含专辑、音乐人、流派、播放列表或歌曲名称的任意组合。此 extra 始终提供,以实现向后兼容性。不知道搜索模式的现有应用可以将此 intent 处理为非结构化搜索。
示例 intent:
如果用户想听特定音乐人的音乐,搜索应用可能会生成以下 intent:
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);
}
}
intent 过滤器示例:
在 activity 中处理此 intent 时,请检查传入的 Intent 中的 EXTRA_MEDIA_FOCUS extra 的值,以确定搜索模式。当 activity 识别出搜索模式后,读取该特定搜索模式的额外 extra 的值。有了这些信息,应用便可在其媒体资源中执行搜索,以播放与搜索查询匹配的内容。详见下例。
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);
}
}
}
新建记事
创建笔记是记事应用的常见操作。
使用下一部分中的信息创建一个 intent 过滤器,以宣传您的应用执行此操作的能力。
创建记事
如需创建新记事,请使用
ACTION_CREATE_NOTE 操作,并使用以下 extra 指定记事详细信息,例如主题和文本。
注意:应用必须先征得用户确认,然后才能完成此操作。
操作
ACTION_CREATE_NOTE
数据 URI 方案
无
MIME 类型
PLAIN_TEXT_TYPE
"*/*"
Extra
EXTRA_NAME
一个字符串,用于指明笔记的标题或主题。
EXTRA_TEXT
一个字符串,用于指示备注的文本。
示例 intent:
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);
}
}
intent 过滤器示例:
电话
发起通话是手机应用的常见操作。
使用下一部分中的信息创建一个 intent 过滤器,以宣传您的应用执行此操作的能力。
拨打电话
如需打开电话应用并拨打某个电话号码,请使用 ACTION_DIAL 操作,并使用以下 URI 架构指定电话号码。当电话应用打开时,它会显示电话号码,用户必须点按拨号按钮才能开始通话。
Google 语音操作
“拨打 555-5555”
“打电话给 bob”
“发语音邮件”
如需直接拨打电话,请使用 ACTION_CALL 操作,并使用以下 URI 架构指定电话号码。当“电话”应用打开时,系统会开始拨打电话。用户无需点按通话按钮。
ACTION_CALL 操作要求您向清单文件添加 CALL_PHONE 权限:
操作
ACTION_DIAL - 打开拨号器或“电话”应用。
ACTION_CALL - 拨打电话(需要 CALL_PHONE 权限)
数据 URI 方案
tel:
voicemail:
MIME 类型
无
有效电话号码是指 IETF RFC 3966 中定义的电话号码。举例来说,有效电话号码包括下列号码:
tel:2125551212
tel:(212) 555 1212
“电话”应用的拨号器能够很好地对架构(例如电话号码)进行标准化。因此,Uri.parse() 方法中并不严格要求使用所描述的方案。不过,如果您尚未试用过某架构,或者不确定是否可以处理该架构,请改用 Uri.fromParts() 方法。
示例 intent:
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);
}
}
搜索
以下是搜索应用的常见操作,包括您需要创建 intent 过滤器来宣传应用执行每项操作的能力所需的信息。
使用特定应用搜索
Google 语音操作
“在我的视频应用中搜索有关猫的视频”
如需支持在应用上下文中进行搜索,请在应用中声明一个具有 SEARCH_ACTION 操作的 intent 过滤器,如以下 intent 过滤器示例所示。
注意:我们不建议使用 SEARCH_ACTION 进行应用搜索。
请改为实现 GET_THING 操作,以利用 Google 助理对应用内搜索的内置支持。如需了解详情,请参阅 Google 助理的应用操作文档。
操作
"com.google.android.gms.actions.SEARCH_ACTION"
支持来自 Google 语音操作的搜索查询。
Extra
QUERY
包含搜索查询的字符串。
intent 过滤器示例:
执行网页搜索
如需发起网络搜索,请使用 ACTION_WEB_SEARCH 操作,并在 SearchManager.QUERY extra 中指定搜索字符串。
操作
ACTION_WEB_SEARCH
数据 URI 方案
无
MIME 类型
无
Extra
SearchManager.QUERY
搜索字符串。
示例 intent:
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);
}
}
设置
当您的应用需要用户更改某些内容时,如需在系统“设置”应用中打开某个界面,请使用以下任一 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 类型
无
示例 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);
}
}
在线聊天
撰写包含附件的短信/彩信是即时通讯应用的一项常见操作。使用下一部分中的信息创建一个 intent 过滤器,以宣传您的应用执行此操作的能力。
撰写带附件的短信/彩信
如需发起短信或彩信,请使用以下 intent 操作之一,并使用以下 extra 键指定电话号码、主题和消息正文等消息详细信息。
操作
ACTION_SENDTO 或
ACTION_SEND 或
ACTION_SEND_MULTIPLE
数据 URI 方案
sms:
smsto:
mms:
mmsto:
这些方案的处理方式都相同。
MIME 类型
"text/plain"
"image/*"
"video/*"
Extra
"subject"
消息主题的字符串(通常仅适用于彩信)。
"sms_body"
文本消息的字符串。
EXTRA_STREAM
指向要附加的图片或视频的 Uri。如果使用 ACTION_SEND_MULTIPLE 操作,此 extra 是一个 Uri 对象的 ArrayList,指向要附加的图片或视频。
示例 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);
}
}
如果您想确保您的 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);
}
}
intent 过滤器示例:
注意:如果您要开发短信/彩信应用,则必须为多个其他操作实现 intent 过滤器,才能在 Android 4.4 及更高版本上作为默认短信应用使用。如需了解详情,请参阅 Telephony 中的文档。
网络浏览器
加载网址是网络浏览器应用的常见操作。使用下一部分中的信息创建一个 intent 过滤器,以宣传您的应用执行此操作的能力。
加载网址
Google 语音操作
“打开 example.com”
要打开网页,请使用 ACTION_VIEW 操作,并在 Intent 数据中指定网址。
操作
ACTION_VIEW
数据 URI 方案
http:
https:
MIME 类型
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
示例 intent:
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);
}
}
intent 过滤器示例:
提示:如果您的 Android 应用提供与您的网站相似的功能,请为指向您网站的网址添加一个 Intent 过滤器。然后,如果用户安装了您的应用,那么电子邮件或其他网页中指向您网站的链接会打开您的 Android 应用,而不是您的网页。如需了解详情,请参阅处理 Android 应用链接。
从 Android 12(API 级别 31)开始,仅当您的应用获准处理某个通用网络 intent 中包含的特定网域时,该网络 intent 才会解析为应用中的 activity。如果您的应用未获准处理相应的网域,则该网络 intent 会解析为用户的默认浏览器应用。
使用 Android 调试桥验证 intent
如需验证应用是否会响应您想要支持的 intent,您可以使用 adb 工具来触发特定 intent,方法如下:
设置 Android 设备以进行开发,或使用虚拟设备。
安装一个处理您想支持的 Intent 的应用版本。
使用 adb 触发 intent:
adb shell am start -a -t -d \
-e -n
例如:
adb shell am start -a android.intent.action.DIAL \
-d tel:555-5555 -n org.example.MyApp/.MyActivity
如果您定义了所需的 intent 过滤器,请处理该 intent。
如需了解详情,请参阅发出 shell 命令。