Android官方文档—APP组件(Intents and Intent Filters)(常用Intent)

常用Intent

通过在Intent对象中描述要执行的简单操作(例如“查看地图”或“拍照”),intent能够让您在另一个应用程序中启动activity。此类意图称为隐式意图,因为它未指定要启动的应用程序组件,而是指定操作并提供用于执行操作的一些数据。

当您调用startActivity()或startActivityForResult()并给其传递隐式intent时,系统会将意图解析为可以处理intent并启动其相应Activity的app。如果有多个应用程序可以处理意图,系统会向用户显示一个对话框,以选择要使用的应用程序。

此页面描述了可用于执行常见操作的几个隐式意图,这些操作由接收意图的应用程序维护。每个部分还展示了如何创建一个intent过滤器来告知您自己的app达到相同效果的能力。

警告:用户可能没有安装可以处理您发送到startActivity()的隐式意图的应用程序。如果发生这种情况,调用将失败,您的应用将崩溃。要验证是否有activity接收intent,请在Intent对象上调用resolveActivity()。如果结果为非null,则至少有一个应用程序可以处理意图,并且可以安全地调用startActivity()。如果结果为null,则不应使用此intent,如果可能,应禁用发出此intent的功能。

如果您不熟悉如何创建意图或意图过滤器,则应首先阅读Intents and Intent Filters

要了解如何从开发主机触发此页面上列出的意图,请参阅使用Android Debug Bridge验证意图。

Google语音操作会触发此页面上列出的一些意图,以响应语音命令。有关更多信息,请参阅Google语音操作触发的意图。

Alarm Clock


创建一个警报

要创建新警报,请使用ACTION_SET_ALARM action并使用下面定义的附加项指定警报详细信息,例如时间和消息。

注意:Android 2.3(API级别9)及更高版本中仅提供小时,分钟和消息附加功能。其他附加功能在平台的更高版本中添加。

Action

ACTION_SET_ALARM

扫描二维码关注公众号,回复: 3513525 查看本文章

Data URI

None

MIME Type

None

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,则应用程序应绕过任何确认UI并简单地设置指定的警报。

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_ALARM意图,您的应用必须具有SET_ALARM权限:

<uses-permission android: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>

创建一个计时器

要创建倒数计时器,请使用ACTION_SET_TIMER操作并使用下面定义的附加项指定计时器详细信息,例如持续时间。

注意:此意图已在Android 4.4(API级别19)中添加。

Action

ACTION_SET_TIMER

Data URI

None

MIME Type

None

Extras

EXTRA_LENGTH

计时器的长度,以秒为单位。

EXTRA_MESSAGE

计时器的自定义消息。

EXTRA_SKIP_UI

一个布尔值,指定响应应用程序在设置计时器时是否应跳过其UI。如果为true,则应用程序应绕过任何确认UI并简单地启动指定的计时器。

意图示例:

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

显示所有警报

要显示警报列表,请使用ACTION_SHOW_ALARMS操作。

虽然没有多少应用程序会调用此意图(它主要由系统应用程序使用),但任何充当闹钟的应用程序都应实现此意图过滤器并通过显示当前警报列表进行响应。

注意:此意图已在Android 4.4(API级别19)中添加。

Action

ACTION_SHOW_ALARMS

Data URI

None

MIME Type

None

意图过滤器示例:

<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

Data URI

Events.CONTENT_URI

MIME Type

"vnd.android.cursor.dir/event"

Extras

EXTRA_EVENT_ALL_DAY

一个布尔值,指定这是否是全天事件。

EXTRA_EVENT_BEGIN_TIME

事件的开始时间(自纪元以来的毫秒数)。

EXTRA_EVENT_END_TIME

事件的结束时间(自纪元以来的毫秒数)。

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

意图过滤器示例:

<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


要打开相机应用并接收生成的照片或视频,请使用ACTION_IMAGE_CAPTURE或ACTION_VIDEO_CAPTURE操作。同时在EXTRA_OUTPUT extra中指定您希望相机保存照片或视频的URI位置。

Action

ACTION_IMAGE_CAPTURE
ACTION_VIDEO_CAPTURE

Data URI Scheme

None

MIME Type

None

Extras

EXTRA_OUTPUT

相机应用程序应保存照片或视频文件的URI位置(作为Uri对象)。

当相机应用程序成功将焦点返回到您的活动时(您的应用程序收到onActivityResult()回调),您可以使用EXTRA_OUTPUT值在您指定的URI处访问照片或视频。

