Intent的真正强大之处在于它的隐式Intent,隐式Intent需要配合Intent-filters使用,有关这方面的概念和知识,您可以参考我翻译的官方文档:《Android官方文档之App Components(Intents and Intent Filters)》。
隐式Intent足够强大,以至于系统提供了大量的Intent方便开发者启动系统应用程序,本文将介绍一些常用的隐式Intent、以及如何自定义intent-filters以匹配隐式intent。
如需阅读官方原文,您可以点击这个链接:《Common Intents》
下面将按照启动的目标组件类别介绍隐式Intent:
要启动闹钟activity,可以这样设定Intent:
Action:ACTION_SET_ALARM
Data URI:空
MIME Type:空
Extras:
EXTRA_HOUR:设定小时
EXTRA_MINUTES:设定分钟
EXTRA_MESSAGE:设定自定义消息
EXTRA_DAYS:设定每周的周几重复响铃。该字段的值应定义成ArrayList,每个元素是Calendar类中的静态字段(如Calendar.Monday)。对于那些一次性响铃,无需设置这个extra。
EXTRA_RINGTONE:设定闹钟铃声。该字段的值应设定成一个scheme为 content: 的URI类型,该URI指向了一个音频文件的地址;您也可以将值设定为 VALUE_RINGTONE_SILENT,这表示将闹钟设为静音。
EXTRA_VIBRATE:设定是否响铃的同时震动。该字段的值为boolean类型。
EXTRA_SKIP_UI:设定启动系统闹钟应用程序时,是否跳过UI界面,值为boolean类型,若为true,表示不显示设定闹钟的dialog对话框,而直接进入设置闹钟的activity。
示例:
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);
}
}
若为Intent指定的action为ACTION_SET_ALARM,则需要在manifest中配置如下权限:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
可以响应该Intent的intent-filter如下:
...>
"android.intent.action.SET_ALARM" />
"android.intent.category.DEFAULT" />
!请注意:该Intent只兼容 Android 4.4 (API level 19) 及以上版本的设备。
要启动计时器,可以这样设定Intent:
Action:ACTION_SET_TIMER
Data URI:空
MIME Type:空
Extras:
EXTRA_LENGTH:设置倒计时的秒数
EXTRA_MESSAGE:设置到时消息
EXTRA_SKIP_UI:设定启动系统计时器应用程序时,是否跳过UI界面,值为boolean类型,若为true,表示不显示设定计时器的设置dialog对话框,而直接进入计时器的activity。
示例:
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);
}
}
若为Intent指定的action为ACTION_SET_TIMER,则需要在manifest中配置如下权限:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
可以响应该Intent的intent-filter如下:
...>
"android.intent.action.SET_TIMER" />
"android.intent.category.DEFAULT" />
!请注意:该Intent只兼容 Android 4.4 (API level 19) 及以上版本的设备。
Action:ACTION_SHOW_ALARMS
Data URI:空
MIME Type:空
示例:
...>
"android.intent.action.SHOW_ALARMS" />
"android.intent.category.DEFAULT" />
Action:ACTION_INSERT
Data URI:Events.CONTENT_URI
MIME Type:”vnd.android.cursor.dir/event”
Extras:
EXTRA_EVENT_ALL_DAY:该键所对应的值是boolean类型,表示事件是否为全天候事件。
EXTRA_EVENT_BEGIN_TIME:代表事件的起始时间,值为 从2000年到设定起始时间所经历的毫秒数(milliseconds since epoch)。
EXTRA_EVENT_END_TIME :代表事件的结束时间,值为 从2000年到设定结束时间所经历的毫秒数(milliseconds since epoch)。
TITLE:事件的标题
DESCRIPTION:事件的描述
EVENT_LOCATION:事件发生的地点
EXTRA_EMAIL:将事件邮件的形式发送,值为邮箱地址,可同时发送给多人,邮箱地址以逗号分隔。欲了解更多关于发送邮件的细节,您可以参考这个类:CalendarContract.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);
}
}
可以匹配上述intent的intent-filters:
...>
"android.intent.action.INSERT" />
"vnd.android.cursor.dir/event" />
"android.intent.category.DEFAULT" />
Action:ACTION_IMAGE_CAPTURE 或 ACTION_VIDEO_CAPTURE
Data URI Scheme:空
MIME Type:空
Extras:EXTRA_OUTPUT,该键所对应的值是一个Uri对象,它表示通过相机应用所照的相片或录的视频的存储地址。您可以在onActivityResult()方法中通过该Uri获取刚照的相片。
!请注意:通过ACTION_IMAGE_CAPTURE启动activity并返回的照片是一个键为”data”的Bitmap类型的略缩图(downscaled copy (a thumbnail) of the photo)
示例如下:
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
...
}
}
关于如何通过这个Intent拍照、录像,以及如何获得存储照片、录像的Uri地址,您可以参考这些Training:
Taking Photos Simply
Taking Videos Simply
示例intent-filter:
...>
"android.media.action.IMAGE_CAPTURE" />
"android.intent.category.DEFAULT" />
Action:INTENT_ACTION_STILL_IMAGE_CAMERA
Data URI Scheme:空
MIME Type:空
Extras:空
示例:
public void capturePhoto() {
Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent);
}
}
intent-filter:
...>
"android.media.action.STILL_IMAGE_CAMERA" />
"android.intent.category.DEFAULT" />
Action:INTENT_ACTION_VIDEO_CAMERA
Data URI Scheme:空
MIME Type:空
Extras:空
示例:
public void capturePhoto() {
Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent);
}
}
intent-filter:
...>
"android.media.action.VIDEO_CAMERA" />
"android.intent.category.DEFAULT" />
在onActivityResult()中可获取您选择的联系人,如果只是通过Contacts Provider读取联系人信息,则无需申请READ_CONTACTS权限。
Action:ACTION_PICK
Data URI Scheme:None
MIME Type: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
...
}
}
关于如何处理返回的Uri对象contactUri ,您可以访问这个Training:Retrieving Details for a Contact
Action:ACTION_PICK
Data URI Scheme:空
MIME Type:
CommonDataKinds.Phone.CONTENT_TYPE,表示获取联系人号码
CommonDataKinds.Email.CONTENT_TYPE,表示获取联系人Email
CommonDataKinds.StructuredPostal.CONTENT_TYPE,表示获取联系人的邮寄地址
示例:
static final int REQUEST_SELECT_PHONE_NUMBER = 1;
public void selectContact() {
// Start an activity for the user to pick a phone number from contacts
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
// Get the URI and query the content provider for the phone number
Uri contactUri = data.getData();
String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
Cursor cursor = getContentResolver().query(contactUri, projection,
null, null, null);
// If the cursor returned is valid, get the phone number
if (cursor != null && cursor.moveToFirst()) {
int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
String number = cursor.getString(numberIndex);
// Do something with the phone number
...
}
}
}
Action:ACTION_VIEW
Data URI Scheme:content:
,该Uri指向了查看的联系人地址,有两种方法可获得该Uri:
直接检索通讯录联系人( Retrieving a List of Contacts)。此方式需要READ_CONTACTS权限。
MIME Type:空
示例:
public void viewContact(Uri contactUri) {
Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Action:ACTION_EDIT
Data URI Scheme:content:
,获取该Uri的方式和权限与上一小节的获取方式一致。
MIME Type:由Uri决定。
Extras:ContactsContract.Intents.Insert
示例:
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);
}
}
更多关于编辑联系人的方法,您可以参考这个Training:Modifying Contacts Using Intents。
Action:ACTION_INSERT
Data URI Scheme:空
MIME Type:Contacts.CONTENT_TYPE
Extras:ContactsContract.Intents.Insert
示例:
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);
}
}
Action:
ACTION_SENDTO。用于发送不带附件的Email(for no attachment)
ACTION_SEND。用于发送带一个附件的Email(for one attachment)
ACTION_SEND_MULTIPLE。用于发送多个附件的Email(for multiple attachments)
Data URI Scheme:空
MIME Type:
"text/plain"
"*/*"
Extras:
Intent.EXTRA_EMAIL:该键所对应值为一个字符串数组,每个字符串表示一个收件人的地址。
Intent.EXTRA_CC:该键所对应值为一个字符串数组,每个字符串表示一个副本抄送地址(CC= Carbon Copy)。
Intent.EXTRA_BCC:该键所对应值为一个字符串数组,每个字符串表示一个密件抄送地址(BCC= Blind Carbon Copy)。
Intent.EXTRA_SUBJECT:该键所对应值为一个字符串,表示邮件主题。
Intent.EXTRA_TEXT:该键所对应值为一个字符串,表示邮件内容。
Intent.EXTRA_STREAM:该键所对应值为一个Uri地址,该Uri指向了添加的附件,若action为 ACTION _SEND _MULTIPLE,则值应为ArrayList,每个元素为一个Uri对象。
示例:
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能启动一个邮件应用的activity(而不是社交类应用或是编辑短信的应用),那么您可以使用action为ACTION_SENDTO并且使用”mailto”作为Uri的解析字符串发送邮件:
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>
为了能够获取用户选择文件的引用(如一张照片、一个文档),可以使用ACTION_GET_CONTENT
这个action,并指定期望的MIME类型。而返回的文件的引用仅短暂存在于activity的生命周期中,若希望较持久化的保存文件,程序需要将引用指向的文件复制一份并保留下来。该Intent同时允许在此进程中新建文件。
通过回调方法onActivityResult(),可以获得回传的Intent对像,该对象包含了用户选择文件的Uri地址,该Uri地址的scheme可以是任何类型,比如可以是http:
,content:
或file:
;如果您仅希望用户检索的文件来自于ContentProvider(也就是Uri的scheme为content:
类型),并通过openFileDescriptor()方法获得文件流,那么需要为Intent中加入CATEGORY_OPENABLE
的category。
若设备版本为Android 4.3 (API level 18)及以上,您还可以通过为Intent添加键为EXTRA_ALLOW_MULTIPLE
,值为true的extra,来同时选择多个文件,并通过Intent.getClipData()方法返回ClipData对象来获取其中包含的多个文件。
Action:ACTION_GET_CONTENT
Data URI Scheme:空
MIME Type:该类型由用户选择的文件类型决定。
Extras:
下例演示了如何通过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
...
}
}
匹配的Intent-filter:
<activity ...>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<data android:type="image/*" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.OPENABLE" />
intent-filter>
activity>
当SDK版本为Android 4.4 或以上时,可以通过ACTION_OPEN_DOCUMENT
这个action及特定的MIME类型打开一个其他应用的文件并管理它,您还可以通过ACTION_CREATE_DOCUMENT
这个action来写入一个文件。
Action:ACTION_OPEN_DOCUMENT 或 ACTION_CREATE_DOCUMENT
Data URI Scheme:空
MIME Type:由用户选择的文件类型确定
Extras:
"*/*"
。ACTION_CREATE_DOCUMENT
这个action,为新建的文件起一个标题。示例:
static final int REQUEST_IMAGE_OPEN = 1;
public void selectImage() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
// Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
startActivityForResult(intent, REQUEST_IMAGE_OPEN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) {
Uri fullPhotoUri = data.getData();
// Do work with full size photo saved at fullPhotoUri
...
}
}
为了让第三方APP也能识别ACTION_OPEN_DOCUMENT
这个action,徐这样配置ContentProvider:
...
android:grantUriPermissions="true"
android:exported="true"
android:permission="android.permission.MANAGE_DOCUMENTS">
"android.content.action.DOCUMENTS_PROVIDER" />
Action:ACTION_VIEW
Data URI Scheme:
geo:latitude,longitude
:在地图上显示指定的位置,如:"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
:在地图上按一定的放大级别显示指定的位置,1表示最远,显示的是全球地图,中心点在是给定的经纬度;23表示最接近地面(closest) 。如:"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
:显示指定的位置并显示一个label。如:"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
:在地图上显示指定的某个地址的位置。如:"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
。
!注意:由geo
开头的Uri所解析的字符串参数必须被编码,例如字符串"1st & Pike, Seattle"
所表示的地址应被编码为"1st%20%26%20Pike%2C%20Seattle"
,才能传入Uri.parse()方法中,其中字符串中的空格应被编码成%20
或者加号( + )。
示例:
public void showMap(Uri geoLocation) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(geoLocation);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
匹配的intent-filter:
...>
"android.intent.action.VIEW" />
"geo" />
"android.intent.category.DEFAULT" />
Action:ACTION_VIEW
Data URI Scheme:
file:
content:
http:
MIME Type:
"audio/*"
"application/x-ogg"
"application/itunes"
示例:
public void playMedia(Uri file) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(file);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
匹配的intent-filter:
...>
"android.intent.action.VIEW" />
"audio/*" />
"application/ogg" />
"android.intent.category.DEFAULT" />
Action:ACTION_CREATE_NOTE
Data URI Scheme:空
MIME Type:
PLAIN_TEXT_TYPE
"*/*"
Extras:
EXTRA_NAME ,表示备忘录的标题
EXTRA_TEXT,表示备忘录的内容
示例:
public void createNote(String subject, String text) {
Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE)
.putExtra(NoteIntents.EXTRA_NAME, subject)
.putExtra(NoteIntents.EXTRA_TEXT, text);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
匹配的intent-filter:
...>
"com.google.android.gms.actions.CREATE_NOTE" />
"android.intent.category.DEFAULT" />
您可以通过 ACTION_DIAL
这个action打开电话应用程序的拨号界面,并把电话号码作为参数到拨号框中,用户点击“拨打”按钮开始拨号。这无需任何权限。
您也可以通过ACTION_CALL
这个action直接拨打电话,而无需点击“拨打”按钮。这需要添加如下权限:
<uses-permission android:name="android.permission.CALL_PHONE" />
Intent的具体设置方式如下:
Action:
ACTION_DIAL,打开拨号界面。
ACTION_CALL,直接拨打电话。
Data URI Scheme:
tel:
voicemail:
MIME Type:空
合法的电话号码格式请参照这个链接:the IETF RFC 3966。合法的电话号码形如:
tel:2125551212
tel:(212) 555 1212
示例:
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:"com.google.android.gms.actions.SEARCH_ACTION"
,,支持通过Google Now 语音搜索。
Extras:QUERY,该键对应值是一个字符串,表示用户输入的搜索信息。
如希望自己的应用程序可以被搜索到,可以在intent-filter中按如下方式配置:
<activity android:name=".SearchActivity">
<intent-filter>
<action android:name="com.google.android.gms.actions.SEARCH_ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
intent-filter>
activity>
Action:ACTION_WEB_SEARCH
Data URI Scheme:空
MIME Type:空
Extras:SearchManager.QUERY。一个字符串,表示搜索的内容。
示例:
public void searchWeb(String query) {
Intent intent = new Intent(Intent.ACTION_SEARCH);
intent.putExtra(SearchManager.QUERY, query);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
您可能需要在使用app的过程中调整某些系统设置,以便更好地使用应用(比如应用需要开启蓝牙功能以便传输文件,这时app可以跳转至系统设置的蓝牙开关选项中,引导用户开启蓝牙功能)。您只需要在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
Data URI Scheme:空
MIME Type:空
示例:
public void openWifiSettings() {
Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Action:
ACTION_SENDTO
ACTION_SEND
ACTION_SEND_MULTIPLE
Data URI Scheme:
sms:
smsto:
mms:
mmsto:
以上四种方式效果相同
MIME Type:
"text/plain"
"image/*"
"video/*"
Extras:
"subject"
,该键对应值是一个字符串,表示发送短信的标题(通常只适用于发短信)。
"sms_body"
,该键对应值是一个字符串,表示消息内容。
EXTRA_STREAM,该键对应的值是一个Uri地址,它指向了附加文件,若action为ACTION_SEND_MULTIPLE
,则这个值应该是一个ArrayList
对象。
示例:
public void composeMmsMessage(String message, Uri attachment) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType(HTTP.PLAIN_TEXT_TYPE);
intent.putExtra("sms_body", message);
intent.putExtra(Intent.EXTRA_STREAM, attachment);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
若您通过intent打开的确实是一个发送短消息的应用(而不是Email或是社交类的应用),那么可以按如下方式操作:
public void composeMmsMessage(String message, Uri attachment) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse("smsto:")); // This ensures only SMS apps respond
intent.putExtra("sms_body", message);
intent.putExtra(Intent.EXTRA_STREAM, attachment);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
与之匹配的intent-filter配置如下:
...>
"android.intent.action.SEND" />
"text/plain" />
"image/*" />
"android.intent.category.DEFAULT" />
Action:ACTION_VIEW
Data URI Scheme:
http:
https:
MIME Type:
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
示例:
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-filter:
<activity ...>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="http" android:host="www.example.com" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
intent-filter>
activity>