Android开发-API指南-常用Intent
2014-08-22 13:48
525 查看
Common Intents
英文原文:http://developer.android.com/guide/components/intents-common.html采集(更新)日期:2014-7-16在本文中
闹钟创建闹钟创建计时器显示所有闹钟日历添加日历事件摄像头拍照或摄像并返回结果通讯录/联系人应用选择联系人选择联系人的指定信息查看联系人编辑已有联系人添加联系人Email撰写可带附件的邮件文件存储查找某类文件打开某类文件地图在地图上显式地理位置音乐和视频播放音频文件根据检索请求播放音乐电话拨打电话设置打开系统设置中的某个项目文字短信撰写带附件的SMS/MMS 信息Web 浏览器载入 WebURL执行 Web搜索参阅
Intent 和Intent 过滤器通过 Intent 可以启动其他应用程序中的 Activity ,只要在此Intent对象中给出需要执行的操作即可(比如“查看地图”或“拍照”)。由于这里未指定需要启动的组件,而只是给出了Action 和执行 Action 所用到的 数据,这种 Intent 就被称为隐式 Intent。在把隐式 Intent 作为参数调用
startActivity()或
startActivityForResult()时,系统会解析该Intent 并发送给能够处理该 Intent 的应用程序,并启动相应的
Activity。如果能够处理该 Intent 的应用程序超过一个,系统会给出对话框供用户选择。本文介绍了多个用于执行常见 Action 的隐式 Intent,并按照处理这些 Intent 的应用程序进行了归类。每个章节还介绍了如何通过创建Intent过滤器 来对应用程序的 Action 处理能力进行公布。提醒: 如果当前设备上不存在可接收某种隐式 Intent 的应用程序,则调用
startActivity()的应用程序将会崩溃。 为了预先判断一下是否存在可接收 Intent的应用程序,请调用
Intent对象的
resolveActivity()。 如果结果非空,则表示至少存在一个可处理该 Intent的应用程序,并且可安全调用
startActivity()。 如果结果为 null ,请勿再使用该 Intent,并尽可能关闭那些会发起该Intent 的功能。如果还不清楚 Intent 和 Intent 过滤器的创建过程,请先去阅读Intent 和Intent 过滤器。
闹钟
创建闹钟
要新建一个闹钟,请使用ACTION_SET_ALARM并设置闹钟的详细参数,包4000括在 Intent 的附件(extra)中给出时间和文字信息,如下所示。注意: 在 Android 2.3 (API 级别 9)版本中,附件里只能包含小时、分钟和文字信息。其他类型的附件是在后续版本的系统中加入的。Action
ACTION_SET_ALARM数据 URI无MIME 类型无附件
EXTRA_HOUR闹钟的小时数。
EXTRA_MINUTES闹钟的分钟数
EXTRA_MESSAGE用于标识闹钟的文字信息。
EXTRA_DAYS一个
ArrayList对象, 存放了本闹钟需要在每周的星期几重复触发。 每一天用
Calendar类中定义的整数值来表示,比如
MONDAY。如果是一次性的闹钟,请勿给出该附件。
EXTRA_RINGTONE一个
content:URI ,用于指定闹钟所用的铃声。 如果不需要铃声则为
VALUE_RINGTONE_SILENT如果要使用默认的铃声,就不需要指定本附件。
EXTRA_VIBRATE布尔值,指明闹钟是否需要振动。
EXTRA_SKIP_UI布尔值,指明应用程序在设定闹钟时是否要跳过用户交互过程。 如果设为 True,则应用程序将会跳过所有的确认界面,直接设定所需的闹钟。Intent 示例:
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_ALARMIntent,应用程序必须拥有
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
ACTION_SET_TIMER数据 URI无MIME 类型无附件
EXTRA_LENGTH计时器的时长,单位为秒。
EXTRA_MESSAGE用于标识该计时器的自定义文字信息。
EXTRA_SKIP_UI布尔值,指明应用程序在设定计时器时是否要跳过用户交互过程。 如果设为 True,则应用程序将会跳过所有的确认界面,直接设定所需的计时器。Intent 示例:
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_TIMERIntent ,应用程序必须拥有
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
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 >
Calendar
添加日历事件
为了在用户的日历中加入一个新事件,请使用ACTION_INSERT并用
Events.CONTENT_URI指定数据 URI 。还可以在附件中设定事件的各种细节参数,如下所示。Action
ACTION_INSERT数据 URI
Events.CONTENT_URIMIME 类型
"vnd.android.cursor.dir/event"附件
EXTRA_EVENT_ALL_DAY布尔值,指明是否为全天性事件。
EXTRA_EVENT_BEGIN_TIME事件的起始时间(自公元纪年开始的毫秒数)。
EXTRA_EVENT_END_TIME事件的终止时间(自公元纪年开始的毫秒数)。
TITLE事件的标题。
DESCRIPTION事件的说明。
EVENT_LOCATION事件的地点。
EXTRA_EMAIL受邀者的 Email 地址列表,中间用逗号分隔。可用的事件参数还有很多,都在
CalendarContract.EventsColumns类中给出了常量定义。Intent 示例:
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); } }Intent 过滤器示例:
< activity ... > < intent-filter > < action android:name="android.intent.action.INSERT" / > < data android:mimeType="vnd.android.cursor.dir/event" / > < category android:name="android.intent.category.DEFAULT" / > < /intent-filter > < /activity >
摄像头
拍照或摄像并返回结果
为了启动摄像头应用并接收返回的照片或视频,请使用ACTION_IMAGE_CAPTURE或
ACTION_VIDEO_CAPTURE。 并且在附件
EXTRA_OUTPUT中,还需要指定照片或视频的保存位置 URI 。Action
ACTION_IMAGE_CAPTURE或
ACTION_VIDEO_CAPTURE数据 URI Scheme无MIME 类型无附件
EXTRA_OUTPUT摄像头应用将把照片或视频文件保存到 URI 指定的位置 (以
Uri对象的方式给出)。一旦摄像头应用成功返回到调用 Activity (应用程序收到
onActivityResult()回调方法),就可以在由
EXTRA_OUTPUT值指定的 URI 位置访问到照片或视频文件。注意: 当使用
ACTION_IMAGE_CAPTURE拍照时,摄像头可以在结果
Intent中同时返回一张小尺寸的缩略图,位于附件中的“
data”字段中,格式为
Bitmap。Intent 示例:
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 resul 178a3 tCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); // 用 mLocationForPhotos 中的全尺寸图片文件进行其他操作 ... } }关于如何通过 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,然后把捕获到的图像或视频保存到该其指定的位置,并用包含了缩略图的
Intent调用
setResult(),缩略图数据应存放在 Intent 附件的“data”部分。
通讯录/联系人应用
选择联系人
要让用户选择联系人并访问其所有数据,请使用ACTION_PICK,并把 MIME 类型设定为
Contacts.CONTENT_TYPE。在传给回调方法
onActivityResult()的结果
Intent中,包含了指向所选的联系人数据的
content:URI 。这时还向调用方应用临时授予读取通讯录的权限,这是通过Contacts Provider API 来完成的,即使该应用没有包含
READ_CONTACTS权限也没有关系。提示: 如果只需要访问联系人的部分信息,比如电话号码或 Email 地址,请参阅下一章节选择联系人的指定信息。Action
ACTION_PICK数据 URI Scheme无MIME 类型
Contacts.CONTENT_TYPEIntent 示例:
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(); // 利用 contactUri 执行某些操作 ... } }有了联系人的 URI 之后,如何读取联系人详细数据的详细内容,请参阅读取联系人详细数据。 请记住,用上述 Intent 访问联系人 URI时,读取详细信息是不需要
READ_CONTACTS权限的。
选择联系人的指定信息
为了能让用户选择联系人的部分信息,比如电话、Email 地址或其他数据,请使用ACTION_PICK,并指定下述的数据 MIME 类型,比如
CommonDataKinds.Phone.CONTENT_TYPE就是用于获取联系人电话号码的。如果只需要从通讯录中读取某一类数据,则用
ContactsContract.CommonDataKinds类中定义的
CONTENT_TYPE会比上一节提到的
Contacts.CONTENT_TYPE效率更高,因为返回的结果直接就是目标数据,不需要再在ContactsProvider 上执行更复杂的查询。在传给回调方法
onActivityResult()的结果
Intent中,包含了指向所选的联系人数据的
content:URI 。这时还向调用方应用临时授予读取通讯录的权限,即使该应用没有包含
READ_CONTACTS权限也没有关系。Action
ACTION_PICK数据 URI Scheme无MIME 类型
CommonDataKinds.Phone.CONTENT_TYPE读取联系人电话号码。
CommonDataKinds.Email.CONTENT_TYPE读取联系人 email 地址。
CommonDataKinds.StructuredPostal.CONTENT_TYPE读取联系人邮寄地址。或者是
ContactsContract中定义的其他
CONTENT_TYPE值。Intent 示例:
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // 打开 Activity 让用户从通讯录中选取一个电话号码 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) { // 获取 URI 并在 Content Provider 中查询电话号码 Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // 如果返回的游标有效,则读取电话号码 if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // 利用电话号码执行某些操作 ... } } }
查看联系人
要显示一个已有联系人的详细信息,请使用ACTION_VIEW,同时在 Intent 的数据部分中用
content:指定联系人。获得联系人 URI 的方法主要有两种:使用上一节提到的由
ACTION_PICK返回的 URI (这时不需要任何权限)。直接访问包含所有联系人的列表,这将在获取全部联系人的列表 中介绍(这时需要
READ_CONTACTS权限)。Action
ACTION_VIEW数据 URI Scheme
content: < URI >MIME 类型无。类型可由联系人的 URI 得出。Intent 示例:
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
编辑已有联系人
要编辑已有联系人,请使用ACTION_EDIT,在 Intent 的数据部分用
content:指定
content:URI , 在 Intent 的附件部分用
ContactsContract.Intents.Insert定义的常量给出已知联系人的信息。获得联系人 URI 的方式主要有两种:使用上一节提到的由
ACTION_PICK返回的 URI (这时不需要任何权限)。直接访问包含所有联系人的列表,这将在获取全部联系人的列表 中介绍(这时需要
READ_CONTACTS权限)。Action
ACTION_EDIT数据 URI Scheme
content: < URI >MIME 类型从联系人 URI 中得出。附件在
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); } }关于编辑联系人的更多信息,请参阅利用 Intent 修改通讯录。
添加联系人
要添加一个新的联系人,请使用ACTION_INSERT,用
Contacts.CONTENT_TYPE指定 MIME 类型,在附件部分用
ContactsContract.Intents.Insert中定义的常量指定已知的联系人信息。Action
ACTION_INSERT数据 URI Scheme无MIME 类型
Contacts.CONTENT_TYPE附件一个或多个由
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); } }关于添加联系人的更多信息,请参阅利用 Intent 修改通讯录。
撰写可带附件的 Email
要撰写一封 Email,请根据是否包含邮件附件来选用一种下述的 Action , 并且在 Intent 附件中用下述键值给出Email 的详细信息,比如收件人和主题等。ActionACTION_SENDTO(不带邮件附件时)或
ACTION_SEND(带有一个邮件附件时)或
ACTION_SEND_MULTIPLE(带有多个邮件附件时)数据 URI Scheme无MIME 类型
PLAIN_TEXT_TYPE("text/plain")
"**"); 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); } } 如果要确保仅能由 Email 应用来处理 Intent (不允许其他文字信息或社交类应用进行处理), 请使用ACTION_SENDTO ,并将数据 URI Scheme 给定为
"mailto:"。例如:
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // 只允许 Email 应用来处理 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="**”。Action
ACTION_OPEN_DOCUMENT或
ACTION_CREATE_DOCUMENT数据 URI Scheme无MIME 类型MIME 类型与用户选择的文件类型相对应。附件
EXTRA_MIME_TYPESMIME 类型的数组,对应于应用程序需要的文件类型。 如果使用了该附件数据,就必须把主 MIME 类型用
setType()设为 “
*/*”。
EXTRA_ALLOW_MULTIPLE布尔值,标明用户是否可以一次选取多个文件。
EXTRA_TITLE使用
ACTION_CREATE_DOCUMENT时用来指定初始文件名称。
EXTRA_LOCAL_ONLY布尔值,标明返回的文件是否可从设备直接访问,而不需要从远程服务中下载。类型
CATEGORY_OPENABLE表示仅返回“可打开”的文件,也就是可用
openFileDescriptor()来表示的文件流。
读取图片文件的 Intent 示例:
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); // 只有系统能收到 ACTION_OPEN_DOCUMENT,因此不必检测。 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(); // 用 fullPhotoUri 中的全尺寸图片文件执行某些操作 ... } }
其实,第三方应用无法真正响应 Action 为 [code]ACTION_OPEN_DOCUMENT的 Intent 。而是由系统接收此类 Intent ,并在统一的用户界面中显示来自各个应用的所有可用文件。为了能在这个系统界面中显示出文件,并允许其他应用程序打开这些文件,应用程序必须实现一个
DocumentsProvider对象,其中包含了
PROVIDER_INTERFACEIntent 过滤器(
"android.content.action.DOCUMENTS_PROVIDER")。例如:[/code]
< 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 >
关于如何让自己的文件可以被其他应用程序打开的更多信息,请参阅 存储访问架构指南。
地图
在地图上显示地理位置
要打开地图,请使用[code]ACTION_VIEW并在 Intent 数据部分给出位置信息,数据的 Scheme 在下述内容中选取一个。[/code]Action
ACTION_VIEW数据 URI Scheme
geo:latitude,longitude显示指定经纬度位置的地图。例如
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom以某个缩放级别显示给定经纬度位置的地图。 放大级别为 1 表示整个地球,以给定的lat、lng 为中心。 最高(最大)的放大级别为 23 。例如:“
geo:47.6,-122.3?z=11”
geo:0,0?q=lat,lng(label)显示指定经纬度位置的地图,并带有一个字符串标签。例如:
"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address显示由“my street address”查询出来的位置(地址或位置查询)。例如:
"geo:0,0?q=1600+Amphitheatre+Parkway,+CA"注意:
geoURI 中的所有字符串必须经过转码。 例如,字符串
1st & Pike, Seattle应该写为
1st & Pike,Seattle。 字符串中的空格可以用 转码,也可以用加号代替(
+)。MIME 类型无
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 >
音乐和视频
播放媒体文件
要播放音频文件,请使用[code]ACTION_VIEW并在 Intent 数据部分指定文件的 URI 位置。[/code]Action
ACTION_VIEW数据 URI Scheme
file: < URI >
content: < URI >
http: < URL >MIME 类型
"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 >
根据搜索请求播放音频
要根据搜索请求播放音频,请使用[code]INTENT_ACTION_MEDIA_PLAY_FROM_SEARCHIntent。在响应用户的语音命令来播放音乐时,应用程序就可以触发该类 Intent。接收本 Intent 的应用程序会在其音乐库中进行检索,如果找到匹配的内容就会开始播放。本类 Intent 应该包含字符串型的附件
EXTRA_MEDIA_FOCUS,用于指定检索模式。例如,可以指定检索艺术家名字还是歌名。[/code]Action
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH数据 URI Scheme无MIME 类型无附件
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(必填项) — 包含专辑、艺术家、风格、歌曲名称或这些条件任意组合的字符串。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。广播频道 —
"vnd.android.cursor.item/radio"播放指定频道广播或者匹配附件数据给定规则的频道。额外附件数据:
EXTRA_MEDIA_ALBUM— 专辑。
EXTRA_MEDIA_ARTIST— 艺术家。
"android.intent.extra.genre"— 风格。
"android.intent.extra.radio_channel"— 广播频道。
EXTRA_MEDIA_TITLE— 供广播频道参考的歌曲名称。
QUERY(必填项) — 包含专辑、艺术家、风格、广播频道、歌曲名称或这些条件任意组合的字符串。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。播放列表 —
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 示例:如果用户需要收听正在播放指定艺术家歌曲的广播电台,检索应用程序就可以创建以下 Intent:
public void playSearchRadioByArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, "vnd.android.cursor.item/radio"); 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 应该检查传入的[code]Intent的附件值
EXTRA_MEDIA_FOCUS。一旦 Activity 识别出了检索模式,就应该读取该模式下的额外附件数据。利用这些信息,应用程序就可以在自己的曲库中查找并播放符合要求的音乐。例如:[/code]
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); // 根据检索模式的不同,有些附件数据可能不可用 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 rchannel = intent.getStringExtra("android.intent.extra.radio_channel"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // 检测搜索模式并采用相应的附件数据 if (mediaFocus == null) { // “非结构化” 检索模式(向后兼容) playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // “任意”检索模式 playResumeLastPlaylist(); } else { // “非结构化” 检索模式 playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { //“风格” 检索模式 playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // “艺术家” 检索模式 playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // “专辑” 检索模式 playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // “歌曲名称” 检索模式 playSong(album, artist, genre, title); } else if (mediaFocus.compareTo("vnd.android.cursor.item/radio") == 0) { // “广播频道” 检索模式 playRadioChannel(album, artist, genre, rchannel, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // “播放列表” 检索模式 playPlaylist(album, artist, genre, playlist, title); } }}
电话
拨打电话
要打开电话应用并拨打一个电话号码,请使用[code]ACTION_DIAL并用下述的 URI Scheme 给出电话号码。电话应用在打开时会显示这个号码,但用户必须按下Call按钮(译者注:大部分手机的“拨打”键都是个话机图标)才会开始拨打电话。[/code]Action
ACTION_DIAL数据 URI Scheme
tel: < phone-number >MIME 类型无
合法的电话号码由the IETF RFC 3966标准定义。示例如下:
tel:2125551212
tel:(212) 555 1212
拨号应用对于电话号码的格式识别已经很完美了。因此在[code]Uri.parse()方法中并未用到很严格的 Scheme 定义。不过,如果某个 Scheme 没有用过或者不确定是否能被处理,则可以换用
Uri.fromParts()。Intent 示例:[/code]
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); }}
设置
打开系统设置中的某个项目
如果要让用户修改某些设置,就要打开系统设置中的对应窗口,请使用以下 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,请参阅
设置文档。数据 URI Scheme无MIME 类型无
Intent 示例:
public void openWifiSettings() { Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); }}
文字短消息
撰写带有附件的 SMS/MMS 消息
要新建一条 SMS 或 MMS 消息,请使用以下 Action 的 Intent ,并利用下述的附件键值给出短消息的细节,比如电话号码、主题、消息内容等。Action
ACTION_SENDTO或
ACTION_SEND或
ACTION_SEND_MULTIPLE数据 URI Scheme
sms: < phone_number >
smsto: < phone_number >
mms: < phone_number >
mmsto: < phone_number >这些 Scheme 是同时处理的。MIME 类型
PLAIN_TEXT_TYPE(
"text/plain")
"image/*"
"video/*"附件
"subject"用作短信主题的字符串(通常仅用于 MMS)。
"sms_body"用作短信内容的字符串。
EXTRA_STREAM指向图片或视频附件的
Uri。如果使用
ACTION_SEND_MULTIPLE,则本 Intent 附件应该是一个由指向图片、视频的
Uri组成的
ArrayList。
Intent 示例:
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); 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 只允许由短信应用(而不是其他 Email 或社交类应用)进行处理,请使用[code]ACTION_SENDTO并将数据 Scheme 给定为 “
smsto:” 。例如:[/code]
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("smsto:")); // 这就确保只有 SMS 应用才能响应 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 过滤器。详情请参阅文档[code]Telephony。[/code]
Web 浏览器
载入 Web URL
要打开一个网页,请使用[code]ACTION_VIEW并在 Intent 数据部分指定 Web URL。[/code]Action
ACTION_VIEW数据 URI Scheme
http: < URL >
https: < URL >MIME 类型
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 > < 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 应用的功能与你的 Web 网站类似,请为指向你的网站的 URL 声明一条 Intent 过滤器。这样,如果用户已经安装了你的应用,则在邮件或其他网页中点击你的网站链接,就会直接打开你的 Android 应用,而不是你的网站。
执行 Web 搜索
要启动一次 Web 搜索,请使用[code]ACTION_WEB_SEARCH并在附件
SearchManager.QUERY中指定搜索字符串。[/code]Action
ACTION_WEB_SEARCH数据 URI Scheme无MIME 类型无附件
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); }}
相关文章推荐
- Android开发-API指南-常用Intent
- [转]Android开发-API指南-常用Intent
- Android开发-API指南-常用Intent[原创译文]
- Android开发-API指南-常用Intent
- Android开发-API指南-<intent-filter>
- Android开发-API指南-<intent-filter>
- Android开发-API指南-Intent和Intent过滤器
- Android开发-API指南-Manifest介绍
- Android开发-API指南-应用程序开发基础
- Android开发之API应用指南
- Android开发-API指南-<activity-alias>
- Android开发-API指南-任务和回退栈
- Android 开发指南 翻译10:Intents and Intent Filters
- Android开发中常用到Intent的URI与示例
- Android开发-API指南-Android简介
- Android开发-API指南-<application>
- 【Android开发经验】Android Studio1.0正式版初体验——常用功能使用指南
- Android高级开发第四讲--API之Intents and Intent Filters
- Android高级开发第四讲--API之Intents and Intent Filters
- Android开发之API应用指南