注意:当您使用ACTION_IMAGE_CAPTURE捕获照片时,相机还可能会在结果Intent中返回照片的缩小副本(缩略图),并在名为“data”的额外字段中保存为位图。

意图示例:

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

有关如何使用此意图捕获照片的更多信息,包括如何为输出位置创建适当的Uri,请阅读Taking Photos Simply or 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,然后将捕获的图像或视频保存在该额外指定的位置,调用setResult()传入包含附件命名为“data”的压缩缩略图的Inten。

在静止图像模式下启动相机应用程序

要在静止图像模式下打开相机应用程序,请使用INTENT_ACTION_STILL_IMAGE_CAMERA操作。

Action

INTENT_ACTION_STILL_IMAGE_CAMERA

Data URI Scheme

None

MIME Type

None

Extras

None

意图示例:

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>

以视频模式启动相机应用

要在视频模式下打开相机应用,请使用INTENT_ACTION_VIDEO_CAMERA操作。

Action

INTENT_ACTION_VIDEO_CAMERA

Data URI Scheme

None

MIME Type

None

Extras

None

意图示例:

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


选取联系人

要让用户选择联系人并为您的应用提供对所有联系人信息的访问权限,请使用ACTION_PICK操作并将MIME类型指定为Contacts.CONTENT_TYPE。

传递给onActivityResult()回调的结果Intent包含指向所选联系人的内容:URI。即使您的应用不包含READ_CONTACTS权限,响应也会授予您的应用临时权限以使用Contacts Provider API读取该联系人。

提示:如果您只需要访问特定的联系信息,例如电话号码或电子邮件地址,请参阅下一节,了解如何选择特定的联系人数据。

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后检索联系人详细信息的信息,请阅读检索联系人的详细信息。请记住,当您使用上述意图检索联系URI时,您不需要READ_CONTACTS权限来读取该联系人的详细信息。

选取特定联系人数据

要让用户从联系人中选择特定信息,例如电话号码,电子邮件地址或其他数据类型,请使用ACTION_PICK操作并将MIME类型指定为下面列出的某种内容类型,例如CommonDataKinds。 Phone.CONTENT_TYPE获取联系人的电话号码。

如果您只需要从联系人中检索一种类型的数据,那么使用ContactsContract.CommonDataKinds类中的CONTENT_TYPE的这种技术比使用Contacts.CONTENT_TYPE(如上一节所示)更有效,因为结果可让您直接访问所需数据,无需您对Contacts Provider执行更复杂的查询。

传递给onActivityResult()回调的结果Intent包含指向所选联系人数据的内容:URI。即使您的应用不包含READ_CONTACTS权限,响应也会授予您的应用临时权限以读取该联系人数据。

Action

ACTION_PICK

Data URI Scheme

None

MIME Type

CommonDataKinds.Phone.CONTENT_TYPE

从带有电话号码的联系人中挑选。

CommonDataKinds.Email.CONTENT_TYPE

从带有电子邮件地址的联系人中挑选

CommonDataKinds.StructuredPostal.CONTENT_TYPE

从带有邮政地址的联系人中挑选。

或者ContactsContract下的许多其他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_VIEW操作并指定具有content:URI的联系人作为意图数据。

初始化检索联系人URI的方法主要有两种:

  • 使用ACTION_PICK返回的联系URI,如上一节所示(此方法不需要任何应用程序权限)
  • 直接访问所有联系人列表,如检索联系人列表(此方法需要READ_CONTACTS权限)中所述。

Action

ACTION_VIEW

Data URI Scheme

content:<URI>

MIME Type

没有。该类型是从联系URI推断出来的。

意图示例:

