常见的意图(Common Intents)
Intent允许你通过描述一个你想执行(如“查看地图”或“拍照”)的简单的action,在另一个应用程序中启动一个Activity。这种类型的Intent被称为隐式意图,因为它没有指定的应用程序要启动的组件,而是指定一个action,并提供了一些 数据,用来执行这个action。
当你调用 startActivity()
或 startActivityForResult()时
,并把一个隐式Intent传递给它,系统解析这个Intent给应用程序,这个应用程序必须能够处理这个Intent,并能启动相应的activity。如果有一个以上的应用程序,可以处理这个意图,系统呈现一个对话框,用户可挑选使用哪个应用程序。
本页面描述的几种隐式Intent,你可以用它来 执行常用的action,通过应用程序的类型来组织处理这个Intent。每个部分还展示了如何创建一个 intent filter ,标榜你的应用程序能执行相同的action的能力。
注意:如果在设备上没有的应用程序可以接收隐式意图,当调用startActivity()时,您的应用程序会崩溃
。首先要验证存在应用程序接收这个Intent,用你的Intent
对象调用resolveActivity()
。如果结果非空,说明至少有一个应用程序能够处理这个Intent并且调用startActivity()也是安全的
。如果结果为空,你不应该使用这个Intent,可能的话,你应该禁止调用此Intent的功能。
如果你不熟悉如何创建Intent或Intent过滤器,你应该先阅读 Intents and Intent Filters.。
要了解如何触发本页面所列出的Intent, 请阅读下面的 Verify Intents with the Android Debug Bridge.
Google Now
Google Now触发本页面所列出的Intent,用来响应语音指令,详细信息请阅读后面的 Intents Fired by Google Now。
闹钟(Alarm Clock)
创建闹钟(Create an alarm)
要创建一个新的闹钟,使用ACTION_SET_ALARM
action,并指定闹钟的详细信息,如下面定义的时间,并使用额外的信息。
注:在的Android 2.3(API 9级)或者更高版本中,只有小时,分钟和额外的消息是可以用。其他额外数据在更高平台版本中被添加。
-
动作(action)
-
ACTION_SET_ALARM
数据URI
- 无 MIME类型
- 无 Extras
-
- 关于闹钟的小时。
- 关于闹钟的分钟。
- 用来识别闹钟的自定义信息。
-
一个
ArrayList
包括每个有重复报警的工作日。每天在必须被声明的同时,也要有来自于Calendar
类的一个整数,如MONDAY
(星期一)。 -
一个
content:
URI指定一个铃声用于闹钟,或者使用VALUE_RINGTONE_SILENT
无铃声。要使用默认的铃声,不用指定该额外信息。
- 一个布尔值,指定是否为振动闹钟。
- 一个布尔值,指定响应的应用程序是否应该跳过其UI,在设置报警时。如果为true,应用程序应该绕过任何确认用户界面并且简单的设置指定的闹钟。
EXTRA_HOUR
EXTRA_MINUTES
EXTRA_MESSAGE
EXTRA_DAYS
EXTRA_RINGTONE
EXTRA_VIBRATE
EXTRA_SKIP_UI
意图举例:
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-permissionandroid: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>
创建一个定时器(Create a timer)
ACTION_SET_TIMER
action,并指定计时器详细信息,如使用下面定义的额外时间。
注:此Intent在Android 4.4系统(API等级19)中被添加。
-
动作(action)
-
ACTION_SET_TIMER
数据URI
- 无 MIME类型
- 无 Extras
-
- 以秒为单位的计时器的长度
- 用来确定定时器的自定义信息。
- 一个布尔值,指定响应应用程序是否应该跳过其UI,在设置定时器时。如果为true,应用程序应该绕过任何确认用户界面,并且简单的启动指定的定时器。
EXTRA_LENGTH
EXTRA_MESSAGE
EXTRA_SKIP_UI
意图举例:
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-permissionandroid: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>
显示所有闹钟(Show all alarms)
要显示闹钟的列表,请使用ACTION_SHOW_ALARMS
action。
虽然没有太多的应用程序会调用这个意图(它主要由系统的应用程序),任何应用程序,表现为一个闹钟的应该实现此意图过滤器,并显示当前报警的列表回应。
注:此Intent在Android 4.4系统(API等级19)中被添加。
-
动作(action)
-
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>
日历(Calendar)
添加日历事件(Add a calendar event)
添加一个新的事件到用户的日历,使用ACTION_INSERT
action,并使用Events.CONTENT_URI指定与数据URI 。然后,您可以使用下列定义额外各种事件的详细信息。
-
动作(action)
-
ACTION_INSERT
数据URI
-
Events.CONTENT_URI
MIME类型
-
"vnd.android.cursor.dir/event"
Extras
-
- 一个布尔值,指定是否这是一个全天事件。
- 事件的开始时间。
- 事件的结束时间。
- 该事件的标题。
- 事件描述。
- 事件位置。
- 电子邮件地址的逗号分隔的列表,指定受邀者。
EXTRA_EVENT_ALL_DAY
EXTRA_EVENT_BEGIN_TIME
EXTRA_EVENT_END_TIME
TITLE
说明
EVENT_LOCATION
EXTRA_EMAIL
更多时间的信息可能被指定,可使用定义在
CalendarContract.EventsColumns
类(CalendarContract.java 中的EventsColumns接口)中那些常量。
意图举例:
public void addEvent ( String title , String location , Calendar begin , Calendar 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>
相机(Camera)
拍摄图片或视频,并将其返回(Capture a picture or video and return it)
要打开摄像机的应用程序和接收所产生的照片或视频,使用ACTION_IMAGE_CAPTURE
或ACTION_VIDEO_CAPTURE action
。也要指定你想保存照片或视频的URI位置,在EXTRA_OUTPUT
额外信息中。
-
动作(action)
-
ACTION_IMAGE_CAPTURE
或ACTION_VIDEO_CAPTURE
数据URI方案
- 无 MIME类型
- 无 Extras
-
-
该URI位置,是相机应用程序应该保存照片或视频文件的地方(作为一个
对象)。Uri
EXTRA_OUTPUT
-
该URI位置,是相机应用程序应该保存照片或视频文件的地方(作为一个
当相机应用程序成功返回焦点到你的activity (您的应用程序接收到onActivityResult()
回调),您可以访问你的EXTRA_OUTPUT值指定的URI指向的照片或视频。
注意:当您使用ACTION_IMAGE_CAPTURE
拍摄照片,相机也可能返回照片的缩小副本(缩略图),在名为“数据”的额外字段,保存为一个Bitmap。
意图举例:
static final int REQUEST_IMAGE_CAPTURE = 1 ;
static final Uri mLocationForPhotos ;
public void capturePhoto ( String targetFilename ) {
Intent intent = new Intent ( MediaStore . ACTION_IMAGE_CAPTURE );
intent . putExtra ( MediaStore . EXTRA_OUTPUT ,
Uri . withAppendedPath ( mLocationForPhotos , 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 . getParcelable ( "data" );
//Do other work with full size photo saved in mLocationForPhotos
...
}
}
有关如何使用此意图拍摄照片,包括为输出位置如何创建一个适当的URL,请阅读 Taking Photos Simply 或 Taking Videos Simply。
意图过滤器举例:
<activity ... >
<intent-filter>
<action android:name = "android.media.action.IMAGE_CAPTURE" />
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在处理这个意图时,你的activity应检查在传递进来的Intent 中的EXTRA_OUTPUT
额外数据,然后保存所拍摄的图片或视频到在Extras中被指定位置,并调用有Intent的setResult()
,其中包括在名为"data"的Extras中缩略图。
启动拍照模式的相机(Start a camera app in still image mode)
要启动拍照模式的相机应用程序,使用INTENT_ACTION_STILL_IMAGE_CAMERA action
。
-
行动(action)
-
INTENT_ACTION_STILL_IMAGE_CAMERA
数据URI方案
- 无 MIME类型
- 无 Extras
- 无
意图举例:
public void capturePhoto () {
Intent intent = new Intent ( MediaStore . INTENT_ACTION_STILL_IMAGE_CAMERA );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivityForResult ( intent );
}
}
意图过滤器举例:
<activity ... >
<intent-filter>
<action android:name = "android.media.action.STILL_IMAGE_CAMERA" />
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
</activity>
启动视频模式的相机(Start a camera app in video mode)
要启动视频模式下相机的应用程序,使用INTENT_ACTION_VIDEO_CAMERA action
。
-
行动(action)
-
INTENT_ACTION_VIDEO_CAMERA
数据URI方案
- 无 MIME类型
- 无 Extras
- 无
意图举例:
public void capturePhoto () {
Intent intent = new Intent ( MediaStore . INTENT_ACTION_VIDEO_CAMERA );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivityForResult ( intent );
}
}
意图过滤器举例:
<activity ... >
<intent-filter>
<action android:name = "android.media.action.VIDEO_CAMERA" />
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
</activity>
联系人/联系人应用(Contacts/People App)
选择联系人(Select a contact)
为了让用户选择一个联系人,并让您的应用程序可以访问所有的联系人信息,使用ACTION_PICK action
,并指定MIME类型 Contacts.CONTENT_TYPE
。
把最后的Intent
发送到包含 content
的onActivityResult()
回调方法:
URI指向选定的联系人。响应授予您的应用程序的临时权限,为了使用 Contacts Provider API 去读取该联系人,即使你的应用没有 READ_CONTACTS的权限
。
提示:如果你需要访问仅一段特定的联系人信息,如电话号码或电子邮件地址,相反,关于如何 选择特定的联系人数据,请看下一部分(select specific contact data.)。
-
行动(Action)
-
ACTION_PICK
数据URI方案
- 无 MIME类型
-
Contacts.CONTENT_TYPE
意图举例:
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
...
}
}
关于在你有了联系人的URL时如何获取联系人的信息的更多信息,请阅读Retrieving Details for a Contact。记住,当你用上述的Intent检索联系人的URI时,你 不需要READ_CONTACTS
权限来读取联系人的信息。
选择明确的联系人数据(Select specific contact data)
为了让用户从联系人中选择一段明确的、连贯的信息,如电话号码,电子邮件地址,或其他数据类型,可以使用ACTION_PICK action
并指定MIME类型给下面列出的内容类型之一,如 CommonDataKinds.Phone.CONTENT_TYPE,
以便
获取联系人的电话号码。
如果你仅需要检索联系人数据中一种类型,使用ContactsContract.CommonDataKinds类中的CONTENT_TYPE
比使用 Contacts.CONTENT_TYPE更有效果(如上一节所展示的),因为结果会给你提供直接访问所需的数据,而不要求你去执行更复杂的查询Contacts Provider.的操作。
最后的Intent被传递给你的onActivityResult()
回调函数,并包含 content:
URI指向选定的联系人数据。这响应授予你的应用程序拥有临时权限去读取联系人数据,即使你的应用程序没有READ_CONTACTS
权限。(个人注释:Intent 传递给startActivityForResult()后要返回一个result,最终这个result会给onActivityResult()回调函数,阅读下边的例子更容易理解)
-
行动(action)
-
ACTION_PICK
数据URI方案
- 无 MIME类型
-
- 用一个电话号码选择联系人。
- 用一个电子邮件地址选择联系人。
- 用一个邮寄地址选择联系人。
CommonDataKinds.Phone.CONTENT_TYPE
CommonDataKinds.Email.CONTENT_TYPE
CommonDataKinds.StructuredPostal.CONTENT_TYPE
或者许多其它ContactsContract中的
CONTENT_TYPE
值的一个。
意图举例:
staticfinalint REQUEST_SELECT_PHONE_NUMBER =1;
publicvoid selectContact(){
// Start an activity for the user to pick a phone number from contacts
Intent intent =newIntent(Intent.ACTION_PICK);
intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
if(intent.resolveActivity(getPackageManager())!=null){
startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
}
}
@Override
protectedvoid 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 =newString[]{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
...
}
}
}
查看联系人(View a contact)
要显示一个未知联系人的详细信,使用ACTION_VIEW
action,并指定联系人content:
URI作为Intent的数据。
主要有两种方式来检索联系人的URI:
- 通过
ACTION_PICK
使用程序返回的联系人的URL,如上一节中所示(该方法不需要任何应用程序的权限)。 - 直接访问所有联系人的列表,如在 Retrieving a List of Contacts 中所描述的(此方法需要
READ_CONTACTS
权限)。
-
行动(action)
-
ACTION_VIEW
数据URI方案(Data URI Scheme)
-
content:<URI>
MIME类型
- 无。该类型是从URL中推断。
Intent举例:
publicvoid viewContact(Uri contactUri){
Intent intent =newIntent(Intent.ACTION_VIEW, contactUri);
if(intent.resolveActivity(getPackageManager())!=null){
startActivity(intent);
}
}
编辑现有的联系人(Edit an existing contact)
要编辑一个已知的联系人,使用ACTION_EDIT
action,指定了联系人content:
URI作为Intent的数据,并且包括通过ContactsContract.Intents.Insert中的常量被指定在extras 中的任何已知联系人的信息。
主要有两种方式来检索联系人的URI:
- 通过
ACTION_PICK
使用程序返回的联系人的URL,如上一节中所示(该方法不需要任何应用程序的权限)。 - 直接访问所有联系人的列表,如在 Retrieving a List of Contacts 中所描述的(此方法需要
READ_CONTACTS
权限)。
-
行动(action)
-
ACTION_EDIT
Data URI Scheme
-
内容:<URI>
MIME类型
- 该类型是从联系人的URI中推断。 Extras
-
更多的extras定义在
ContactsContract.Intents.Insert
中,这样你就可以填充联系人详细信息的字段。
Intent举例:
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 );
}
}
有关如何编辑联系人的详细信息,请阅读使用意图修改联系人(Modifying Contacts Using Intents)。
插入联系人(Insert a contact)
要插入一个新的联系人,使用ACTION_INSERT action
,指定Contacts.CONTENT_TYPE
作为MIME类型,并且包括通过ContactsContract.Intents.Insert中的常量被指定在extras 中的任何已知联系人的信息。
-
行动(action)
-
ACTION_INSERT
Data URI Scheme
- 无 MIME类型
-
Contacts.CONTENT_TYPE
Extras
-
更多的extras定义在
ContactsContract.Intents.Insert
中。
Intent举例:
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 );
}
}
有关如何插入联系人的详细信息,请阅读使用意图修改联系人(Modifying Contacts Using Intents)。
电子邮件(Email)
撰写有可选附件的电子邮件(Compose an email with optional attachments)
要编写电子邮件,使用下面action中的一种,这根据你的邮件是否要带有附件,是否包含邮件的详细信息,比如收件人、主题。
-
action
-
ACTION_SENDTO
(无附件)或 -
ACTION_SEND
(一附件)或 -
ACTION_SEND_MULTIPLE
(多个附件)
Data URI Scheme
- 无 MIME Type
-
- 所有收件人的电子邮件地址的字符串数组。
- 所有抄送人的电子邮件地址的字符串数组。
- 所有密送人的电子邮件地址的字符串数组。
- 电子邮件主题字符串。
- 电子邮件正文字符串。
-
一个URL
指向附件。如果使用
ACTION_SEND_MULTIPLE action
,这应该不是一个 包含多个URL
对象的数组。
Intent.EXTRA_EMAIL
Intent.EXTRA_CC
Intent.EXTRA_BCC
Intent.EXTRA_SUBJECT
Intent.EXTRA_TEXT
Intent.EXTRA_STREAM
PLAIN_TEXT_TYPE
("text/plain")
"*/*"
Extras
Intent举例:
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
action,并包括
数据方案(data scheme)。例如:"mailto:"
public void composeEmail ( String [] addresses , String subject ) {
Intent intent = new Intent ( Intent . ACTION_SENDTO );
intent . setData ( Uri . parse ( "mailto:" )); //only email apps should handle this
intent . putExtra ( Intent . EXTRA_EMAIL , addresses );
intent . putExtra ( Intent . EXTRA_SUBJECT , subject );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
Intent filter举例:
<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>
文件存储(File Storage)
检索一种特定类型的文件(Retrieve a specific type of file)
要用户选择一个文件,如文档或照片,并返回一个引用给你的应用程序,使用ACTION_GET_CONTENT action
,并指定所需的MIME类型。对于你的activity的目前的生命周期来说,返回给你的应用程序的文件引用是短暂的,因此,如果你要访问它,你必须导入一个以后可以读取的副本。此意图也允许用户在这个过程中创建一个新的文件(例如,用户不是选择一个现有的照片,而是拍新照片)。
返回的Intent被传递给onActivityResult()
方法,包含用一个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
-
ACTION_GET_CONTENT
Data URI Scheme
- 无 MIME类型
- MIME类型对应用户选择的文件类型。 Extras
-
- 一个布尔值表明用户是否可以一次选择多个文件。
- 一个布尔值表明从设备返回的文件是否必须是直接可用的,而不需要从远程服务的下载。
EXTRA_ALLOW_MULTIPLE
EXTRA_LOCAL_ONLY
Category (可选)
-
-
为了返回只有能“打开的”(openable)文件,这些文件通过用
openFileDescriptor()可以作为文件流。
CATEGORY_OPENABLE
-
为了返回只有能“打开的”(openable)文件,这些文件通过用
获得一张图片的Intent举例:
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>
<actionandroid:name="android.intent.action.GET_CONTENT"/>
<dataandroid:type="image/*"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<!-- The OPENABLE category declares that the returned file is accessible
from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
-->
<categoryandroid:name="android.intent.category.OPENABLE"/>
</intent-filter>
</activity>
打开特定类型文件(Open a specific type of file)
相反,检索你必须导入到你的应用程序的文件的副本,(使用ACTION_GET_CONTENT action
),在Android 4.4或更高版本上运行时,你可以请求打开一个文件文件,而这个文件被另一个应用通过使用 ACTION_OPEN_DOCUMENT action
和指定MIME类型来管理
。还要让用户创建一个新的你应用可以读写的文档,用ACTION_CREATE_DOCUMENT action 来代替。例如,要从现有的PDF文档中进行选择,ACTION_CREATE_DOCUMENT Intent 允许用户选择他们喜欢的地方创建一个新的文档(在另一个管理文档存储的应用程序中)- 那时,你的应用程序接收可以写入新文档的URL位置。
而此Intent 可以返回一个任何类型的URL,此Intent 来自于ACTION_GET_CONTENT action,被传递给你的 onActivityResult()方法。来自于
ACTION_OPEN_DOCUMENT
和 ACTION_CREATE_DOCUMENT
的结果Intent总是指定被选择的文件作为一个content:URL被一个
DocumentsProvider支持,你可以用
openFileDescriptor()
打开此文件,并用来自于DocumentsContract.Document的纵列号来查询此文件的详细信息。
被返回的URI赋予你的应用程序的长期读取访问此文件(也可能有写的权限)。所以ACTION_OPEN_DOCUMENT action
特别有用(而不是使用ACTION_GET_CONTENT )
当你想读一个现有的文件并不想创造一个副本到你的应用程序时,或当你想打开和编辑文件时。
您也可以允许用户添加选择多个文件,通过增加 EXTRA_ALLOW_MULTIPLE
给
Intent
,并设置为真
。如果用户只选择一个,然后你可以从 getData()中
检索它。如果用户选择一个以上,那么getData()
返回null,并且必须改为从ClipData
对象中检索它们,这个对象通过getClipData()被返回。
注意:你的Intent必须指定一个MIME类型, 并且必须声明CATEGORY_OPENABLE
类别。如果合适的话,你可以指定多个MIME类型,通过使用 EXTRA_MIME_TYPES
附加数据来增加一个MIME类型数组—如果你这样做,你必须设置这主要的MIME类型,在 setType()
中以 "*/*"
分开
.
-
action
-
ACTION_OPEN_DOCUMENT
或ACTION_CREATE_DOCUMENT
Data URI Scheme
- 无 MIME类型
- MIME类型对应用户选择的文件类型。 Extras
-
-
一个MIME类型数组适应于你应用所需求的文件的类型。当你使用此附加数据,必须在
setType()中设置
主要MIME类型,以“* / *”
。 - 一个布尔值,表明该用户是否可以一次选择多个文件。
-
使用
ACTION_CREATE_DOCUMENT
来指定一个初始文件名 。 - 一个布尔值表明从设备中返回的文件是否必须是直接可用的,而不需要从远程服务的下载。
EXTRA_MIME_TYPES
EXTRA_ALLOW_MULTIPLE
EXTRA_TITLE
EXTRA_LOCAL_ONLY
Category
-
一个MIME类型数组适应于你应用所需求的文件的类型。当你使用此附加数据,必须在
-
-
为了返回仅可以打开的文件,通过
openFileDescriptor(),
它们可以被表示为一个文件流。
CATEGORY_OPENABLE
-
为了返回仅可以打开的文件,通过
获得一张图片的Intent举例:
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
...
}
}
第三方应用程序不能真正响应 ACTION_OPEN_DOCUMENT action
的
Intent
。相反,系统接收这个Intent,并在一个统一的用户界面显示所有来自于各种应用程序的可用文件。
在这个UI中,为了提供你应用程序的文件,并允许其他应用程序打开它们,你必须实现一个DocumentsProvider
,并包括一个关于PROVIDER_INTERFACE
的Intent过滤器 (“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>
详细信息,请阅读存储访问架构(Storage Access Framework )指南。
身体素质(Fitness)
启动/停止骑自行车
要跟踪骑自行车,使用 ACTION_TRACK action
,
“vnd.google.fitness.activity /biking”
MIME类型,并在开始时设置EXTRA_STATUS附件数据给
STATUS_ACTIVE
和 在停止时设置给STATUS_COMPLETED
。
-
action
-
ACTION_TRACK
Data URI
- 无 MIME Type
-
“vnd.google.fitness.activity /biking”
Extras
-
-
一个字符串,其值在启动时是
STATUS_ACTIVE
和 在停止时是STATUS_COMPLETED
。
EXTRA_STATUS
-
一个字符串,其值在启动时是
Intent示例:
public void startBikeRide () {
Intent intent = new Intent ( FitnessIntents . ACTION_TRACK )
. setType ( "vnd.google.fitness.activity/biking" )
. putExtra ( FitnessIntents . EXTRA_STATUS , FitnessIntents . STATUS_ACTIVE );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
Intent过滤器示例:
<activity ... >
<intent-filter>
<action android:name = "vnd.google.fitness.TRACK" />
<data android:mimeType = "vnd.google.fitness.activity/biking" />
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
</activity>
启动/停止运行(Start/Stop a run)
要跟踪运行,使用 ACTION_TRACK action
,
“vnd.google.fitness.activity /running”
MIME类型,并在开始时设置EXTRA_STATUS附件数据给
STATUS_ACTIVE
和 在停止时设置给STATUS_COMPLETED
。
-
action
-
ACTION_TRACK
Data URI
- 无 MIME Type
-
“vnd.google.fitness.activity /运行”
Extras
-
-
一个字符串,其值在启动时是
STATUS_ACTIVE
和 在停止时是STATUS_COMPLETED
。
EXTRA_STATUS
-
一个字符串,其值在启动时是
Intent示例:
public void startRun () {
Intent intent = new Intent ( FitnessIntents . ACTION_TRACK )
. setType ( "vnd.google.fitness.activity/running" )
. putExtra ( FitnessIntents . EXTRA_STATUS , FitnessIntents . STATUS_ACTIVE );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
Intent过滤器示例:
<activity ... >
<intent-filter>
<action android:name = "vnd.google.fitness.TRACK" />
<data android:mimeType = "vnd.google.fitness.activity/running" />
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
</activity>
启动/停止锻炼(Start/Stop a workout)
要跟踪锻炼,使用 ACTION_TRACK action
,
“vnd.google.fitness.activity /other”
MIME类型,并在开始时设置EXTRA_STATUS附件数据给
STATUS_ACTIVE
和 在停止时设置给STATUS_COMPLETED
。
-
action
-
ACTION_TRACK
Data URI
- 无 MIME Type
-
“vnd.google.fitness.activity /other”
Extras
-
-
一个字符串,其值在启动时是
STATUS_ACTIVE
和 在停止时是STATUS_COMPLETED
。
EXTRA_STATUS
-
一个字符串,其值在启动时是
Intent示例:
public void startWorkout () {
Intent intent = new Intent ( FitnessIntents . ACTION_TRACK )
. setType ( "vnd.google.fitness.activity/other" )
. putExtra ( FitnessIntents . EXTRA_STATUS , FitnessIntents . STATUS_ACTIVE );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
Intent过滤器示例:
<activity ... >
<intent-filter>
<action android:name = "vnd.google.fitness.TRACK" />
<data android:mimeType = "vnd.google.fitness.activity/other" />
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
</activity>
显示心脏率(Show heart rate)
向用户显示的心脏速率,使用 ACTION_VIEW
action,“vnd.google.fitness.data_type / com.google.heart_rate.bpm”
MIME类型。
-
Action
-
ACTION_VIEW
Data URI
- 无 MIME Type
-
“vnd.google.fitness.data_type / com.google.heart_rate.bpm”
Extras
- 无
Intent示例:
public void showHeartRate () {
Intent intent = new Intent ( FitnessIntents . ACTION_VIEW )
. setType ( "vnd.google.fitness.data_type/com.google.heart_rate.bpm" );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
Intent过滤器示例:
<activity ... >
<intent-filter>
<action android:name = "vnd.google.fitness.VIEW" />
<data android:mimeType = "vnd.google.fitness.data_type/com.google.heart_rate.bpm" />
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
</activity>
显示步数(Show step count)
为了显示用户的步数,使用 ACTION_VIEW action
,
“vnd.google.fitness.data_type
/com.google.step_count
.cumulative“
MIME类型。
-
Action
-
ACTION_VIEW
Data URI
- 无 MIME Type
-
“vnd.google.fitness.data_type / com.google.step_count.cumulative”
Extras
- 无
Intent示例:
public void showStepCount () {
Intent intent = new Intent ( FitnessIntents . ACTION_VIEW )
. setType ( "vnd.google.fitness.data_type/com.google.step_count.cumulative" );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
Intent过滤器示例:
<activity ... >
<intent-filter>
<action android:name = "vnd.google.fitness.VIEW" />
<data android:mimeType = "vnd.google.fitness.data_type/com.google.step_count.cumulative" />
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
</activity>
本地Actions(Local Actions)
呼叫的士
要呼叫出租车,使用 ACTION_RESERVE_TAXI_RESERVATION
action。
注:在完成动作之前应用程序必须请求用户确认。
-
Action
-
ACTION_RESERVE_TAXI_RESERVATION
Data URI
- 无 MIME Type
- 无 Extras
- 无
Intent示例:
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>
地图(Maps)
在地图上显示的位置(Show a location on a map)
打开一个地图,使用ACTION_VIEW action
,并指定与下面定义的方案之一的意图数据的位置信息。
-
Action
-
ACTION_VIEW
Data URI Scheme
-
-
显示指定经纬度位置的地图。
例如:
“GEO:47.6,-122.3”
-
以某个缩放级别显示给定经纬度位置的地图。 放大级别为 1 表示整个地球,以给定的 lat、lng 为中心。 最高(最大)的放大级别为 23 。
例如:
“GEO:47.6,-122.3 Z = 11”
-
显示指定经纬度位置的地图,并带有一个字符串标签。
例如:
“GEO:0,0 Q = 34.99,-106.61(宝物)”
-
显示为“我的街道地址”的位置(可以是一个特定的地址或位置的查询)。
例如:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
注:geo URI 中的所有字符串必须经过转码。 例如,字符串 1st & Pike, Seattle 应该写为
1st%20%26%20Pike%2C%20Seattle
。 字符串中的空格可以用 转码,也可以用加号代替(+)。
地理:纬度,经度(geo:latitude,longitude)
地理:纬度,经度?Z = 缩放(zoom)(geo:latitude,longitude?z=zoom)
地理:0,0 Q =纬度,经度(标签)(geo:0,0?q=lat,lng(label))
地理:0,0 Q =我+街道+地址(geo:0,0?q=my+street+address)
MIME Type
-
显示指定经纬度位置的地图。
- 无
Intent示例:
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>
音乐或视频(Music or Video)
播放媒体文件(Play a media file)
要播放的音乐文件,使用ACTION_VIEW action,
并在Intent数据部分指定文件位置的URL
。
-
Action
-
ACTION_VIEW
Data URI Scheme
file:<URI>
content:<URI>
http:<网址>
MIME Type
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
或其他任何你的应用程序可能需要的。
Intent示例:
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>
基于搜索查询播放音乐(Play music based on a search query)
要基于搜索查询播放音乐,使用 INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH Intent
。一个应用程序可能会触发此意图响应用户的语音命令来播放音乐。接收本 Intent 的应用程序会在其音乐库中进行检索,如果找到匹配的内容就会开始播放。
这类Intent应包含EXTRA_MEDIA_FOCUS
附加字串
,它指定了搜索模式。例如,搜索模式可以指定搜索是否是一个艺术家名称或歌曲名称
-
Action
-
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
Data URI Scheme
- 无 MIME Type
- 无 Extras
-
-
指示搜索模式(用户是否正在寻找一个特定的艺术家,专辑,歌曲或播放列表)。大多数搜索模式采取额外的附加数据。例如,如果用户喜欢听某些歌曲,Intent可能具有三部分附加数据:歌曲标题,艺术家和专辑。使用
EXTRA_MEDIA_FOCUS键值,此Intent可以提供一下检索模式
:-
播放任何音乐。 接收方应用将会智能选择要播放的音乐,比如用户最后一次听过的播放列表。
额外附件数据:
QUERY
(必需) -空字符串。 为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
非结构化 -
“vnd.android.cursor.item / *”
-
根据一个非结构化的检索请求播放特定的歌曲、专辑或某风格的音乐。 如果应用程序无法辨识用户需要的音乐类型,那就可以用这种搜索模式创建 Intent 。 当然,应用程序还是应该尽可能地使用更为确切的检索模式。
额外附件数据:
QUERY
(必需) -包含艺术家、专辑、歌曲名称、风格或者这些条件的任意组合的字符串。
-
播放指定风格的音乐。
额外附件数据:
“android.intent.extra.genre”
(必需) -流派。QUERY
(必需) -流派。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
-
播放指定艺术家的音乐。
额外附件数据:
EXTRA_MEDIA_ARTIST
(必需) -艺术家。“android.intent.extra.genre”
-流派。QUERY
(必需) -一个字符串,其中包含了艺术家或流派的任意组合。附件数据总是提供向后兼容性:现有的应用程序,不知道搜索模式可以处理这个Intent,称为非结构化搜索。
-
播放特定专辑的音乐。
额外附件数据:
EXTRA_MEDIA_ALBUM
(必需) -专辑。EXTRA_MEDIA_ARTIST
-艺术家。“android.intent.extra.genre”
-流派。QUERY
(必需) -一个字符串,其中包含专辑或艺术家的任意组合。这个附件数据总是提供向后兼容性:现有的应用程序,不知道搜索模式可以处理这个intent,称为非结构化搜索。
歌曲 -
“vnd.android.cursor.item /audio”
-
播放特定的歌曲。
额外附件数据:
EXTRA_MEDIA_ALBUM
-专辑。EXTRA_MEDIA_ARTIST
-艺术家。“android.intent.extra.genre”
-流派。EXTRA_MEDIA_TITLE
(必需) -歌曲的名称。QUERY
(必需) -一个字符串,其中包含的任意组合:专辑,艺术家,流派,或名称。这个附件数据总是提供向后兼容性:现有的应用程序,不知道搜索模式可以处理这个意图,称为非结构化搜索。
-
播放指定列表或匹配附件数据给定规则的列表。
额外附件数据:
EXTRA_MEDIA_ALBUM
-专辑。EXTRA_MEDIA_ARTIST
-艺术家。“android.intent.extra.genre”
-流派。“android.intent.extra.playlist”
-播放列表。EXTRA_MEDIA_TITLE
-供播放列表参考的歌曲名称。QUERY
(必需) -一个字符串,其中包含的任意组合:专辑,艺术家,流派,播放列表,或名称。这个附加数据总是提供向后兼容性:现有的应用程序,不知道搜索模式可以处理这个intent,称为非结构化搜索。
任何 -
“vnd.android.cursor.item / *”
-
MediaStore.EXTRA_MEDIA_FOCUS
(必填) -
Intent示例:
如果用户希望从一个特定的艺术家的听音乐,一个搜索应用程序可能会生成以下意图:
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>
在处理该 Intent 时,为了确定检索模式, Activity 应该检查传入的 Intent 的附件值 EXTRA_MEDIA_FOCUS
。一旦 Activity 识别出了检索模式,就应该读取该模式下的额外附件数据。 利用这些信息,应用程序就可以在自己的曲库中查找并播放符合要求的音乐。 例如:
protectedvoid onCreate(Bundle savedInstanceState){
...
Intent intent =this.getIntent();
if(intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH)==0){
String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS);
String query = intent.getStringExtra(SearchManager.QUERY);
// Some of these extras may not be available depending on the search mode
String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM);
String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST);
String genre = intent.getStringExtra("android.intent.extra.genre");
String playlist = intent.getStringExtra("android.intent.extra.playlist");
String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE);
// Determine the search mode and use the corresponding extras
if(mediaFocus ==null){
// 'Unstructured' search mode (backward compatible)
playUnstructuredSearch(query);
}elseif(mediaFocus.compareTo("vnd.android.cursor.item/*")==0){
if(query.isEmpty()){
// 'Any' search mode
playResumeLastPlaylist();
}else{
// 'Unstructured' search mode
playUnstructuredSearch(query);
}
}elseif(mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE)==0){
// 'Genre' search mode
playGenre(genre);
}elseif(mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE)==0){
// 'Artist' search mode
playArtist(artist, genre);
}elseif(mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE)==0){
// 'Album' search mode
playAlbum(album, artist);
}elseif(mediaFocus.compareTo("vnd.android.cursor.item/audio")==0){
// 'Song' search mode
playSong(album, artist, genre, title);
}elseif(mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE)==0){
// 'Playlist' search mode
playPlaylist(album, artist, genre, playlist, title);
}
}
}
电话(phone)
拨打电话(Initiate a phone call)
要打开电话应用并拨打一个电话号码,请使用 ACTION_DIAL action,
并用下述的 URI Scheme 给出电话号码。 电话应用在打开时会显示这个号码,但用户必须按下Call按钮(译者注:大部分手机的“拨打”键都是个话机图标)才会开始拨打电话。
要直接拨打电话,使用ACTION_CALL action
,并指定下列定义的URI scheme 中的电话号码。当手机的应用程序启动时,它开始打电话; 用户并不需要按呼叫(Call)按钮。
该ACTION_CALL action
需要你在mainfest清单文件添加 CALL_PHONE
权限:
<uses-permissionandroid:name="android.permission.CALL_PHONE"/>
-
Action
-
ACTION_DIAL
-打开拨号器或电话应用程序。ACTION_CALL
-打一个电话(需要CALL_PHONE
许可)
数据URI方案
-
联系电话:<电话号码> (tel:<phone-number>)
语音信箱:<电话号码> (voicemail:phone-number)
MIME Type
- 无
有效的电话号码是那些被定义在IETF RFC 3966 标准下,有效实例包括以下:
电话:2125551212
电话:(212)555 1212
拨号应用对于电话号码的格式识别已经很完美了。 因此在 Uri.parse()
方法中并未用到很严格的 Scheme 定义。 不过,如果某个 Scheme 没有用过或者不确定是否能被处理,则可以换用 Uri.fromParts()
。
Intent示例:
public void dialPhoneNumber ( String phoneNumber ) {
Intent intent = new Intent ( Intent . ACTION_DIAL );
intent . setData ( Uri . parse ( "tel:" + phoneNumber ));
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
搜索(search)
使用特定应用程序搜索(Search using a specific app)
为了您的应用程序的范围内支持搜索,在的你应用程序中声明一个有SEARCH_ACTION action
的
意图过滤器,如在下面的例子意图过滤器。
-
Action
-
- 支持从谷歌搜索查询。
“com.google.android.gms.actions.SEARCH_ACTION”
Extras
-
- 一个字符串,其中包含搜索查询。
QUERY
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>
执行网络搜索(Perform a web search)
要启动网络搜索,使用ACTION_WEB_SEARCH action
,并在SearchManager.QUERY附加数据中
指定要搜索字符串 。
-
Action
-
ACTION_WEB_SEARCH
Data URI Scheme
- 无 MIME Type
- 无 Extras
-
- 搜索字符串。
SearchManager.QUERY
Intent示例:
public void searchWeb ( String query ) {
Intent intent = new Intent ( Intent . ACTION_SEARCH );
intent . putExtra ( SearchManager . QUERY , query );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
设置(settings)
打开设置的特定部分(Open a specific section of Settings)
如果要让用户修改某些设置,就要打开系统设置中的对应窗口, 请使用以下 Action 的 Intent 来完成, Action 的名称与各项设置的窗口相对应。
-
Action
-
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
关于其他设置窗口对应的 Action,请参阅
Settings
文档。
Data URI Scheme
- 无 MIME Type
- 无
Intent示例:
public void openWifiSettings () {
Intent intent = new Intent ( Intent . ACTION_WIFI_SETTINGS );
if ( intent . resolveActivity ( getPackageManager ()) != null ) {
startActivity ( intent );
}
}
短信(Text Messaging)
编写有附件的短信/彩信(Compose an SMS/MMS message with attachment)
要启动短信(sms)或彩信(mms),使用下面的意图动作之一,并利用下述的附件键值给出短消息的细节,比如电话号码、主题、消息内容等。
-
Action
-
ACTION_SENDTO
或ACTION_SEND
或ACTION_SEND_MULTIPLE
Data URI Scheme
-
- 邮件主题(通常只用于MMS)。
- 文本消息。
-
指向图片或视频附件的
Uri
。 如果使用ACTION_SEND_MULTIPLE
action,则本 Intent 附件应该是一个由指向图片、视频的 Uri 组成的 数组。
“主题”("subject")
“sms_body”
EXTRA_STREAM
sms:<PHONE_NUMBER>
smsto:<PHONE_NUMBER>
mms:<PHONE_NUMBER>
mmsto:<PHONE_NUMBER>
这些方案的处理相同。
MIME Type
PLAIN_TEXT_TYPE
(
"text/plain"
)
"image/*"
"video/*"
Extras
Intent示例:
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 action
,并包含“smsto:”
数据方案。例如:
public void composeMmsMessage ( String message , Uri attachment ) {
Intent intent = new Intent ( Intent . ACTION_SEND );
intent . setData ( Uri . parse ( "smsto:" )); //这可确保只有短信应用程序respond
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>
注意:如果要开发一款 SMS/MMS 消息应用程序,为了在 Android 4.4 以上版本中能够被用作默认 SMS 应用, 必须为很多额外的 Action 实现 Intent 过滤器。 详情请参阅文档 Telephony
。
Web浏览器
加载一个网页URL
要打开一个网页,使用ACTION_VIEW action,
并在Intent的数据中指定这个web的URL
-
Action
-
ACTION_VIEW
Data URI Scheme
-
HTTP:<URL>
https:<URL>
MIME Type
PLAIN_TEXT_TYPE
(
"text/plain"
)
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
Intent示例:
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>
<actionandroid:name="android.intent.action.VIEW"/>
<!-- Include the host attribute if you want your app to respond
only to URLs with your app's domain. -->
<dataandroid:scheme="http"android:host="www.example.com"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<!-- The BROWSABLE category is required to get links from web pages. -->
<categoryandroid:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
提示:如果你的Android应用程序提供了类似于你的网站的功能,包括意图过滤器指向你的网站的网址。然后,如果用户已经安装了您的应用程序,链接从电子邮件或其他网页指向你的网站打开你的Android应用程序,而不是你的网页。
用Android调试桥验证Intent(Verify Intents with the Android Debug Bridge)
要验证您的应用程序响应要支持Intent,可以使用 ADB
工具来触发特定的Intent:
- 为开发建立一个Android设备,或者使用虚拟设备。
- 安装一个版本的应用程序,这个应用程序处理要支持的意图。
- 用adb触发Intent:
adb sehll 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
- 如果你定义所需的意图过滤器,您的应用程序就可以处理这个意图。
欲了解更多信息,请参阅 使用活动管理器(AM)(Using activity manager(am))。
意图通过Google Now 被触发(Intent Fired by Google Now)
Google Now 识别很多语音指令,并且为它们触发Intent。因此,用户可以用Google Now 语音指令启动应用程序如果您的应用程序声明了相应的Intent过滤器。例如,如果你的应用程序可以 设置闹钟,并增加相应的意图过滤器到你的manifest文件,Google Now可以让用户选择你的应用程序,当用户需要设计一个闹钟时,如图1所示。
图1
表1。被Google Now 识别的语音指令(谷歌搜索应用程序V3.6)。
Category | Details and Examples | Action Name |
---|---|---|
Alarm |
| AlarmClock.ACTION_SET_ALARM |
| AlarmClock.ACTION_SET_TIMER | |
Communication |
| Intent.ACTION_CALL |
Fitness |
| FitnessIntents.ACTION_TRACK |
| FitnessIntents.ACTION_TRACK | |
| FitnessIntents.ACTION_TRACK | |
| FitnessIntents.ACTION_VIEW | |
| FitnessIntents.ACTION_VIEW | |
Local |
| ReserveIntents |
Media |
| MediaStore |
| MediaStore | |
| MediaStore | |
Search |
| "com.google.android.gms.actions |
Web browser |
| Intent.ACTION_VIEW |