Intent的真正强大之处在于它的隐式Intent,隐式Intent需要配合Intent-filters使用,有关这方面的概念和知识,您可以参考我翻译的官方文档:《Android官方文档之App Components(Intents and Intent Filters)》。


隐式Intent足够强大,以至于系统提供了大量的Intent方便开发者启动系统应用程序,本文将介绍一些常用的隐式Intent、以及如何自定义intent-filters以匹配隐式intent。


如需阅读官方原文,您可以点击这个链接:《Common Intents》


常用的Intent(Common Intents)

下面将按照启动的目标组件类别介绍隐式Intent:


闹钟类别(Alarm Clock)


启动闹钟(Create an alarm)

要启动闹钟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如下:

<activity ...><intent-filter><action android:name="android.intent.action.SET_ALARM" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

启动计时器(Create a timer)

!请注意:该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如下:

<activity ...><intent-filter><action android:name="android.intent.action.SET_TIMER" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

显示设置的所有闹钟(Show all alarms)

!请注意:该Intent只兼容 Android 4.4 (API level 19) 及以上版本的设备。


  • Action:ACTION_SHOW_ALARMS

  • Data URI:空

  • MIME Type:空


示例:

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

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

<activity ...><intent-filter><action android:name="android.media.action.IMAGE_CAPTURE" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

启动相机应用的照相模式(Start a camera app in still image mode)


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

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


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

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


在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


获得具体联系人信息(Select specific contact data)


  • Action:ACTION_PICK

  • Data URI Scheme:空

  • MIME Type:

    • CommonDataKinds.Phone.CONTENT_TYPE,表示获取联系人号码

    • CommonDataKinds.Email.CONTENT_TYPE,表示获取联系人Email

    • CommonDataKinds.StructuredPostal.CONTENT_TYPE,表示获取联系人的邮寄地址

    • 通过ContactsContract.CommonDataKinds中的其他字段,还可以获取更多联系人信息。

示例:

static final int REQUEST_SELECT_PHONE_NUMBER = 1;public void selectContact() {// Start an activity for the user to pick a phone number from contactsIntent 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 numberUri 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 numberif (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:ACTION_VIEW

  • Data URI Scheme:content:<URI>,该Uri指向了查看的联系人地址,有两种方法可获得该Uri:

  • 通过上一小节的ACTION_PICK,获得返回的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);}
}

编辑联系人信息(Edit an existing contact)


  • Action:ACTION_EDIT

  • Data URI Scheme:content:<URI>,获取该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。


新增联系人(Insert a contact)


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

Email类别(Email)

发送邮件并可选携带附件(Compose an email with optional attachments)

  • 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 thisintent.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(),可以获得回传的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:

    • EXTRA_ALLOW_MULTIPLE。该键对应的值为boolean类型,设置用户是否可一次性选择多个文件。
    • EXTRA_LOCAL_ONLY:该键对应的值为boolean类型,表示所选文件是否为本地文件(即是否可以在用户选择文件后立刻返回并获得该文件,而不是还需要去开启一个服务下载)。

  • Category (可选):CATEGORY_OPENABLE,选择的文件是“可打开”的文件(”openable” files),并可通过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...}
}

匹配的Intent-filter:

<activity ...><intent-filter><action android:name="android.intent.action.GET_CONTENT" /><data android:type="image/*" /><category android:name="android.intent.category.DEFAULT" /><!-- The OPENABLE category declares that the returned file is accessiblefrom a content provider that supports OpenableColumnsand ContentResolver.openFileDescriptor() --><category android:name="android.intent.category.OPENABLE" /></intent-filter>
</activity>

打开一个特定类型的文件(Open a specific type of file)


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

    • EXTRA_MIME_TYPES,对应值是一个请求文件类型的MIME类型数组,必须最少指定类型为"*/*"
    • EXTRA_ALLOW_MULTIPLE,对应值是一个boolean类型,用户设置用户是否每次可同时选择多个文件。
    • EXTRA_TITLE,对应着ACTION_CREATE_DOCUMENT这个action,为新建的文件起一个标题。
    • EXTRA_LOCAL_ONLY,对应值为boolean类型,用于设定选择的文件是否来自本地(即选择文件后是否可立即返回)。

  • Category:CATEGORY_OPENABLE。返回可打开的文件并可通过openFileDescriptor()方法表示成文件流形式。

示例:

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:

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

地图类别(Maps)


在地图上定位(Show a location on a map)


  • 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或者加号( + )


  • MIME Type:空

示例:

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

匹配的intent-filter:

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

  • Data URI Scheme:

    • file:<URI>

    • content:<URI>

    • http:<URL>

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

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

备忘录类别(New Note)


创建一个备忘录(Create a note)


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

