Android官方开发指南-常见的意图(Common Intents)

常见的意图(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
EXTRA_HOUR
关于闹钟的小时。
EXTRA_MINUTES
关于闹钟的分钟。
EXTRA_MESSAGE
用来识别闹钟的自定义信息。
EXTRA_DAYS
一个 ArrayList包括每个有重复报警的工作日。每天在必须被声明的同时,也要有来自于   Calendar  类的一个整数,如MONDAY(星期一)。
EXTRA_RINGTONE
一个 content: URI指定一个铃声用于闹钟,或者使用 VALUE_RINGTONE_SILENT无铃声。

要使用默认的铃声,不用指定该额外信息。

EXTRA_VIBRATE
一个布尔值,指定是否为振动闹钟。
EXTRA_SKIP_UI
一个布尔值,指定响应的应用程序是否应该跳过其UI,在设置报警时。如果为true,应用程序应该绕过任何确认用户界面并且简单的设置指定的闹钟。

意图举例:

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
EXTRA_LENGTH
以秒为单位的计时器的长度
EXTRA_MESSAGE
用来确定定时器的自定义信息。
EXTRA_SKIP_UI
一个布尔值,指定响应应用程序是否应该跳过其UI,在设置定时器时。如果为true,应用程序应该绕过任何确认用户界面,并且简单的启动指定的定时器。

意图举例:

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_CAPTUREACTION_VIDEO_CAPTURE action。也要指定你想保存照片或视频的URI位置,在EXTRA_OUTPUT 额外信息中。

动作(action)
ACTION_IMAGE_CAPTUREACTION_VIDEO_CAPTURE
数据URI方案
MIME类型
Extras
EXTRA_OUTPUT
该URI位置,是相机应用程序应该保存照片或视频文件的地方(作为一个 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 发送到包含 contentonActivityResult()回调方法 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)
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)
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
PLAIN_TEXT_TYPE  ("text/plain") "*/*" Extras
Intent.EXTRA_EMAIL
所有收件人的电子邮件地址的字符串数组。
Intent.EXTRA_CC
所有抄送人的电子邮件地址的字符串数组。
Intent.EXTRA_BCC
所有密送人的电子邮件地址的字符串数组。
Intent.EXTRA_SUBJECT
电子邮件主题字符串。
Intent.EXTRA_TEXT
电子邮件正文字符串。
Intent.EXTRA_STREAM
一个URL 指向附件。如果使用  ACTION_SEND_MULTIPLE action ,这应该不是一个 包含多个 URL 对象的数组。

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,并包括 "mailto:"数据方案(data scheme)。例如:

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 (可选)
CATEGORY_OPENABLE
为了返回只有能“打开的”(openable)文件,这些文件通过用   openFileDescriptor()可以作为文件流。

获得一张图片的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 supports
OpenableColumns
             and
ContentResolver.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_DOCUMENTACTION_CREATE_DOCUMENT
Data URI Scheme
MIME类型
MIME类型对应用户选择的文件类型。
Extras
EXTRA_MIME_TYPES
一个MIME类型数组适应于你应用所需求的文件的类型。当你使用此附加数据,必须在   setType()中设置 主要MIME类型,以 “* / *” 
EXTRA_ALLOW_MULTIPLE
一个布尔值,表明该用户是否可以一次选择多个文件。
EXTRA_TITLE
使用 ACTION_CREATE_DOCUMENT来指定一个初始文件名 ​​。
EXTRA_LOCAL_ONLY
一个布尔值表明从设备中返回的文件是否必须是直接可用的,而不需要从远程服务的下载。
Category
CATEGORY_OPENABLE
为了返回仅可以打开的文件,通过 openFileDescriptor() 它们可以被表示为一个文件流。

获得一张图片的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
EXTRA_STATUS
一个字符串,其值在启动时是 STATUS_ACTIVE和 在停止时是 STATUS_COMPLETED 

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
EXTRA_STATUS
一个字符串,其值在启动时是 STATUS_ACTIVE和 在停止时是 STATUS_COMPLETED

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
EXTRA_STATUS
一个字符串,其值在启动时是 STATUS_ACTIVE和 在停止时是 STATUS_COMPLETED

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:latitude,longitude
显示指定经纬度位置的地图。

例如:“GEO:47.6,-122.3”