public void viewContact(Uri contactUri) {
    Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

编辑现有联系人

要编辑已知联系人,请使用ACTION_EDIT操作,指定与content:URI的联系人作为意图数据,并在ContactsContract.Intents.Insert中的常量指定的额外内容中包含任何已知的联系人信息。

初始化URI的方法主要有两种:

  • 使用ACTION_PICK返回的联系URI,如上一节所示(此方法不需要任何应用程序权限)。
  • 直接访问所有联系人列表,如检索联系人列表(此方法需要READ_CONTACTS权限)中所述。

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

有关如何编辑联系人的更多信息,请参阅Modifying Contacts Using Intents。

新增联系人

要插入新联系人,请使用ACTION_INSERT操作,将Contacts.CONTENT_TYPE指定为MIME类型,并在ContactsContract.Intents.Insert中的常量指定的附加项中包含任何已知的联系信息。

Action

ACTION_INSERT

Data URI Scheme

None

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

有关如何插入联系人的更多信息,请阅读Modifying Contacts Using Intents

电子邮件


撰写包含可选附件的电子邮件

要撰写电子邮件,请根据您是否包含附件使用以下操作之一,并使用下面列出的附加键包含电子邮件详细信息,如收件人和主题。

Action

ACTION_SENDTO (无附件) or
ACTION_SEND (一个附件) or
ACTION_SEND_MULTIPLE (多个附件)

Data URI Scheme

None

MIME Type

"text/plain"

"*/*"

Extras

Intent.EXTRA_EMAIL

所有“收件人”收件人电子邮件地址的字符串数组。

Intent.EXTRA_CC

所有“CC”收件人电子邮件地址的字符串数组。

Intent.EXTRA_BCC

所有“BCC”收件人电子邮件地址的字符串数组。

Intent.EXTRA_SUBJECT

带有电子邮件主题的字符串。

Intent.EXTRA_TEXT

带有电子邮件正文的字符串。

Intent.EXTRA_STREAM

Uri指向附件。如果使用ACTION_SEND_MULTIPLE操作,则应该是包含多个Uri对象的ArrayList。

意图示例:

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

如果您想确保您的意图仅由电子邮件应用程序处理(而不是其他文本消息或社交应用程序),请使用ACTION_SENDTO操作并包含“mailto:”数据方案。例如:

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

意图过滤器示例:

<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操作并指定所需的MIME类型。返回到您应用的文件引用对您的活动的当前生命周期是暂时的,因此如果您想稍后访问它,则必须导入稍后可以阅读的副本。此意图还允许用户在该过程中创建新文件(例如,用户可以使用相机捕获新照片而不是选择现有照片)。

传递给onActivityResult()方法的结果意图包括带有指向文件的URI的数据。 URI可以是任何内容,例如http:URI,file:URI或content:URI。但是,如果您希望将可选文件限制为仅可从内容提供程序访问的文件(内容:URI)并且可以作为具有openFileDescriptor()的文件流使用,则应将CATEGORY_OPENABLE类别添加到您的意图中。

在Android 4.3(API级别18)及更高版本上,您还可以允许用户通过向intent添加EXTRA_ALLOW_MULTIPLE来选择多个文件,设置为true。然后,您可以访问getClipData()返回的ClipData对象中的每个选定文件。

Action

ACTION_GET_CONTENT

Data URI Scheme

None

MIME Type

与用户应选择的文件类型对应的MIME类型。

Extras

EXTRA_ALLOW_MULTIPLE

一个布尔值,声明用户是否可以一次选择多个文件。

EXTRA_LOCAL_ONLY

一个布尔值,声明返回的文件是否必须直接从设备可用,而不是要求从远程服务下载。

Category (可选)

CATEGORY_OPENABLE

仅返回可用openFileDescriptor()表示为文件流的“可打开”文件。

获取图片意图示例:

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>
        <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 accessible
             from a content provider that supports OpenableColumns
             and ContentResolver.openFileDescriptor() -->
        <category android:name="android.intent.category.OPENABLE" />
    </intent-filter>
</activity>

打开特定类型的文件

在Android 4.4或更高版本上运行时,您可以改为指定MIME类型,使用ACTION_OPEN_DOCUMENT操作请求打开由其他应用管理的文件,而不是必须把文件(通过使用ACTION_GET_CONTENT操作)复制到您的应用。For example, instead of selecting from existing PDF documents, the ACTION_CREATE_DOCUMENT intent allows users to select where they'd like to create a new document (within another app that manages the document's storage)—your app then receives the URI location of where it can write the new document.

虽然从ACTION_GET_CONTENT操作传递给onActivityResult()方法的意图可能返回任何类型的URI,但ACTION_OPEN_DOCUMENT和ACTION_CREATE_DOCUMENT的结果意图始终将所选文件指定为content:URI受DocumentsProvider支持的。您可以使用openFileDescriptor()打开该文件,并使用DocumentsContract.Document中的的字段查询其详细信息

返回的URI授予您的应用程序对文件的长期读取访问权限(也可能具有写访问权限)。因此,当您想要在不复制应用程序的情况下读取现有文件,或者想要打开和编辑文件时,ACTION_OPEN_DOCUMENT操作特别有用(而不是使用ACTION_GET_CONTENT)。