<activity ...><intent-filter><action android:name="com.google.android.gms.actions.CREATE_NOTE" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType=”*/*”></intent-filter>
</activity>

电话类别(Phone)


初始化电话拨号(Initiate a phone call)


您可以通过 ACTION_DIAL这个action打开电话应用程序的拨号界面,并把电话号码作为参数到拨号框中,用户点击“拨打”按钮开始拨号。这无需任何权限。

您也可以通过ACTION_CALL这个action直接拨打电话,而无需点击“拨打”按钮。这需要添加如下权限:

<uses-permission android:name="android.permission.CALL_PHONE" />

Intent的具体设置方式如下:


  • Action:

    • ACTION_DIAL,打开拨号界面。

    • ACTION_CALL,直接拨打电话。

  • Data URI Scheme:

    • tel:<phone-number>

    • voicemail:<phone-number>

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

搜索类别(Search)


搜索特定的app(Search using a specific app)


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

执行网页搜索(Perform a web search)


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

设置类别(Settings)


打开某个设置选项(Open a specific section of Settings)


您可能需要在使用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);}
}

短消息类别(Text Messaging)


创建短信/彩信 并携带附件(Compose an SMS/MMS message with attachment)


  • Action:

    • ACTION_SENDTO

    • ACTION_SEND

    • ACTION_SEND_MULTIPLE


  • Data URI Scheme:

    • sms:<phone_number>

    • smsto:<phone_number>

    • mms:<phone_number>

    • mmsto:<phone_number>

    以上四种方式效果相同


  • MIME Type:

    • "text/plain"

    • "image/*"

    • "video/*"


  • Extras:

    • "subject",该键对应值是一个字符串,表示发送短信的标题(通常只适用于发短信)。

    • "sms_body",该键对应值是一个字符串,表示消息内容。

    • EXTRA_STREAM,该键对应的值是一个Uri地址,它指向了附加文件,若action为ACTION_SEND_MULTIPLE,则这个值应该是一个ArrayList<Uri>对象。


示例:

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 respondintent.putExtra("sms_body", message);intent.putExtra(Intent.EXTRA_STREAM, attachment);if (intent.resolveActivity(getPackageManager()) != null) {startActivity(intent);}
}

与之匹配的intent-filter配置如下:

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

网页浏览器类别(Web Browser)


加载网页URL(Load a web URL)


  • Action:ACTION_VIEW

  • Data URI Scheme:

    • http:<URL>

    • https:<URL>

  • 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" /><!-- Include the host attribute if you want your app to respondonly 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官方文档之App Components(Common Intents)相关推荐

  1. Android官方文档之App Components(Common Intents)(转载)

    原文地址:http://blog.csdn.net/vanpersie_9987/article/details/51244558#rd Intent的真正强大之处在于它的隐式Intent,隐式Int ...

  2. Android官方文档之App Components(Activities)

    Activity是Android四大组件之首,本文将介绍Activity的含义.创建.启动.销毁.生命周期 等. 如需访问官方原文,您可以点击这个链接:<Activities> Activ ...

  3. Android官方文档training中英文翻译目录大全:29篇已翻译,45篇未翻译

    Android官方文档training中英文翻译目录大全:29篇已翻译,45篇未翻译 1. Getting Started Building Your First App: 原文: https://d ...

  4. Android官方文档系列(翻译)

    下面一些内容是我翻译Android官方文档相关文章,以及整理的其它内容. 菜鸟上路,一边学习一边整理,若您发现有错误的地方还请不吝赐教. Activity 解读Android之Activity基础知识 ...

  5. 通过gae访问android官方文档

    不知何时,连www.android.com都不能访问了.看最新的android文档和下载最新的android sdk,可以通过appspot代理访问android网站. android官方文档和sdk ...

  6. 转】Fragments (Android官方文档中文版)

    Fragments (Android官方文档中文版) 传送门:http://www.eoeandroid.com/thread-71642-1-1.html

  7. android官方文档中文版_Now in Android:01 - 如何掌握最新的 Android 技术?

    每隔几天我都会通过 Android Developers 的油管官方频道,来了解一下最近 Android 发布了哪些有趣的新技术,最近发现官方推出了一个新的系列视频叫做:Now in Android, ...

  8. Android官方文档—APP清单(uses-feature)

    <uses-feature> 语法: <uses-featureandroid:name="string"android:required=["true ...

  9. Android官方文档—APP组件(Services)(Bound Services)

    绑定服务 绑定服务是客户端 - 服务器接口中的服务器.绑定服务允许组件(例如Activity)绑定到服务,发送请求,接收响应,甚至执行进程间通信(IPC).绑定服务通常仅在其服务于另一个应用程序组件时 ...

最新文章

  1. 为什么php动态语言,动态语言静态化
  2. 功能规格说明书Version2
  3. Windows Server 2008 R2
  4. 把LabelImg标注的YOLO格式标签转化为VOC格式标签 和 把VOC格式标签转化为YOLO格式标签
  5. 常用binlog日志操作命令
  6. WebBenchmark动态测试Webapi
  7. 【Java】蒙提霍尔问题的概率原理及随机化模拟
  8. 记,NSProxy需要实现哪些方法?
  9. [SAP ABAP开发技术总结]ABAP调优——Open SQL优化
  10. 线程 -- ThreadLocal
  11. 社交网络与社会计算课程内容梳理总结
  12. 绝对估值法和相对估值法
  13. 一种控制方法并发的注解方法,@Ylock
  14. Matlab使用符号对象求二元函数积分并做图
  15. 专题丨数字孪生城市框架与发展建议
  16. Metro界面体验——打造属于自己的Metro界面
  17. $(window).load、$()与window.onload
  18. 我想成为一个真的程序员
  19. Python 使用Tkinter制作签名(附完整代码)
  20. 一款好的固定资产管理系统能给IT和行政人员带来什么?

热门文章

  1. 在VMware上搭建web服务器
  2. npm install报错的解决方案
  3. 怎么把jpg格式转换成pdf
  4. centos7 查看进程消耗的内存
  5. 几种混合模式移动应用开发框架的对比
  6. 分享10种找客户的方法
  7. mysql-5.5.15-win32安装图解安装包安装图解
  8. 下拉框丿html宙斯,无限级别js联动下拉框类
  9. 解决【ifcfg-ens33】网卡一直无法启动问题
  10. 13G编程电子书开始提供BT下载,下载说明及BT种子下载网址