隐式Intent使用细节及常用Intent收藏

来源:互联网 发布:h5小游戏 知乎 编辑:程序博客网 时间:2024/05/22 09:40

一、验证是否存在接收Intent的应用

// 构建IntentUri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);// 验证解析列表PackageManager packageManager = getPackageManager();List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);boolean isIntentSafe = activities.size() > 0;// 如果存在,则启动if (isIntentSafe) {    startActivity(mapIntent);}

二、强制使用应用选择器

如果多个应用可以响应Intent,可以选择默认使用哪个打开,并设为默认项。如,浏览器等。

但是有些情况下,并不希望默认的使用哪个应用打开,比如分享功能,此时可以使用强制打开应用选择器。

Intent sendIntent = new Intent(Intent.ACTION_SEND);String title = getResources().getString(R.string.chooser_title);// 显示选择dialogIntent chooser = Intent.createChooser(sendIntent, title);// 验证至少有一个activity可以匹配这个intentif (sendIntent.resolveActivity(getPackageManager()) != null) {    startActivity(chooser);}

三、常用的通用Intent

1.创建闹钟:

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);    }}

其他extra:

EXTRA_DAYS:一个 ArrayList,其中包括应重复触发该闹铃的每个周日。 每一天都必须使用 Calendar 类中的某个整型值(如 MONDAY)进行声明。对于一次性闹铃,无需指定此 extra。


EXTRA_RINGTONE:一个 content: URI,用于指定闹铃使用的铃声,也可指定 VALUE_RINGTONE_SILENT 以不使用铃声。如需使用默认铃声,则无需指定此 extra。

EXTRA_VIBRATE:一个布尔型值,用于指定该闹铃触发时是否振动。

EXTRA_SKIP_UI:一个布尔型值,用于指定响应闹铃的应用在设置闹铃时是否应跳过其 UI。 若为 true,则应用应跳过任何确认 UI,直接设置指定的闹铃。



2.添加日历事件:

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);    }}
数据 URI:Events.CONTENT_URI
MIME 类型:"vnd.android.cursor.dir/event"
Extra:
EXTRA_EVENT_ALL_DAY:一个布尔型值,指定此事件是否为全天事件。
EXTRA_EVENT_BEGIN_TIME:事件的开始时间(从新纪年开始计算的毫秒数)。
EXTRA_EVENT_END_TIME:事件的结束时间(从新纪年开始计算的毫秒数)。
TITLE:事件标题。
DESCRIPTION:事件说明。
EVENT_LOCATION:事件地点。
EXTRA_EMAIL:以逗号分隔的受邀者电子邮件地址列表。

可使用 CalendarContract.EventsColumns 类中定义的常量指定许多其他事件详细信息。

<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>

3.拍照或视频:

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);    }}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {//缩略图        Bitmap thumbnail = data.getParcelable("data");        // mLocationForPhotos保存了原图,可以对之进行操作        ...    }}

Extra,MediaStore.ACTION_VIDEO_CAPTURE是录制视频。
EXTRA_OUTPUT:相机应用应将照片或视频文件保存到的 URI 位置(Uri 对象形式)。

相机可能还会在结果 Intent 中返回缩小尺寸的照片副本(缩略图),这个副本以 Bitmap 形式保存在名为 "data" 的 extra 字段中。
之后还会附上一篇对于4.4前后对于图片URI的解析文章。

4.选择联系人:

代码:

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);    }}@Overrideprotected 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        ...    }}


如需让用户选择联系人和为应用提供对所有联系人信息的访问权限,使用 ACTION_PICK,并将 MIME 类型指定为Contacts.CONTENT_TYPE。
onActivityResult() 回调中包含所选联系人的 content: URI。响应会利用 Contacts Provider API 为应用授予该联系人的临时读取权限,即使您的应用不具备 READ_CONTACTS 权限也没有关系。

5.选择特定联系人数据:

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);    }}@Overrideprotected 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            ...        }    }}


如果只需要检索一种类型的联系人数据,则将此方法与来自 ContactsContract.CommonDataKinds 类的 CONTENT_TYPE 配合使用要比使用 Contacts.CONTENT_TYPE(选择联系人中)更高效,因为结果可直接访问所需数据。
onActivityResult() 回调中包含所选联系人的 content: URI。响应会利用 Contacts Provider API 为应用授予该联系人的临时读取权限,即使您的应用不具备 READ_CONTACTS 权限也没有关系。
MIME 类型
CommonDataKinds.Phone.CONTENT_TYPE:从有电话号码的联系人中选取。
CommonDataKinds.Email.CONTENT_TYPE:从有电子邮件地址的联系人中选取。
CommonDataKinds.StructuredPostal.CONTENT_TYPE:从有邮政地址的联系人中选取。
或者 ContactsContract 下众多其他 CONTENT_TYPE 值中的一个

6.编辑现有联系人:

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);    }}
数据 URI:content:<URI>
Extra:ContactsContract.Intents.Insert 中定义的一个或多个 extra,以便您填充联系人详情字段。


7.插入现有联系人:

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);    }}


MIME 类型:Contacts.CONTENT_TYPE
Extra:ContactsContract.Intents.Insert 中定义的一个或多个 extra。


8.播放媒体文件

public void playMedia(Uri file) {    Intent intent = new Intent(Intent.ACTION_VIEW);    intent.setData(file);    if (intent.resolveActivity(getPackageManager()) != null) {        startActivity(intent);    }}


数据 URI :
file:<URI>
content:<URI>;
http:<URL>
MIME 类型:
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
或者您的应用可能需要的任何其他类型。

9.打电话:

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_DIAL - 打开拨号器或电话应用(只是打开,没有播出)。
ACTION_CALL - 拨打电话(需要 CALL_PHONE 权限)

声明权限<uses-permission android:name="android.permission.CALL_PHONE" />

数据 URI :tel:<phone-number>;voicemail:<phone-number>

10.打开设置界面:

打开WIFI设置界面示例:

public void openWifiSettings() {    Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS);    if (intent.resolveActivity(getPackageManager()) != null) {        startActivity(intent);    }}


Action:

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

有关其他可用的设置屏幕,请参见 Settings 文档。

11.发送短信:

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_SEND 或
ACTION_SEND_MULTIPLE
数据 URI :
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>
以上每一个架构的处理方式都相同。
MIME 类型:
"text/plain"
"image/*"
"video/*"

Extra:

"subject":表示消息主题的字符串(通常只适用于彩信)

"sms_body":表示消息正文的字符串。
EXTRA_STREAM:指向要附加的图像或视频的 Uri。 如果使用的是 ACTION_SEND_MULTIPLE 操作,此 extra 应为指向要附加的图像/视频的 Uri ArrayList。

如果想确保 Intent 只由短信应用(而非电子邮件或社交应用)处理,则使用 ACTION_SENDTO 操作并加入 "smsto:" 数据架构。

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);    }}


12.加载网页:

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);    }}
数据 URI :
http:<URL>
https:<URL>

MIME 类型:

"text/plain"

"text/html"

"application/xhtml+xml"

"application/vnd.wap.xhtml+xml"











0 0
原创粉丝点击