地理:纬度经度?Z = 缩放(zoom)(geo:latitude,longitude?z=zoom
以某个缩放级别显示给定经纬度位置的地图。 放大级别为 1 表示整个地球,以给定的 lat、lng 为中心。 最高(最大)的放大级别为 23 。

例如:“GEO:47.6,-122.3 Z = 11”

地理:0,0 Q =纬度,经度(标签)(geo:0,0?q=lat,lng(label))
显示指定经纬度位置的地图,并带有一个字符串标签。

例如:“GEO:0,0 Q = 34.99,-106.61(宝物)”

地理:0,0 Q =我+街道+地址(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。 字符串中的空格可以用 转码,也可以用加号代替(+)。

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
MediaStore.EXTRA_MEDIA_FOCUS(必填)

指示搜索模式(用户是否正在寻找一个特定的艺术家,专辑,歌曲或播放列表)。大多数搜索模式采取额外的附加数据。例如,如果用户喜欢听某些歌曲,Intent可能具有三部分附加数据:歌曲标题,艺术家和专辑。使用EXTRA_MEDIA_FOCUS键值,此Intent可以提供一下检索模式

任何 - “vnd.android.cursor.item / *”

播放任何音乐。 接收方应用将会智能选择要播放的音乐,比如用户最后一次听过的播放列表。

额外附件数据:

  • QUERY(必需) -空字符串。 为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。

非结构化 - “vnd.android.cursor.item / *”

根据一个非结构化的检索请求播放特定的歌曲、专辑或某风格的音乐。 如果应用程序无法辨识用户需要的音乐类型,那就可以用这种搜索模式创建 Intent 。 当然,应用程序还是应该尽可能地使用更为确切的检索模式。

额外附件数据:

  • QUERY(必需) -包含艺术家、专辑、歌曲名称、风格或者这些条件的任意组合的字符串。

流派 - Audio.Genres.ENTRY_CONTENT_TYPE

播放指定风格的音乐。

额外附件数据:

  • “android.intent.extra.genre” (必需) -流派。
  • QUERY(必需) -流派。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。

艺术家 - Audio.Artists.ENTRY_CONTENT_TYPE

播放指定艺术家的音乐。

额外附件数据:

  • EXTRA_MEDIA_ARTIST(必需) -艺术家。
  • “android.intent.extra.genre” -流派。
  • QUERY(必需) -一个字符串,其中包含了艺术家或流派的任意组合。附件数据总是提供向后兼容性:现有的应用程序,不知道搜索模式可以处理这个Intent,称为非结构化搜索。

专辑 - Audio.Albums.ENTRY_CONTENT_TYPE

播放特定专辑的音乐。

额外附件数据:

  • 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(必需) -一个字符串,其中包含的任意组合:专辑,艺术家,流派,或名称。这个附件数据总是提供向后兼容性:现有的应用程序,不知道搜索模式可以处理这个意图,称为非结构化搜索。

播放列表 - Audio.Playlists.ENTRY_CONTENT_TYPE

播放指定列表或匹配附件数据给定规则的列表。

额外附件数据:

  • EXTRA_MEDIA_ALBUM -专辑。
  • EXTRA_MEDIA_ARTIST -艺术家。
  • “android.intent.extra.genre” -流派。
  • “android.intent.extra.playlist” -播放列表。
  • EXTRA_MEDIA_TITLE -供播放列表参考的歌曲名称。
  • QUERY(必需) -一个字符串,其中包含的任意组合:专辑,艺术家,流派,播放列表,或名称。这个附加数据总是提供向后兼容性:现有的应用程序,不知道搜索模式可以处理这个intent,称为非结构化搜索。

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_SENDTOACTION_SENDACTION_SEND_MULTIPLE

Data URI Scheme
sms:<PHONE_NUMBER> smsto:<PHONE_NUMBER> mms:<PHONE_NUMBER> mmsto:<PHONE_NUMBER>

这些方案的处理相同。

MIME Type
PLAIN_TEXT_TYPE  ( "text/plain") "image/*" "video/*" Extras
“主题”("subject")
邮件主题(通常只用于MMS)。
“sms_body”
文本消息。
EXTRA_STREAM
指向图片或视频附件的    Uri。 如果使用  ACTION_SEND_MULTIPLE  action,则本 Intent 附件应该是一个由指向图片、视频的 Uri 组成的 数组。

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:

  1. 为开发建立一个Android设备,或者使用虚拟设备
  2. 安装一个版本的应用程序,这个应用程序处理要支持的意图。
  3. 用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
    
  4. 如果你定义所需的意图过滤器,您的应用程序就可以处理这个意图。

欲了解更多信息,请参阅 使用活动管理器(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

Set alarm

  • "set an alarm for 7 am"
AlarmClock.ACTION_SET_ALARM

Set timer

  • "set a timer for 5 minutes"
AlarmClock.ACTION_SET_TIMER
Communication

Call a number

  • "call 555-5555"
  • "call bob"
  • "call voicemail"
Intent.ACTION_CALL
Fitness

Start/stop a bike ride

  • "start cycling"
  • "start my bike ride"
  • "stop cycling"
FitnessIntents.ACTION_TRACK

Start/stop a run

  • "track my run"
  • "start running"
  • "stop running"
FitnessIntents.ACTION_TRACK

Start/stop a workout

  • "start a workout"
  • "track my workout"
  • "stop workout"
FitnessIntents.ACTION_TRACK

Show heart rate

  • "what's my heart rate"
  • "what's my bpm"
FitnessIntents.ACTION_VIEW

Show step count

  • "how many steps have I taken"
  • "what's my step count"
FitnessIntents.ACTION_VIEW
Local

Book a car

  • "call me a car"
  • "book me a taxi"
ReserveIntents
.ACTION_RESERVE_TAXI_RESERVATION
Media

Play music from search

  • "play michael jackson billie jean"
MediaStore
.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH

Take a picture

  • "take a picture"
MediaStore
.INTENT_ACTION_STILL_IMAGE_CAMERA

Record a video

  • "record a video"
MediaStore
.INTENT_ACTION_VIDEO_CAMERA
Search

Search using a specific app

  • "search for cat videos 
    on myvideoapp"
"com.google.android.gms.actions
.SEARCH_ACTION"
Web browser

Open URL

  • "open example.com"
Intent.ACTION_VIEW
http://developer.android.com/guide/components/intents-common.html#AdbIntents
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值