利用 intent,您可以通过描述
您想要执行的操作,例如“查看地图”或“拍摄
图片”位于 Intent
对象中。这种类型的 intent
称为隐式 intent,因为它未指定应用
组件启动,而是指定一项操作并提供
用于执行操作的某些数据。
当你拨打 startActivity()
时
或 startActivityForResult()
并向其传递隐式 intent,系统会
解决
将 intent 传递给可以处理该 intent 并启动其
相应的 Activity
。如果有不止一个应用
处理 intent 时,系统会向用户显示一个对话框,供其
选择要使用的应用。
本页面介绍了几种隐式 intent,可用于执行 按处理 intent 的应用类型整理的常用操作。每个 第 2 部分还介绍了如何创建意图 过滤条件来宣传您的应用执行相应操作的能力。
注意:如果设备上没有可
收到隐式 intent,则应用在调用 startActivity()
时会崩溃。要先验证
存在可接收 intent 的应用,请对 Intent
对象调用 resolveActivity()
。如果结果为非空,则至少存在
一个可以处理 intent 的应用,可以安全地调用 startActivity()
。如果结果
null,请勿使用该 intent,如有可能,请停用
调用 intent 的功能。
如果您不熟悉如何创建 intent 或 intent 过滤器,请先阅读 intent 和 intent 过滤器。
如需了解如何从开发中触发本页面上所列的 intent 请参阅使用 Android 调试验证 intent 桥接部分。
Google Voice Actions
Google 语音操作会触发本页面上所列的一些 Intent 来响应语音指令。有关详情,请参见 系统语音操作使用入门。
闹钟
以下是闹钟应用的常见操作,包括您需要的信息 创建一个 intent 过滤器,以通告您的应用执行各项操作的能力。
创建闹铃
如要创建新闹钟,请使用 ACTION_SET_ALARM
操作,并使用下列 extra 指定闹钟详细信息(如时间和消息)。
注意:搭载 Android 2.3(API 级别 9)及更低版本的设备只提供小时、分钟和内容 extra。其他额外功能在 平台。
- 操作
ACTION_SET_ALARM
- 数据 URI
- 无
- MIME 类型
- 无
- Extra
-
EXTRA_HOUR
- 闹钟的小时。
EXTRA_MINUTES
- 闹钟的分钟数。
EXTRA_MESSAGE
- 用于标识闹钟的自定义消息。
EXTRA_DAYS
- 包含此闹钟的每个工作日的
ArrayList
重复。必须使用Calendar
中的整数来声明每一天 例如MONDAY
。对于一次性闹钟,请勿指定此 extra。
EXTRA_RINGTONE
- 一个
content:
URI,用于指定闹钟使用的铃声,VALUE_RINGTONE_SILENT
用于指定闹钟使用的铃声。要使用默认铃声,请不要指定此 extra。
EXTRA_VIBRATE
- 一个布尔值,用于指定此闹钟是否振动。
EXTRA_SKIP_UI
- 一个布尔值,用于指定响应闹钟的应用在设置闹钟时是否必须跳过其界面。 如果为 true,应用必须绕过任何确认界面并设置指定的闹钟。
示例 intent:
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
intent,您的应用必须具有
SET_ALARM
权限:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
intent 过滤器示例:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
创建定时器
要创建倒计时器,请使用 ACTION_SET_TIMER
操作并指定计时器
时长等详细信息。
注意:此 intent 可用 (Android 4.4(API 级别 19)及更高版本)。
- 操作
ACTION_SET_TIMER
- 数据 URI
- 无
- MIME 类型
- 无
- Extra
-
EXTRA_LENGTH
- 计时器的时长(以秒为单位)。
EXTRA_MESSAGE
- 用于标识计时器的自定义消息。
EXTRA_SKIP_UI
- 一个布尔值,用于指定做出响应的应用在设置计时器时是否必须跳过其界面。 如果为 true,应用必须绕过任何确认界面并启动指定的计时器。
示例 intent:
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
intent,您的应用必须具有
SET_ALARM
权限:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
intent 过滤器示例:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
显示所有闹钟
要显示闹钟列表,请使用 ACTION_SHOW_ALARMS
操作。
尽管调用此 intent 的应用并不多,但它主要由系统应用使用, 任何充当闹钟的应用都可以实现 此 intent 过滤器并通过显示当前闹钟列表进行响应。
注意:此 intent 可用 (Android 4.4(API 级别 19)及更高版本)。
- 操作
ACTION_SHOW_ALARMS
- 数据 URI
- 无
- MIME 类型
- 无
intent 过滤器示例:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
日历
添加活动是日历应用的常见操作。 创建一个 intent 过滤器,使用 相关信息。
添加日历活动
要向用户的日历中添加新活动,请使用
ACTION_INSERT
操作,并使用
Events.CONTENT_URI
。
然后,您可以使用以下 extra 指定各种活动详细信息。
- 操作
ACTION_INSERT
- 数据 URI
Events.CONTENT_URI
- MIME 类型
"vnd.android.cursor.dir/event"
- Extra
-
EXTRA_EVENT_ALL_DAY
- 一个布尔值,用于指定此事件是否为全天事件。
EXTRA_EVENT_BEGIN_TIME
- 事件的开始时间(从公元纪年开始计算的毫秒数)。
EXTRA_EVENT_END_TIME
- 事件的结束时间(从公元纪年开始计算的毫秒数)。
TITLE
- 活动标题。
DESCRIPTION
- 活动说明。
EVENT_LOCATION
- 活动地点。
EXTRA_EMAIL
- 以逗号分隔的受邀者电子邮件地址列表。
可以使用
CalendarContract.EventsColumns
类。
示例 intent:
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); } }
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>
相机
以下是相机应用的常见操作,包括您需要的信息 创建一个 intent 过滤器,以通告您的应用执行各项操作的能力。
拍摄照片或视频并将其返回给相关应用
如需打开相机应用并接收生成的照片或视频,请使用 ACTION_IMAGE_CAPTURE
或 ACTION_VIDEO_CAPTURE
操作。还要指定
例如使用相机在 EXTRA_OUTPUT
中保存照片或视频
extra。
- 操作
ACTION_IMAGE_CAPTURE
或
ACTION_VIDEO_CAPTURE
- 数据 URI 架构
- 无
- MIME 类型
- 无
- Extra
-
EXTRA_OUTPUT
- 相机应用保存照片的 URI 位置,或
视频文件(以
Uri
对象的形式指定)。
当相机应用成功返回时
将焦点置于您的 activity(换句话说,您的应用会收到 onActivityResult()
回调),而
可通过您指定的 URI 访问照片或视频
并使用 EXTRA_OUTPUT
值。
注意:当您使用 ACTION_IMAGE_CAPTURE
时,
相机可能会返回
结果 Intent
中照片的缩小副本(或缩略图),以 Bitmap
形式保存在名为
"data"
。
示例 intent:
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)或更高版本上实现这一点,请参阅以下 intent 示例。
示例 intent:
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>
有关如何使用此 intent 拍照的详细信息,包括
如何为输出位置创建适当的 Uri
,请参阅
拍照或
拍摄视频。
intent 过滤器示例:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
处理此 intent 时,让您的 activity 检查传入的 Intent
中是否存在 EXTRA_OUTPUT
extra,然后将拍摄的图片或视频保存到
该 extra 指定的位置,并使用 Intent
(在 extra 中包含压缩缩略图)调用 setResult()
。
名为 "data"
。
以静态图像模式启动相机应用
要以静态图像模式打开相机应用,请使用 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 过滤器示例:
<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 类型
- 无
- 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 过滤器示例:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
“通讯录”/“联系人”应用
以下是联系人管理应用的常见操作,包括您需要的信息 创建一个 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 类型指定为 1
以下内容类型,例如
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
。
示例 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<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 作为 intent 数据指定联系人。
初次检索联系人 URI 的方法有两种:
- 使用
ACTION_PICK
操作返回的联系人 URI 如上一部分所示。此方法不需要任何应用权限。 - 直接访问所有联系人的列表,如检索
联系人。此方法需要使用
READ_CONTACTS
权限。
- 操作
ACTION_VIEW
- 数据 URI 架构
content:<URI>
- 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 指定联系人
并将任何已知联系信息包含在由
ContactsContract.Intents.Insert
中的常量。
初次检索联系人 URI 有两种主要方法:
- 使用
ACTION_PICK
操作返回的联系人 URI 如上一部分所示。此方法不需要任何应用权限。 - 直接访问所有联系人的列表,如检索
联系人。此方法需要使用
READ_CONTACTS
权限。
- 操作
ACTION_EDIT
- 数据 URI 架构
content:<URI>
- 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
中的常量。
- 操作
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 过滤器,使用 相关信息。
撰写带有可选附件的电子邮件
要撰写电子邮件,请根据您是否在其中添加附件,采取以下操作之一: 并使用列出的 extra 键加入电子邮件详细信息,如收件人和主题。
- 操作
ACTION_SENDTO
(表示无附件)或
ACTION_SEND
(适用于带 1 个附件)或
ACTION_SEND_MULTIPLE
(适用于带多个附件的邮件)- 数据 URI 架构
- 无
- MIME 类型
-
"text/plain"
"*/*"
- Extra
-
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
对象。
示例 intent:
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); } }
如果您想确保 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); } }
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>
文件存储空间
以下是文件存储应用的常见操作,包括您需要的信息 创建一个 intent 过滤器,以通告您的应用执行各项操作的能力。
检索特定类型的文件
要请求用户选择文档或照片等文件并向您的应用返回引用,请使用 ACTION_GET_CONTENT
操作并指定所需的 MIME 类型。返回给应用的文件引用对 Activity 当前生命周期而言是临时引用,因此如果您之后想访问该文件,则必须导入可之后读取的副本。
用户还可以使用此 intent 在进程中创建新文件。对于 例如,用户无需选择现有照片,而是可以使用相机拍摄新照片。
传送至您的 onActivityResult()
方法的结果 intent 包含的数据具有指向该文件的 URI。
URI 可以是任何内容,例如 http:
URI、file:
URI 或 content:
URI不过,如果您想将可选择的文件限制为仅限可访问的文件
来自 content provider (content:
URI) 的通知,且以文件流的形式提供,且
openFileDescriptor()
,
添加
CATEGORY_OPENABLE
类别添加到您的 intent 中。
在 Android 4.3(API 级别 18)及更高版本中,
您还可以添加
将 EXTRA_ALLOW_MULTIPLE
设置为 intent(设置为 true
)。
然后,您可以在ClipData
中访问所选的每个文件
getClipData()
返回的对象。
- 操作
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 过滤器:
<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
intent 让用户可以选择想要在哪里创建新文档,例如在另一个应用内
管理文档存储空间然后,您的应用会收到它所在的 URI 位置
可以写入新文档。
而向onActivityResult()
传递的 intent
方法(位于 ACTION_GET_CONTENT
操作中)
返回任何类型的 URI(来自 ACTION_OPEN_DOCUMENT
的结果 intent)
和 ACTION_CREATE_DOCUMENT
始终将所选文件指定为由 DocumentsProvider
支持的 content:
URI。您可以打开
包含 openFileDescriptor()
和
使用 DocumentsContract.Document
中的列查询其详细信息。
返回的 URI 会为您的应用授予对文件的长期读取权限,还可能会授予
以及写入权限ACTION_OPEN_DOCUMENT
操作为
特别适用于您想读取现有文件而不将副本复制到您的应用的情况
或想就地打开和编辑文件。
您还可以通过添加
将 EXTRA_ALLOW_MULTIPLE
设置为 intent(设置为 true
)。
如果用户只选择一项,您可以从 getData()
检索该项。
如果用户选择多项,getData()
会返回 null,而您必须改为选择
从 ClipData
中检索每一项
该对象由 getClipData()
返回。
注意:您的 intent 必须指定 MIME 类型并
必须声明 CATEGORY_OPENABLE
类别。如果
您可以指定多个 MIME 类型,只需添加包含
EXTRA_MIME_TYPES
extra,如果您这样做,则必须将
将 setType()
中的主要 MIME 类型更改为 "*/*"
。
- 操作
ACTION_OPEN_DOCUMENT
或
ACTION_CREATE_DOCUMENT
- 数据 URI 架构
- 无
- MIME 类型
- 与用户需要选择的文件类型对应的 MIME 类型。
- Extra
-
EXTRA_MIME_TYPES
- 与您的应用的文件类型对应的 MIME 类型数组
请求。使用此 extra 时,您必须在
setType()
至"*/*"
。 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,并在统一界面中显示各类应用提供的所有文件。
要在此界面中提供应用的文件并让其他应用打开它们,您必须实现
DocumentsProvider
,并包含用于以下用途的 intent 过滤器:
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>
如需详细了解如何从其他应用打开您的应用管理的文件,请按以下步骤操作: 请参阅使用存储访问框架打开文件。
本地操作
致电汽车是常见的本地操作。创建一个 intent 过滤器来公布应用的 使用下一部分中的信息执行此操作的能力。
叫车
要叫车,请使用
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 过滤器示例:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Google 地图
在地图上显示位置是地图应用的常见操作。 创建一个 intent 过滤器,使用 相关信息。
显示地图上的位置
要打开地图,请使用 ACTION_VIEW
操作并指定
使用以下某个 scheme 传递 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 过滤器示例:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
音乐或视频
以下是适用于音乐和视频应用的常见操作,包括您需要的信息 创建一个 intent 过滤器,以通告您的应用执行各项操作的能力。
播放媒体文件
要播放音乐文件,请使用 ACTION_VIEW
操作,并在 Intent 数据中指定文件的 URI 位置。
- 操作
ACTION_VIEW
- 数据 URI 架构
-
file:<URI>
content:<URI>
http:<URL>
- 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 过滤器示例:
<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
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
(必需):包含任意组合的字符串 音乐人、专辑、歌曲名称或流派。
-
播放特定类型的音乐。
其他 extra:
"android.intent.extra.genre"
(必需)- 类型。QUERY
(必需):类型。始终提供此 extra 以实现向后兼容性不了解搜索模式的现有应用可以处理 将此 intent 视为非结构化搜索。
-
播放特定艺术家的音乐。
其他 extra:
EXTRA_MEDIA_ARTIST
(必需):音乐人。"android.intent.extra.genre"
:类型。QUERY
(必需):包含任意组合的 音乐人或流派始终提供此 extra,以实现向后兼容性。 不了解搜索模式的现有应用可将此 intent 处理为非结构化 搜索。
-
播放特定专辑的音乐。
其他 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 始终适用于 向后兼容性不了解搜索模式的现有应用可以处理此问题 非结构化搜索。
-
播放特定播放列表或符合其他 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-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
在您的 Activity 中处理此 Intent 时,请检查
在传入请求中出现 EXTRA_MEDIA_FOCUS
个 extra
Intent
用于确定搜索模式。系统识别出您的活动后
搜索模式,请阅读该特定搜索模式的其他 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 过滤器,使用 相关信息。
创建记事
要创建新记事,请使用
<ph type="x-smartling-placeholder"></ph>
ACTION_CREATE_NOTE
操作,并使用以下 extra 指定备注详细信息,例如主题和文本。
注意:应用必须请求用户确认 然后再完成这项操作
- 操作
-
ACTION_CREATE_NOTE
- 数据 URI 架构
- 无
- MIME 类型
-
PLAIN_TEXT_TYPE
- "*/*"
- Extra
-
-
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 的搜索查询。
- Extra
-
QUERY
- 包含搜索查询的字符串。
- 操作
ACTION_WEB_SEARCH
- 数据 URI 架构
- 无
- MIME 类型
- 无
- Extra
-
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/*"
- Extra
-
"subject"
- 表示消息主题的字符串(通常仅适用于彩信)。
"sms_body"
- 文本消息的字符串。
EXTRA_STREAM
- A
Uri
指向 要附加的图片或视频如果使用ACTION_SEND_MULTIPLE
操作, 此 extra 是ArrayList
指向要附加的图片或视频的Uri
对象。
- 操作
ACTION_VIEW
- 数据 URI 架构
http:<URL>
https:<URL>
- MIME 类型
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
- 设置 Android 设备以用于开发 或使用虚拟设备。
- 安装一个处理您想支持的 Intent 的应用版本。
- 使用
adb
触发一个 intent: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
- 如果您定义了所需的 intent 过滤器,请处理 intent。
示例 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 过滤器示例:
<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>
电话
发起通话是电话应用的常见操作。 创建一个 intent 过滤器,使用 相关信息。
拨打电话
如需打开“电话”应用并拨打电话号码,请使用 ACTION_DIAL
操作并通过以下方式指定电话号码:
以下 URI 架构。“电话”应用打开后,会显示电话号码
并且用户必须点按 Call 按钮才能开始通话。
如需直接拨打电话,请使用 ACTION_CALL
操作
并使用以下 URI scheme 指定电话号码。手机应用打开后,
发起通话。用户无需点按致电按钮。
ACTION_CALL
操作要求您将
CALL_PHONE
权限:
<uses-permission android:name="android.permission.CALL_PHONE" />
有效电话号码是指已定义的 (符合 IETF RFC 3966 标准)。 举例来说,有效电话号码包括下列号码:
“电话”应用的拨号器能够很好地对架构进行标准化,例如
电话号码。因此并不严格要求上述方案在
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 过滤器,以通告您的应用执行各项操作的能力。
使用特定应用搜索
如需支持在应用上下文内进行搜索,请使用以下代码在应用中声明一个 intent 过滤器
SEARCH_ACTION
操作,如以下 intent 过滤器示例所示。
注意:我们不建议将 SEARCH_ACTION
用于应用搜索。
而应实现
GET_THING
操作,以利用 Google 助理对应用内搜索的内置支持。如需了解详情,请参阅
Google 助理
与应用有关的 Action 文档。
intent 过滤器示例:
<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
extra。
示例 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 操作:
示例 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 操作并指定消息 电话号码、主题和邮件正文等详细信息。
示例 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 过滤器示例:
<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>
注意:如果您要开发短信/彩信应用,则必须
为几个其他操作实现 intent 过滤器,以便作为
默认短信应用(Android 4.4 及更高版本)。如需了解详情,请参阅相关文档
时间:Telephony
。
网络浏览器
加载网址是网络浏览器应用的常见操作。 创建一个 intent 过滤器,使用 相关信息。
加载网址
要打开网页,请使用 ACTION_VIEW
操作,并在 Intent 数据中指定网址。
示例 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 过滤器示例:
<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 应用提供与您的网站相似的功能,请为指向您网站的网址添加一个 Intent 过滤器。然后, 如果用户安装了您的应用,电子邮件或其他网页中的链接指向您的网站 打开您的 Android 应用,而不是网页。如需了解详情,请访问 处理 Android App Links。
从 Android 12(API 级别 31)开始,仅当您的应用获准处理某个通用网络 intent 中包含的特定网域时,该网络 intent 才会解析为应用中的 activity。如果您的应用未获准使用相应网域, intent 会解析为用户的默认浏览器应用。
使用 Android 调试桥验证 intent
如需验证您的应用是否对您想支持的 intent 作出响应,您可以使用
adb
工具,可通过执行以下操作来触发特定 intent:
以下:
如需了解详情,请参阅 发出 shell 命令。