您还可以允许用户通过向intent添加EXTRA_ALLOW_MULTIPLE来选择多个文件,设置为true。如果用户只选择一个项目,则可以从getData()中检索项目。如果用户选择多个项,则getData()返回null,您必须从getClipData()返回的ClipData对象中检索每个项。

注意:我们的意图必须指定MIME类型,并且必须声明CATEGORY_OPENABLE类别。如果适用,您可以通过添加EXTRA_MIME_TYPES额外的MIME类型数组来指定多个MIME类型 - 如果这样做,则必须将setType()中的主MIME类型设置为“* / *”。

Action

ACTION_OPEN_DOCUMENT or
ACTION_CREATE_DOCUMENT

Data URI Scheme

None

MIME Type

与用户应选择的文件类型对应的MIME类型。

Extras

EXTRA_MIME_TYPES

与您的应用请求的文件类型相对应的MIME类型数组。使用此额外功能时,必须将setType()中的主MIME类型设置为“* / *”。

EXTRA_ALLOW_MULTIPLE

一个布尔值,声明用户是否可以一次选择多个文件。

EXTRA_TITLE

与ACTION_CREATE_DOCUMENT一起使用以指定初始文件名

EXTRA_LOCAL_ONLY

一个布尔值,声明返回的文件是否必须直接从设备可用,而不是要求从远程服务下载。

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

第三方应用实际上无法使用ACTION_OPEN_DOCUMENT操作响应意图。但是,系统接收此意图并在统一用户界面中显示各种应用程序可用的所有文件。

要在此UI中提供应用程序的文件并允许其他应用程序打开它们,您必须实现DocumentsProvider并包含PROVIDER_INTERFACE的意图过滤器(“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指南。

定位操作


打车

要呼叫出租车,请使用ACTION_RESERVE_TAXI_RESERVATION操作。

注意:在完成操作之前,应用必须要求用户确认。

Action

ACTION_RESERVE_TAXI_RESERVATION

Data URI

None

MIME Type

None

Extras

None

意图示例:

public void callCar() {
    Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(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>

地图


在地图上显示位置

要打开地图,请使用ACTION_VIEW操作,并使用下面定义的方案之一在意图数据中指定位置信息。

Action

ACTION_VIEW

Data URI Scheme

geo:latitude,longitude

以给定的经度和纬度显示地图。

Example: "geo:47.6,-122.3"

geo:latitude,longitude?z=zoom

以给定的经度和纬度在特定缩放级别显示地图。缩放级别1显示整个地球,以给定的纬度为中心。最高(最近)缩放级别为23。

Example: "geo:47.6,-122.3?z=11"

geo:0,0?q=lat,lng(label)

使用字符串标签以给定的经度和纬度显示地图。

Example: "geo:0,0?q=34.99,-106.61(Treasure)"

geo:0,0?q=my+street+address

显示“我的街道地址”的位置(可能是特定的地址或位置查询)。

Example: "geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"

注意:必须对地理URI中传递的所有字符串进行编码。例如,字符串1st&amp;派克,西雅图应该成为1%20%26%20Pike%2C%20Seattle。字符串中的空格可以用%20编码或用加号(+)替换。

MIME Type

None

意图示例:

public void showMap(Uri geoLocation) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(geoLocation);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(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>

音乐或视频


播放媒体文件

要播放音乐文件,请使用ACTION_VIEW操作并在意图数据中指定文件的URI位置。

Action

ACTION_VIEW

Data URI Scheme

file:<URI>

content:<URI>

http:<URL>

MIME Type

"audio/*"

"application/ogg"

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

意图过滤器示例:

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

根据搜索查询播放音乐

要根据搜索查询播放音乐,请使用INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH意图。应用程序可以响应用户的语音命令来启动此意图以播放音乐。此意图的接收应用程序在其库存中执行搜索,以将现有内容与给定查询匹配,并开始播放该内容。

此意图应包括EXTRA MEDIA FOCUS字符串extra,它指定了预期的搜索模式。例如,搜索模式可以指定搜索是针对艺术家姓名还是歌曲名称。

Action

INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH

Data URI Scheme

None

MIME Type

None

Extras

MediaStore.EXTRA_MEDIA_FOCUS (必须)

表示搜索模式(用户是否正在查找特定的艺术家,专辑,歌曲或播放列表)。大多数搜索模式需要附加extras例如,如果用户有兴趣收听特定歌曲,则意图可能还有三个附加内容:歌曲标题,艺术家和专辑。此意图支持EXTRA_MEDIA_FOCUS的每个值的以下搜索模式:

Any - "vnd.android.cursor.item/*"

播放任何音乐。接收应用程序应根据智能选择播放一些音乐,例如用户收听的最后一个播放列表。

附加extras:

  • QUERY (必须) - 一个空字符串。此额外内容始终是为了向后兼容而提供的:不了解搜索模式的现有应用程序可以将此意图作为非结构化搜索进行处理。

Unstructured - "vnd.android.cursor.item/*"

从非结构化搜索查询中播放特定歌曲,专辑或流派。当用户无法识别用户想要收听的内容类型时,应用可能会使用此搜索模式生成意图。应用程序应尽可能使用更具体的搜索模式。

附加extras:

  • QUERY (必须) -包含以下任意组合的字符串:艺术家,专辑,歌曲名称或流派。

Genre - Audio.Genres.ENTRY_CONTENT_TYPE

播放特定流派的音乐。

附加extras:

  • "android.intent.extra.genre" (必须) - 流派
  • QUERY (必须) -流派。此额外内容始终是为了向后兼容而提供的:不了解搜索模式的现有应用程序可以将此意图作为非结构化搜索进行处理。

Artist - Audio.Artists.ENTRY_CONTENT_TYPE

播放特定艺术家的音乐。

附加extras:

  • EXTRA_MEDIA_ARTIST (必须) - 艺术家
  • "android.intent.extra.genre" - 流派
  • QUERY (必须) - 包含艺术家或流派的任意组合的字符串。此额外内容始终是为了向后兼容而提供的:不了解搜索模式的现有应用程序可以将此意图作为非结构化搜索进行处理。

Album - Audio.Albums.ENTRY_CONTENT_TYPE

播放特定专辑中的音乐。

附加extras:

  • EXTRA_MEDIA_ALBUM (必须) - 专辑
  • EXTRA_MEDIA_ARTIST - 艺术家
  • "android.intent.extra.genre" - 流派
  • QUERY (必须) - 包含专辑或艺术家的任意组合的字符串。此额外内容始终是为了向后兼容而提供的:不了解搜索模式的现有应用程序可以将此意图作为非结构化搜索进行处理。

Song - "vnd.android.cursor.item/audio"

播放一首特定的歌曲。

附加extras:

  • EXTRA_MEDIA_ALBUM - 专辑.
  • EXTRA_MEDIA_ARTIST -艺术家
  • "android.intent.extra.genre" - 流派
  • EXTRA_MEDIA_TITLE (必须) - 歌曲名称
  • QUERY (必须) - 包含以下任意组合的字符串:专辑,艺术家,流派或标题。此额外内容始终是为了向后兼容而提供的:不了解搜索模式的现有应用程序可以将此意图作为非结构化搜索进行处理。

Playlist - Audio.Playlists.ENTRY_CONTENT_TYPE

播放符合其他附加内容指定的某些条件的特定播放列表或播放列表。

附加extras:

  • EXTRA_MEDIA_ALBUM - 专辑
  • EXTRA_MEDIA_ARTIST - 艺术家
  • "android.intent.extra.genre" - 流派
  • "android.intent.extra.playlist" - 播放列表
  • EXTRA_MEDIA_TITLE - 播放列表下的歌曲名称
  • QUERY (必须) - 包含以下任意组合的字符串:专辑,艺术家,流派,播放列表或标题。此额外内容始终是为了向后兼容而提供的:不了解搜索模式的现有应用程序可以将此意图作为非结构化搜索进行处理。

意图示例:

如果用户想要收听来自特定艺术家的音乐,则搜索应用可能会产生以下意图:

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

意图过滤器示例:

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

处理此意图时,您的活动应检查传入的Intent中EXTRA_MEDIA_FOCUS extra的值,以确定搜索模式。一旦您的活动确定了搜索模式,它就应该读取该特定搜索模式的附加extras。有了这些信息,您的应用程序就可以在其库存中执行搜索,以播放与搜索查询匹配的内容。例如:

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

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

        } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) {
            if (query.isEmpty()) {
                // 'Any' search mode
                playResumeLastPlaylist();
            } else {
                // 'Unstructured' search mode
                playUnstructuredSearch(query);
            }

        } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) {
            // 'Genre' search mode
            playGenre(genre);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) {
            // 'Artist' search mode
            playArtist(artist, genre);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) {
            // 'Album' search mode
            playAlbum(album, artist);

        } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) {
            // 'Song' search mode
            playSong(album, artist, genre, title);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) {
            // 'Playlist' search mode
            playPlaylist(album, artist, genre, playlist, title);
        }
    }
}

新笔记


创建一个笔记

要创建新笔记,请使用ACTION_CREATE_NOTE操作,并使用下面定义的附加项指定注释详细信息,例如主题和文本。

注意:在完成操作之前,应用必须要求用户确认。

Action

ACTION_CREATE_NOTE

Data URI Scheme

None

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

意图过滤器示例:

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

电话


呼叫电话

要打开电话应用程序并拨打电话号码,请使用ACTION_DIAL操作并使用下面定义的URI方案指定电话号码。当手机应用程序打开时,它会显示电话号码,但用户必须按“呼叫”按钮才能开始通话。

要直接拨打电话,请使用ACTION_CALL操作并使用下面定义的URI方案指定电话号码。当手机应用程序打开时,它会开始通话;用户无需按“呼叫”按钮。

ACTION_CALL操作要求您向清单文件添加CALL_PHONE权限:

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

Action

  • ACTION_DIAL - Opens the dialer or phone app.
  • ACTION_CALL - Places a phone call (requires the CALL_PHONE permission)

Data URI Scheme

  • tel:<phone-number>
  • voicemail:<phone-number>

MIME Type

None

有效的电话号码是IETF RFC 3966中定义的电话号码。有效示例包括以下内容:

  • tel:2125551212
  • tel:(212) 555 1212

电话的拨号器可以规范化方案,例如电话号码。因此,在Uri.parse()方法中所描述的方案并不严谨。但是,如果您尚未尝试过方案或不确定是否可以处理,请改用Uri.fromParts()方法。

意图示例:

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_ACTION操作声明一个intent过滤器,如下面的示例intent过滤器所示。

Action

"com.google.android.gms.actions.SEARCH_ACTION"

支持Google语音操作的搜索查询。

Extras

QUERY

包含搜索查询的字符串。

意图过滤器示例:

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

执行网络搜索

要启动Web搜索,请使用ACTION_WEB_SEARCH操作并在SearchManager.QUERY extra中指定搜索字符串。

Action

ACTION_WEB_SEARCH

Data URI Scheme

None

MIME Type

None

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

设置


打开“设置”的特定部分

要在应用程序要求用户更改某些内容时在系统设置中打开屏幕,请使用以下其中一个意图操作打开与操作名称相对应的设置屏幕。

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

None

MIME Type

None

意图示例:

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

短信


撰写带附件的SMS / MMS消息

要启动SMS或MMS文本消息,请使用下面的其中一个intent操作,并使用下面列出的额外键指定消息详细信息,如电话号码,主题和消息正文。

Action

ACTION_SENDTO or
ACTION_SEND or
ACTION_SEND_MULTIPLE

Data URI Scheme

sms:<phone_number>

smsto:<phone_number>

mms:<phone_number>

mmsto:<phone_number>

这些schemes作用相同。

MIME Type

"text/plain"

"image/*"

"video/*"

Extras

"subject"

邮件主题的字符串(通常仅用于MMS)。

"sms_body"

文本消息的字符串。

EXTRA_STREAM

Uri指向要附加的图像或视频。如果使用ACTION_SEND_MULTIPLE操作,则此额外应该是指向要附加的图像/视频的Uris的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);
    }
}

如果您想确保仅通过短信应用程序(而非其他电子邮件或社交应用程序)处理您的意图,请使用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);
    }
}

意图过滤器示例:

<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应用程序提供。有关更多信息,请参阅Telephony上的文档。

网页浏览器


加载Web URL

要打开网页,请使用ACTION_VIEW操作并在意图数据中指定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);
    }
}

意图过滤器示例:

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

提示:If your Android app provides functionality similar to your web site, include an intent filter for URLs that point to your web site. Then, if users have your app installed, links from emails or other web pages pointing to your web site open your Android app instead of your web page.

使用Android Debug Bridge验证Intent


要验证您的应用是否响应了您要支持的意图,您可以使用adb工具触发特定意图:

  1. 设置Android设备以进行开发,或使用虚拟设备。
  2. 安装应用程序的一个版本,以处理您要支持的意图。
  3. 使用adb触发意图:
adb shell 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

如果您定义了所需的意图过滤器,则您的应用应该处理意图。

有关更多信息,请参阅ADB Shell命令。

猜你喜欢

转载自blog.csdn.net/weixin_42703445/article/details/82893498