Ý định phổ biến

Ý định cho phép bạn bắt đầu hoạt động trong một ứng dụng khác bằng cách mô tả một hành động bạn muốn thực hiện, chẳng hạn như "xem bản đồ" hoặc "chụp ảnh" trong đối tượng Intent. Loại ý định này được gọi là ý định ngầm ẩn vì ý định này không chỉ định thành phần ứng dụng để bắt đầu mà chỉ định một thao tác và cung cấp một số dữ liệu để thực hiện thao tác.

Khi bạn gọi startActivity() hoặc startActivityForResult() và truyền ý định đó một ý định ngầm ẩn, hệ thống sẽ phân giải ý định này thành một ứng dụng có thể xử lý ý định và bắt đầu Activity tương ứng. Nếu có nhiều ứng dụng có thể xử lý ý định, hệ thống sẽ hiển thị cho người dùng một hộp thoại để chọn ứng dụng sẽ dùng.

Trang này mô tả một số ý định ngầm ẩn mà bạn có thể dùng để thực hiện các thao tác phổ biến, được sắp xếp theo loại ứng dụng xử lý ý định đó. Mỗi phần cũng cho biết cách tạo bộ lọc ý định để cho biết khả năng thực hiện hành động của ứng dụng.

Thận trọng: Nếu không có ứng dụng nào trên thiết bị có thể nhận ý định ngầm ẩn, thì ứng dụng sẽ gặp sự cố khi gọi startActivity(). Trước tiên, để xác minh rằng có một ứng dụng nhận được ý định, hãy gọi resolveActivity() trên đối tượng Intent. Nếu kết quả không rỗng, thì có ít nhất một ứng dụng có thể xử lý ý định này và có thể gọi startActivity(). Nếu kết quả là giá trị rỗng, đừng sử dụng ý định và nếu có thể, hãy tắt tính năng gọi ý định đó.

Nếu bạn chưa hiểu rõ cách tạo ý định hoặc bộ lọc ý định, trước tiên, hãy đọc bài viết Ý định và bộ lọc ý định.

Để tìm hiểu cách kích hoạt các ý định liệt kê trên trang này từ máy chủ phát triển, hãy xem phần Xác minh ý định bằng Cầu gỡ lỗi Android.

Tác vụ thoại của Google

Thao tác bằng giọng nói của Google sẽ kích hoạt một số ý định liệt kê trên trang này để phản hồi lệnh thoại. Để biết thêm thông tin, hãy xem phần Bắt đầu sử dụng Thao tác bằng giọng nói của hệ thống.

Đồng hồ báo thức

Sau đây là những thao tác phổ biến dành cho ứng dụng đồng hồ báo thức, bao gồm cả thông tin bạn cần để tạo bộ lọc ý định nhằm quảng cáo khả năng thực hiện từng thao tác của ứng dụng.

Tạo chuông báo

Tác vụ thoại của Google

  • "đặt báo thức 7 giờ sáng"

Để tạo chuông báo mới, hãy sử dụng thao tác ACTION_SET_ALARM và chỉ định thông tin chi tiết về chuông báo, chẳng hạn như thời gian và tin nhắn bằng các thông tin bổ sung sau.

Lưu ý: Chỉ có giờ, phút và dữ liệu tin nhắn bổ sung có trong Android 2.3 (API cấp 9) trở xuống. Các tính năng bổ sung khác có trong các phiên bản cao hơn của nền tảng.

Hành động
ACTION_SET_ALARM
URI dữ liệu
Không có
Loại MIME
Không có
Thông tin khác
EXTRA_HOUR
Giờ của chuông báo.
EXTRA_MINUTES
Số phút của chuông báo.
EXTRA_MESSAGE
Một thông báo tuỳ chỉnh giúp xác định chuông báo.
EXTRA_DAYS
ArrayList bao gồm cả ngày trong tuần mà chuông báo này lặp lại. Bạn phải khai báo mỗi ngày bằng một số nguyên từ lớp Calendar, chẳng hạn như MONDAY.

Đối với báo thức một lần, không chỉ định dữ liệu bổ sung này.

EXTRA_RINGTONE
Một URI content: chỉ định nhạc chuông để sử dụng với chuông báo hoặc VALUE_RINGTONE_SILENT để không có nhạc chuông.

Để sử dụng nhạc chuông mặc định, không cần chỉ định thêm.

EXTRA_VIBRATE
Một giá trị boolean chỉ định xem có rung cho chuông báo này hay không.
EXTRA_SKIP_UI
Một giá trị boolean chỉ định việc ứng dụng phản hồi có phải bỏ qua giao diện người dùng khi đặt chuông báo hay không. Nếu đúng, ứng dụng phải bỏ qua mọi giao diện người dùng xác nhận và đặt chuông báo đã chỉ định.

Ý định mẫu:

Kotlin

fun createAlarm(message: String, hour: Int, minutes: Int) {
    val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_HOUR, hour)
        putExtra(AlarmClock.EXTRA_MINUTES, minutes)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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);
    }
}
Lưu ý:

Để gọi ý định ACTION_SET_ALARM, ứng dụng của bạn phải có quyền SET_ALARM:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

Ví dụ về bộ lọc ý định:

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

Tạo đồng hồ hẹn giờ

Tác vụ thoại của Google

  • "đặt hẹn giờ trong 5 phút"

Để tạo đồng hồ đếm ngược, hãy sử dụng thao tác ACTION_SET_TIMER và chỉ định thông tin chi tiết về bộ tính giờ, chẳng hạn như thời lượng bằng cách sử dụng các dữ liệu bổ sung sau.

Lưu ý: Ý định này có trong Android 4.4 (API cấp 19) trở lên.

Hành động
ACTION_SET_TIMER
URI dữ liệu
Không có
Loại MIME
Không có
Thông tin khác
EXTRA_LENGTH
Thời lượng của bộ tính giờ tính bằng giây.
EXTRA_MESSAGE
Một thông báo tuỳ chỉnh để xác định đồng hồ hẹn giờ.
EXTRA_SKIP_UI
Một giá trị boolean chỉ định việc ứng dụng phản hồi có phải bỏ qua giao diện người dùng khi đặt bộ tính giờ hay không. Nếu đúng, ứng dụng phải bỏ qua mọi giao diện người dùng xác nhận và bắt đầu bộ tính giờ đã chỉ định.

Ý định mẫu:

Kotlin

fun startTimer(message: String, seconds: Int) {
    val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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);
    }
}
Lưu ý:

Để gọi ý định ACTION_SET_TIMER, ứng dụng của bạn phải có quyền SET_ALARM:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

Ví dụ về bộ lọc ý định:

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

Hiển thị tất cả báo thức

Để hiện danh sách chuông báo, hãy sử dụng thao tác ACTION_SHOW_ALARMS.

Mặc dù không có nhiều ứng dụng gọi ý định này (vì ý định này chủ yếu được các ứng dụng hệ thống dùng), nhưng bất kỳ ứng dụng nào hoạt động như đồng hồ báo thức đều có thể triển khai bộ lọc ý định này và phản hồi bằng cách hiện danh sách các chuông báo hiện tại.

Lưu ý: Ý định này có trong Android 4.4 (API cấp 19) trở lên.

Hành động
ACTION_SHOW_ALARMS
URI dữ liệu
Không có
Loại MIME
Không có

Ví dụ về bộ lọc ý định:

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

Lịch

Thêm sự kiện là một thao tác phổ biến đối với ứng dụng lịch. Tạo bộ lọc ý định để quảng cáo khả năng của ứng dụng trong việc thực hiện hành động này bằng thông tin trong phần sau.

Thêm sự kiện lịch

Để thêm một sự kiện mới vào lịch của người dùng, hãy sử dụng thao tác ACTION_INSERT và chỉ định URI dữ liệu bằng Events.CONTENT_URI. Sau đó, bạn có thể chỉ định nhiều thông tin chi tiết về sự kiện bằng cách sử dụng các dữ liệu bổ sung sau.

Hành động
ACTION_INSERT
URI dữ liệu
Events.CONTENT_URI
Loại MIME
"vnd.android.cursor.dir/event"
Thông tin khác
EXTRA_EVENT_ALL_DAY
Một giá trị boolean xác định liệu đây có phải là một sự kiện kéo dài cả ngày hay không.
EXTRA_EVENT_BEGIN_TIME
Thời gian bắt đầu sự kiện (mili giây kể từ thời gian bắt đầu của hệ thống).
EXTRA_EVENT_END_TIME
Thời gian kết thúc của sự kiện (mili giây kể từ thời gian bắt đầu của hệ thống).
TITLE
Tên sự kiện.
DESCRIPTION
Nội dung mô tả sự kiện.
EVENT_LOCATION
Địa điểm diễn ra sự kiện.
EXTRA_EMAIL
Danh sách địa chỉ email được phân tách bằng dấu phẩy chỉ định khách mời.

Bạn có thể chỉ định nhiều thông tin chi tiết khác về sự kiện bằng cách sử dụng các hằng số đã xác định trong lớp CalendarContract.EventsColumns.

Ý định mẫu:

Kotlin

fun addEvent(title: String, location: String, begin: Long, end: Long) {
    val intent = Intent(Intent.ACTION_INSERT).apply {
        data = 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(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void addEvent(String title, String location, long begin, long 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);
    }
}

Ví dụ về bộ lọc ý định:

<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

Sau đây là những thao tác phổ biến đối với ứng dụng máy ảnh, bao gồm cả thông tin bạn cần để tạo bộ lọc ý định nhằm quảng cáo khả năng thực hiện từng thao tác của ứng dụng.

Chụp ảnh hoặc quay video và trả lại

Để mở một ứng dụng máy ảnh và nhận ảnh hoặc video thu được, hãy dùng thao tác ACTION_IMAGE_CAPTURE hoặc ACTION_VIDEO_CAPTURE. Ngoài ra, hãy chỉ định vị trí URI mà bạn muốn máy ảnh lưu ảnh hoặc video, trong phần bổ sung EXTRA_OUTPUT.

Hành động
ACTION_IMAGE_CAPTURE hoặc
ACTION_VIDEO_CAPTURE
Lược đồ URI dữ liệu
Không có
Loại MIME
Không có
Thông tin khác
EXTRA_OUTPUT
Vị trí URI nơi ứng dụng máy ảnh lưu tệp ảnh hoặc video (dưới dạng đối tượng Uri).

Khi ứng dụng máy ảnh trả về thành công tiêu điểm cho hoạt động của bạn, nói cách khác là ứng dụng nhận được lệnh gọi lại onActivityResult(), bạn có thể truy cập ảnh hoặc video tại URI mà bạn đã chỉ định với giá trị EXTRA_OUTPUT.

Lưu ý: Khi bạn dùng ACTION_IMAGE_CAPTURE để chụp ảnh, máy ảnh cũng có thể trả về một bản sao hoặc hình thu nhỏ của ảnh trong kết quả Intent, được lưu dưới dạng Bitmap trong một trường bổ sung có tên "data".

Ý định mẫu:

Kotlin

const val REQUEST_IMAGE_CAPTURE = 1
val locationForPhotos: Uri = ...

fun capturePhoto(targetFilename: String) {
    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply {
        putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename))
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        val thumbnail: Bitmap = data.getParcelableExtra("data")
        // Do other work with full size photo saved in locationForPhotos.
        ...
    }
}

Java

static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri locationForPhotos;

public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(locationForPhotos, 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.getParcelableExtra("data");
        // Do other work with full size photo saved in locationForPhotos.
        ...
    }
}

Để thực hiện việc này khi làm việc trên Android 12 (API cấp 31) trở lên, hãy tham khảo ví dụ về ý định sau đây.

Ý định mẫu:

Kotlin

val REQUEST_IMAGE_CAPTURE = 1

private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}

Java

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    } catch (ActivityNotFoundException e) {
        // Display error state to the user.
    }
}
</section></div>

Để biết thêm thông tin về cách sử dụng ý định này để chụp ảnh, bao gồm cả cách tạo Uri thích hợp cho vị trí đầu ra, hãy đọc bài viết Chụp ảnh hoặc Quay video.

Ví dụ về bộ lọc ý định:

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

Khi xử lý ý định này, hãy yêu cầu hoạt động của bạn để tìm EXTRA_OUTPUT bổ sung trong Intent đến, sau đó lưu hình ảnh hoặc video đã chụp tại vị trí được chỉ định bởi phần bổ sung đó, rồi gọi setResult() bằng Intent chứa hình thu nhỏ được nén trong một tệp bổ sung có tên là "data".

Khởi động ứng dụng máy ảnh ở chế độ hình ảnh tĩnh

Tác vụ thoại của Google

  • "chụp ảnh"

Để mở một ứng dụng máy ảnh ở chế độ hình ảnh tĩnh, hãy dùng thao tác INTENT_ACTION_STILL_IMAGE_CAMERA.

Hành động
INTENT_ACTION_STILL_IMAGE_CAMERA
Lược đồ URI dữ liệu
Không có
Loại MIME
Không có
Thông tin khác
Không có

Ý định mẫu:

Kotlin

private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}

Java

public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(locationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

Ví dụ về bộ lọc ý định:

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

Khởi động ứng dụng máy ảnh ở chế độ video

Tác vụ thoại của Google

  • "quay video"

Để mở ứng dụng máy ảnh ở chế độ video, hãy dùng thao tác INTENT_ACTION_VIDEO_CAMERA.

Hành động
INTENT_ACTION_VIDEO_CAMERA
Lược đồ URI dữ liệu
Không có
Loại MIME
Không có
Thông tin khác
Không có

Ý định mẫu:

Kotlin

fun capturePhoto() {
    val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA)
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)
    }
}

Java

public void capturePhoto() {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

Ví dụ về bộ lọc ý định:

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

Ứng dụng danh bạ/người

Sau đây là các thao tác phổ biến dành cho ứng dụng quản lý danh bạ, bao gồm cả thông tin bạn cần để tạo bộ lọc ý định nhằm quảng cáo khả năng thực hiện từng thao tác của ứng dụng.

Chọn một liên hệ

Để người dùng chọn một mục liên hệ và cấp cho ứng dụng của bạn quyền truy cập vào tất cả thông tin liên hệ, hãy sử dụng thao tác ACTION_PICK và chỉ định loại MIME cho Contacts.CONTENT_TYPE.

Kết quả Intent được gửi đến lệnh gọi lại onActivityResult() của bạn chứa URI content: trỏ đến liên hệ đã chọn. Phản hồi này sẽ cấp cho ứng dụng quyền tạm thời để đọc danh bạ đó bằng API Danh bạ, ngay cả khi ứng dụng không có quyền READ_CONTACTS.

Mẹo: Nếu bạn chỉ cần truy cập vào một phần thông tin liên hệ cụ thể, chẳng hạn như số điện thoại hoặc địa chỉ email, hãy xem phần tiếp theo về cách chọn dữ liệu liên hệ cụ thể.

Hành động
ACTION_PICK
Lược đồ URI dữ liệu
Không có
Loại MIME
Contacts.CONTENT_TYPE

Ý định mẫu:

Kotlin

const val REQUEST_SELECT_CONTACT = 1

fun selectContact() {
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = ContactsContract.Contacts.CONTENT_TYPE
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        val contactUri: Uri = data.data
        // Do something with the selected contact at contactUri.
        //...
    }
}

Java

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

Để biết thông tin về cách truy xuất thông tin liên hệ sau khi bạn có URI liên hệ, hãy đọc bài viết Truy xuất thông tin liên hệ cho một người liên hệ.

Khi truy xuất URI của người liên hệ bằng ý định này, thường thì bạn không cần quyền READ_CONTACTS để đọc thông tin cơ bản của người liên hệ đó, chẳng hạn như tên hiển thị và việc người liên hệ đó có được gắn dấu sao hay không. Tuy nhiên, nếu đang cố gắng đọc dữ liệu cụ thể hơn về một người liên hệ nhất định, chẳng hạn như số điện thoại hoặc địa chỉ email của họ, bạn cần có quyền READ_CONTACTS.

Chọn dữ liệu liên hệ cụ thể

Để yêu cầu người dùng chọn một thông tin cụ thể của một mục liên hệ, chẳng hạn như số điện thoại, địa chỉ email hoặc loại dữ liệu khác, hãy sử dụng thao tác ACTION_PICK và chỉ định loại MIME cho một trong các loại nội dung sau, chẳng hạn như CommonDataKinds.Phone.CONTENT_TYPE để biết số điện thoại của mục liên hệ đó.

Lưu ý: Trong nhiều trường hợp, ứng dụng của bạn cần có quyền READ_CONTACTS để xem thông tin cụ thể về một người liên hệ cụ thể.

Nếu bạn chỉ cần truy xuất một loại dữ liệu của một người liên hệ, thì kỹ thuật này với CONTENT_TYPE từ các lớp ContactsContract.CommonDataKinds sẽ hiệu quả hơn so với việc sử dụng Contacts.CONTENT_TYPE, như trình bày trong phần trước. Kết quả cung cấp cho bạn quyền truy cập trực tiếp vào dữ liệu mong muốn mà không yêu cầu bạn phải thực hiện truy vấn phức tạp hơn đến Nhà cung cấp danh bạ.

Kết quả Intent được gửi đến lệnh gọi lại onActivityResult() của bạn chứa URI content: trỏ đến dữ liệu liên hệ đã chọn. Phản hồi này sẽ cấp cho ứng dụng quyền tạm thời để đọc dữ liệu người liên hệ đó ngay cả khi ứng dụng không có quyền READ_CONTACTS.

Hành động
ACTION_PICK
Lược đồ URI dữ liệu
Không có
Loại MIME
CommonDataKinds.Phone.CONTENT_TYPE
Chọn từ những người liên hệ có số điện thoại.
CommonDataKinds.Email.CONTENT_TYPE
Chọn từ những người liên hệ có địa chỉ email.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
Chọn trong số những người liên hệ có địa chỉ bưu chính.

Hoặc một trong nhiều giá trị CONTENT_TYPE khác trong ContactsContract.

Ý định mẫu:

Kotlin

const val REQUEST_SELECT_PHONE_NUMBER = 1

fun selectContact() {
    // Start an activity for the user to pick a phone number from contacts.
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = CommonDataKinds.Phone.CONTENT_TYPE
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) {
        // Get the URI and query the content provider for the phone number.
        val contactUri: Uri = data.data
        val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER)
        contentResolver.query(contactUri, projection, null, null, null).use { cursor ->
            // If the cursor returned is valid, get the phone number.
            if (cursor.moveToFirst()) {
                val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER)
                val number = cursor.getString(numberIndex)
                // Do something with the phone number.
                ...
            }
        }
    }
}

Java

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

Xem một người liên hệ

Để hiển thị thông tin chi tiết về một người liên hệ đã biết, hãy sử dụng thao tác ACTION_VIEW và chỉ định người liên hệ đó với URI content: làm dữ liệu ý định.

Có hai cách chính để truy xuất ban đầu URI của địa chỉ liên hệ:

  • Sử dụng URI liên hệ do thao tác ACTION_PICK trả về trong phần trước. Phương pháp này không yêu cầu quyền cho ứng dụng.
  • Truy cập trực tiếp vào danh sách tất cả người liên hệ, như mô tả trong phần Truy xuất danh sách người liên hệ. Phương pháp này yêu cầu quyền READ_CONTACTS.
Hành động
ACTION_VIEW
Lược đồ URI dữ liệu
content:<URI>
Loại MIME
Không có. Loại được suy ra từ URI liên hệ.

Ý định mẫu:

Kotlin

fun viewContact(contactUri: Uri) {
    val intent = Intent(Intent.ACTION_VIEW, contactUri)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Chỉnh sửa một mục liên hệ hiện có

Để chỉnh sửa một người liên hệ đã biết, hãy sử dụng thao tác ACTION_EDIT, chỉ định người liên hệ đó có URI content: làm dữ liệu ý định và thêm mọi thông tin liên hệ đã biết vào dữ liệu bổ sung được chỉ định bởi hằng số trong ContactsContract.Intents.Insert.

Có hai cách chính để truy xuất URI liên hệ ban đầu:

  • Sử dụng URI liên hệ do thao tác ACTION_PICK trả về trong phần trước. Phương pháp này không yêu cầu quyền cho ứng dụng.
  • Truy cập trực tiếp vào danh sách tất cả người liên hệ, như mô tả trong phần Truy xuất danh sách người liên hệ. Phương pháp này yêu cầu quyền READ_CONTACTS.
Hành động
ACTION_EDIT
Lược đồ URI dữ liệu
content:<URI>
Loại MIME
Loại được suy ra từ URI liên hệ.
Thông tin khác
Một hoặc nhiều thông tin liên hệ bổ sung được xác định trong ContactsContract.Intents.Insert để bạn có thể điền sẵn các trường thông tin liên hệ.

Ý định mẫu:

Kotlin

fun editContact(contactUri: Uri, email: String) {
    val intent = Intent(Intent.ACTION_EDIT).apply {
        data = contactUri
        putExtra(ContactsContract.Intents.Insert.EMAIL, email)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Để biết thêm thông tin về cách chỉnh sửa một mục liên hệ, hãy đọc bài viết Sửa đổi mục liên hệ bằng ý định.

Chèn người liên hệ

Để chèn một người liên hệ mới, hãy dùng thao tác ACTION_INSERT, chỉ định Contacts.CONTENT_TYPE làm loại MIME và đưa mọi thông tin liên hệ đã biết vào dữ liệu bổ sung được chỉ định bởi các hằng số trong ContactsContract.Intents.Insert.

Hành động
ACTION_INSERT
Lược đồ URI dữ liệu
Không có
Loại MIME
Contacts.CONTENT_TYPE
Thông tin khác
Một hoặc nhiều dữ liệu bổ sung được xác định trong ContactsContract.Intents.Insert.

Ý định mẫu:

Kotlin

fun insertContact(name: String, email: String) {
    val intent = Intent(Intent.ACTION_INSERT).apply {
        type = ContactsContract.Contacts.CONTENT_TYPE
        putExtra(ContactsContract.Intents.Insert.NAME, name)
        putExtra(ContactsContract.Intents.Insert.EMAIL, email)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Để biết thêm thông tin về cách chèn một mục liên hệ, hãy đọc bài viết Sửa đổi mục liên hệ bằng cách sử dụng ý định.

Email

Soạn email với các tệp đính kèm không bắt buộc là một thao tác phổ biến đối với ứng dụng email. Tạo bộ lọc ý định để quảng cáo khả năng của ứng dụng trong việc thực hiện hành động này bằng thông tin trong phần sau.

Soạn email với các tệp đính kèm không bắt buộc

Để soạn email, hãy sử dụng một trong các thao tác sau tuỳ vào việc bạn có đính kèm tệp đính kèm hay không và thêm thông tin chi tiết về email như người nhận và chủ thể bằng cách sử dụng các khoá bổ sung được liệt kê.

Hành động
ACTION_SENDTO (đối với không có tệp đính kèm) hoặc
ACTION_SEND (đối với một tệp đính kèm) hoặc
ACTION_SEND_MULTIPLE (đối với nhiều tệp đính kèm)
Lược đồ URI dữ liệu
Không có
Loại MIME
"text/plain"
"*/*"
Thông tin khác
Intent.EXTRA_EMAIL
Một mảng chuỗi gồm tất cả địa chỉ email người nhận "Đến".
Intent.EXTRA_CC
Một mảng chuỗi gồm tất cả địa chỉ email của người nhận là "CC".
Intent.EXTRA_BCC
Một mảng chuỗi gồm tất cả địa chỉ email của người nhận là "BCC".
Intent.EXTRA_SUBJECT
Một chuỗi có tiêu đề email.
Intent.EXTRA_TEXT
Một chuỗi có nội dung email.
Intent.EXTRA_STREAM
Uri trỏ vào tệp đính kèm. Nếu bạn sử dụng thao tác ACTION_SEND_MULTIPLE, thì đây sẽ là một ArrayList chứa nhiều đối tượng Uri.

Ý định mẫu:

Kotlin

fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SEND).apply {
        type = "*/*"
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Nếu bạn muốn đảm bảo rằng ý định chỉ được ứng dụng email xử lý chứ không phải ứng dụng nhắn tin văn bản hoặc ứng dụng mạng xã hội, hãy sử dụng thao tác ACTION_SENDTO và thêm lược đồ dữ liệu "mailto:" như trong ví dụ sau:

Kotlin

fun composeEmail(addresses: Array<String>, subject: String) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:") // Only email apps handle this.
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // Only email apps handle this.
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ví dụ về bộ lọc ý định:

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

Bộ nhớ tệp

Sau đây là những thao tác phổ biến đối với các ứng dụng lưu trữ tệp, bao gồm cả thông tin bạn cần để tạo bộ lọc ý định nhằm quảng cáo khả năng thực hiện từng thao tác của ứng dụng.

Truy xuất một loại tệp cụ thể

Để yêu cầu người dùng chọn một tệp như tài liệu hoặc ảnh và trả về tệp tham chiếu đến ứng dụng của bạn, hãy sử dụng thao tác ACTION_GET_CONTENT và chỉ định loại MIME mà bạn muốn. Tệp tham chiếu tệp được trả về cho ứng dụng của bạn là tạm thời trong vòng đời hiện tại của hoạt động. Vì vậy, nếu sau này muốn truy cập vào tệp đó, bạn phải nhập một bản sao mà bạn có thể đọc sau.

Ý định này cũng cho phép người dùng tạo một tệp mới trong quy trình. Ví dụ: thay vì chọn một ảnh hiện có, người dùng có thể chụp một ảnh mới bằng máy ảnh.

Ý định kết quả được gửi đến phương thức onActivityResult() của bạn bao gồm dữ liệu có URI trỏ đến tệp. URI có thể là bất kỳ giá trị nào, chẳng hạn như URI http:, URI file: hoặc URI content:. Tuy nhiên, nếu bạn chỉ muốn chọn những tệp có thể chọn từ nhà cung cấp nội dung (URI content:) và có sẵn dưới dạng luồng tệp với openFileDescriptor(), hãy thêm danh mục CATEGORY_OPENABLE vào ý định của bạn.

Trên Android 4.3 (API cấp 18) trở lên, bạn cũng có thể cho phép người dùng chọn nhiều tệp bằng cách thêm EXTRA_ALLOW_MULTIPLE vào ý định, đặt thành true. Sau đó, bạn có thể truy cập từng tệp đã chọn trong đối tượng ClipData do getClipData() trả về.

Hành động
ACTION_GET_CONTENT
Lược đồ URI dữ liệu
Không có
Loại MIME
Loại MIME tương ứng với loại tệp mà người dùng cần chọn.
Thông tin khác
EXTRA_ALLOW_MULTIPLE
Một giá trị boolean khai báo liệu người dùng có thể chọn nhiều tệp cùng một lúc hay không.
EXTRA_LOCAL_ONLY
Một giá trị boolean khai báo liệu tệp được trả về có phải được lấy trực tiếp từ thiết bị hay không, thay vì yêu cầu tải xuống từ một dịch vụ từ xa.
Danh mục (không bắt buộc)
CATEGORY_OPENABLE
Để chỉ trả về các tệp "có thể mở" có thể biểu thị dưới dạng luồng tệp bằng openFileDescriptor().

Ví dụ về ý định để tải ảnh:

Kotlin

const val REQUEST_IMAGE_GET = 1

fun selectImage() {
    val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
        type = "image/*"
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_GET)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) {
        val thumbnail: Bitmap = data.getParcelableExtra("data")
        val fullPhotoUri: Uri = data.data
        // Do work with photo saved at fullPhotoUri.
        ...
    }
}

Java

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

Ví dụ về bộ lọc ý định trả về ảnh:

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

Mở một loại tệp cụ thể

Thay vì truy xuất bản sao của tệp mà bạn phải nhập vào ứng dụng, bằng cách sử dụng thao tác ACTION_GET_CONTENT, khi chạy trên Android 4.4 trở lên, bạn có thể yêu cầu mở tệp do một ứng dụng khác quản lý bằng cách sử dụng thao tác ACTION_OPEN_DOCUMENT và chỉ định loại MIME. Ngoài ra, để cho phép người dùng tạo một tài liệu mới mà ứng dụng của bạn có thể ghi vào, hãy sử dụng thao tác ACTION_CREATE_DOCUMENT.

Ví dụ: thay vì chọn trong số các tài liệu PDF hiện có, ý định ACTION_CREATE_DOCUMENT cho phép người dùng chọn nơi họ muốn tạo tài liệu mới, chẳng hạn như trong một ứng dụng khác quản lý bộ nhớ của tài liệu. Sau đó, ứng dụng của bạn sẽ nhận được vị trí URI mà ứng dụng có thể viết tài liệu mới.

Mặc dù ý định được phân phối đến phương thức onActivityResult() từ thao tác ACTION_GET_CONTENT có thể trả về một URI thuộc bất kỳ loại nào, nhưng ý định kết quả từ ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT luôn chỉ định tệp đã chọn làm URI content: được DocumentsProvider hỗ trợ. Bạn có thể mở tệp bằng openFileDescriptor() và truy vấn thông tin chi tiết của tệp đó thông qua các cột từ DocumentsContract.Document.

URI được trả về sẽ cấp cho ứng dụng của bạn quyền đọc tệp dài hạn, cũng có thể có quyền ghi. Thao tác ACTION_OPEN_DOCUMENT đặc biệt hữu ích khi bạn muốn đọc một tệp hiện có mà không cần tạo bản sao vào ứng dụng hoặc khi bạn muốn mở và chỉnh sửa một tệp tại chỗ.

Bạn cũng có thể cho phép người dùng chọn nhiều tệp bằng cách thêm EXTRA_ALLOW_MULTIPLE vào ý định, đặt thành true. Nếu người dùng chỉ chọn một mục, thì bạn có thể truy xuất mục đó từ getData(). Nếu người dùng chọn nhiều mục, thì getData() sẽ trả về giá trị rỗng và thay vào đó, bạn phải truy xuất từng mục từ đối tượng ClipData do getClipData() trả về.

Lưu ý: Ý định của bạn phải chỉ định loại MIME và phải khai báo danh mục CATEGORY_OPENABLE. Nếu phù hợp, bạn có thể chỉ định nhiều loại MIME bằng cách thêm một mảng các loại MIME có phần bổ sung EXTRA_MIME_TYPES. Nếu làm như vậy, bạn phải đặt loại MIME chính trong setType() thành "*/*".

Hành động
ACTION_OPEN_DOCUMENT hoặc
ACTION_CREATE_DOCUMENT
Lược đồ URI dữ liệu
Không có
Loại MIME
Loại MIME tương ứng với loại tệp mà người dùng cần chọn.
Thông tin khác
EXTRA_MIME_TYPES
Một mảng các loại MIME tương ứng với các loại tệp mà ứng dụng của bạn đang yêu cầu. Khi sử dụng dữ liệu bổ sung này, bạn phải đặt loại MIME chính trong setType() thành "*/*".
EXTRA_ALLOW_MULTIPLE
Một giá trị boolean khai báo liệu người dùng có thể chọn nhiều tệp cùng một lúc hay không.
EXTRA_TITLE
Để sử dụng với ACTION_CREATE_DOCUMENT nhằm chỉ định tên tệp ban đầu.
EXTRA_LOCAL_ONLY
Một giá trị boolean khai báo liệu tệp được trả về có phải được lấy trực tiếp từ thiết bị hay không, thay vì yêu cầu tải xuống từ một dịch vụ từ xa.
Danh mục
CATEGORY_OPENABLE
Để chỉ trả về các tệp "có thể mở" có thể biểu thị dưới dạng luồng tệp bằng openFileDescriptor().

Ví dụ về ý định để tải ảnh:

Kotlin

const val REQUEST_IMAGE_OPEN = 1

fun selectImage2() {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        type = "image/*"
        addCategory(Intent.CATEGORY_OPENABLE)
    }
    // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
    startActivityForResult(intent, REQUEST_IMAGE_OPEN)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) {
        val fullPhotoUri: Uri = data.data
        // Do work with full size photo saved at fullPhotoUri.
        ...
    }
}

Java

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

Các ứng dụng bên thứ ba không thể phản hồi ý định bằng thao tác ACTION_OPEN_DOCUMENT. Thay vào đó, hệ thống sẽ nhận được ý định này và hiển thị tất cả các tệp có sẵn trong nhiều ứng dụng trong một giao diện người dùng hợp nhất.

Để cung cấp các tệp của ứng dụng trong giao diện người dùng này và cho phép các ứng dụng khác mở các tệp đó, bạn phải triển khai DocumentsProvider và đưa vào một bộ lọc ý định cho PROVIDER_INTERFACE ("android.content.action.DOCUMENTS_PROVIDER"), như trong ví dụ sau:

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

Để biết thêm thông tin về cách làm cho các tệp do ứng dụng của bạn quản lý có thể mở được qua các ứng dụng khác, hãy đọc nội dung Mở tệp bằng khung truy cập bộ nhớ.

Hành động liên quan đến địa điểm thực tế

Gọi xe là một hành động phổ biến tại địa phương. Tạo bộ lọc ý định để quảng cáo khả năng thực hiện hành động này của ứng dụng bằng thông tin trong phần sau.

Gọi xe

Tác vụ thoại của Google

  • "đặt taxi cho tôi"
  • "gọi cho tôi là một chiếc xe"

(Chỉ phát hành cho Wear OS)

Để gọi taxi, hãy sử dụng thao tác ACTION_RESERVE_TAXI_RESERVATION.

Lưu ý: Ứng dụng phải yêu cầu người dùng xác nhận trước khi hoàn tất thao tác này.

Hành động
ACTION_RESERVE_TAXI_RESERVATION
URI dữ liệu
Không có
Loại MIME
Không có
Thông tin khác
Không có

Ý định mẫu:

Kotlin

fun callCar() {
    val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void callCar() {
    Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ví dụ về bộ lọc ý định:

<activity ...>
    <intent-filter>
        <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Bản đồ

Hiển thị vị trí trên bản đồ là một hành động phổ biến đối với ứng dụng bản đồ. Tạo bộ lọc ý định để quảng cáo khả năng của ứng dụng trong việc thực hiện hành động này bằng thông tin trong phần sau.

Hiển thị một vị trí trên bản đồ

Để mở bản đồ, hãy sử dụng thao tác ACTION_VIEW và chỉ định thông tin vị trí trong dữ liệu ý định bằng một trong các lược đồ sau.

Hành động
ACTION_VIEW
Lược đồ URI dữ liệu
geo:latitude,longitude
Hiển thị bản đồ theo kinh độ và vĩ độ đã cho.

Ví dụ: "geo:47.6,-122.3"

geo:latitude,longitude?z=zoom
Hiển thị bản đồ ở một kinh độ và vĩ độ cho trước ở một mức thu phóng nhất định. Mức thu phóng bằng 1 cho thấy toàn bộ Trái Đất, ở tâm vĩ độ,lng đã cho. Mức thu phóng cao nhất (gần nhất) là 23.

Ví dụ: "geo:47.6,-122.3?z=11"

geo:0,0?q=lat,lng(label)
Hiển thị bản đồ ở kinh độ và vĩ độ đã cho bằng nhãn chuỗi.

Ví dụ: "geo:0,0?q=34.99,-106.61(Treasure)"

geo:0,0?q=my+street+address
Hiển thị vị trí cho "địa chỉ đường phố của tôi", đây có thể là một địa chỉ hoặc cụm từ tìm kiếm vị trí cụ thể.

Ví dụ: "geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"

Lưu ý: Tất cả các chuỗi được truyền trong URI geo đều phải được mã hoá. Ví dụ: chuỗi 1st & Pike, Seattle trở thành 1st%20%26%20Pike%2C%20Seattle. Dấu cách trong chuỗi được mã hoá bằng %20 hoặc thay thế bằng dấu cộng (+).

Loại MIME
Không có

Ý định mẫu:

Kotlin

fun showMap(geoLocation: Uri) {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = geoLocation
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Ví dụ về bộ lọc ý định:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="geo" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Nhạc hoặc video

Sau đây là những thao tác phổ biến đối với ứng dụng nhạc và video, bao gồm cả thông tin bạn cần để tạo bộ lọc ý định nhằm quảng cáo khả năng thực hiện từng thao tác của ứng dụng.

Phát một tệp nội dung nghe nhìn

Để phát một tệp nhạc, hãy dùng thao tác ACTION_VIEW và chỉ định vị trí URI của tệp đó trong dữ liệu ý định.

Hành động
ACTION_VIEW
Lược đồ URI dữ liệu
file:<URI>
content:<URI>
http:<URL>
Loại MIME
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
Hoặc bất kỳ chức năng nào khác mà ứng dụng của bạn yêu cầu.

Ý định mẫu:

Kotlin

fun playMedia(file: Uri) {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = file
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Ví dụ về bộ lọc ý định:

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

Phát nhạc dựa trên cụm từ tìm kiếm

Tác vụ thoại của Google

  • "phát nhạc của Michael jackson Billie jean"

Để phát nhạc dựa trên một cụm từ tìm kiếm, hãy sử dụng ý định INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH. Ứng dụng có thể kích hoạt ý định này để phản hồi lệnh thoại của người dùng để phát nhạc. Ứng dụng nhận ý định này sẽ tìm kiếm trong khoảng không quảng cáo của nó để so khớp nội dung hiện có với truy vấn nhất định và bắt đầu phát nội dung đó.

Trong ý định này, hãy thêm chuỗi bổ sung EXTRA_MEDIA_FOCUS để chỉ định chế độ tìm kiếm dự định. Ví dụ: chế độ tìm kiếm có thể chỉ định xem nội dung tìm kiếm là tên nghệ sĩ hay tên bài hát.

Hành động
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
Lược đồ URI dữ liệu
Không có
Loại MIME
Không có
Thông tin khác
MediaStore.EXTRA_MEDIA_FOCUS (bắt buộc)

Cho biết chế độ tìm kiếm: liệu người dùng có đang tìm kiếm một nghệ sĩ, đĩa nhạc, bài hát hoặc danh sách phát cụ thể hay không. Hầu hết các chế độ tìm kiếm đều có thêm tính năng bổ sung. Ví dụ: nếu người dùng muốn nghe một bài hát cụ thể, thì ý định có thể có ba dữ liệu bổ sung bổ sung: tên bài hát, nghệ sĩ và đĩa nhạc. Ý định này hỗ trợ các chế độ tìm kiếm sau đây cho từng giá trị của EXTRA_MEDIA_FOCUS:

Bất kỳ"vnd.android.cursor.item/*"

Phát nhạc bất kỳ. Ứng dụng nhận sẽ phát một số bản nhạc dựa trên một lựa chọn thông minh, chẳng hạn như danh sách phát mà người dùng nghe gần đây nhất.

Thông tin bổ sung:

  • QUERY (bắt buộc): một chuỗi trống. Dữ liệu bổ sung này luôn được cung cấp để đảm bảo khả năng tương thích ngược. Các ứng dụng hiện có chưa biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng tìm kiếm không có cấu trúc.

Không có cấu trúc"vnd.android.cursor.item/*"

Phát một bài hát, đĩa nhạc hoặc thể loại cụ thể thông qua một cụm từ tìm kiếm không có cấu trúc. Các ứng dụng có thể tạo ý định bằng chế độ tìm kiếm này khi không thể xác định loại nội dung mà người dùng muốn nghe. Sử dụng các chế độ tìm kiếm cụ thể hơn khi có thể.

Thông tin bổ sung:

  • QUERY (bắt buộc): một chuỗi chứa bất kỳ tổ hợp nào của nghệ sĩ, đĩa nhạc, tên bài hát hoặc thể loại.

Thể loại - Audio.Genres.ENTRY_CONTENT_TYPE

Phát nhạc thuộc một thể loại cụ thể.

Thông tin bổ sung:

  • "android.intent.extra.genre" (bắt buộc) – Thể loại.
  • QUERY (bắt buộc): thể loại. Dữ liệu bổ sung này luôn được cung cấp để đảm bảo khả năng tương thích ngược. Các ứng dụng hiện có chưa biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng nội dung tìm kiếm không có cấu trúc.

Nghệ sĩAudio.Artists.ENTRY_CONTENT_TYPE

Phát nhạc của một nghệ sĩ cụ thể.

Thông tin bổ sung:

  • EXTRA_MEDIA_ARTIST (bắt buộc): nghệ sĩ.
  • "android.intent.extra.genre": thể loại.
  • QUERY (bắt buộc): một chuỗi chứa bất kỳ tổ hợp nào của nghệ sĩ hoặc thể loại. Dữ liệu bổ sung này luôn được cung cấp để tương thích ngược. Các ứng dụng hiện có chưa biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng nội dung tìm kiếm không có cấu trúc.

Album - Audio.Albums.ENTRY_CONTENT_TYPE

Phát nhạc từ một đĩa nhạc cụ thể.

Thông tin bổ sung:

  • EXTRA_MEDIA_ALBUM (bắt buộc): album.
  • EXTRA_MEDIA_ARTIST: nghệ sĩ.
  • "android.intent.extra.genre": thể loại.
  • QUERY (bắt buộc): một chuỗi chứa bất kỳ tổ hợp nào của đĩa nhạc hoặc nghệ sĩ. Dữ liệu bổ sung này luôn được cung cấp để tương thích ngược. Các ứng dụng hiện có chưa biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng nội dung tìm kiếm không có cấu trúc.

Bài hát"vnd.android.cursor.item/audio"

Phát một bài hát cụ thể.

Thông tin bổ sung:

  • EXTRA_MEDIA_ALBUM: đĩa nhạc.
  • EXTRA_MEDIA_ARTIST: nghệ sĩ.
  • "android.intent.extra.genre": thể loại.
  • EXTRA_MEDIA_TITLE (bắt buộc): tên bài hát.
  • QUERY (bắt buộc): một chuỗi chứa bất kỳ tổ hợp nào của đĩa nhạc, nghệ sĩ, thể loại hoặc tiêu đề. Dữ liệu bổ sung này luôn được cung cấp để tương thích ngược. Các ứng dụng hiện có chưa biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng tìm kiếm không có cấu trúc.

Danh sách phát - Audio.Playlists.ENTRY_CONTENT_TYPE

Phát một danh sách phát cụ thể hoặc danh sách phát khớp với một số tiêu chí do các nội dung bổ sung bổ sung chỉ định.

Thông tin bổ sung:

  • EXTRA_MEDIA_ALBUM: đĩa nhạc.
  • EXTRA_MEDIA_ARTIST: nghệ sĩ.
  • "android.intent.extra.genre": thể loại.
  • "android.intent.extra.playlist": danh sách phát.
  • EXTRA_MEDIA_TITLE: tên bài hát làm nền tảng cho danh sách phát.
  • QUERY (bắt buộc): một chuỗi chứa bất kỳ tổ hợp nào của đĩa nhạc, nghệ sĩ, thể loại, danh sách phát hoặc tiêu đề. Dữ liệu bổ sung này luôn được cung cấp để đảm bảo khả năng tương thích ngược. Các ứng dụng hiện có chưa biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng tìm kiếm không có cấu trúc.

Ý định mẫu:

Nếu người dùng muốn nghe nhạc của một nghệ sĩ cụ thể, thì ứng dụng tìm kiếm có thể tạo ý định sau:

Kotlin

fun playSearchArtist(artist: String) {
    val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply {
        putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE)
        putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist)
        putExtra(SearchManager.QUERY, artist)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Ví dụ về bộ lọc ý định:

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

Khi xử lý ý định này trong hoạt động của bạn, hãy kiểm tra giá trị của EXTRA_MEDIA_FOCUS bổ sung trong Intent đến để xác định chế độ tìm kiếm. Sau khi hoạt động của bạn đã xác định chế độ tìm kiếm, hãy đọc giá trị của các dữ liệu bổ sung bổ sung cho chế độ tìm kiếm cụ thể đó. Với thông tin này, ứng dụng của bạn có thể thực hiện việc tìm kiếm trong khoảng không quảng cáo để phát nội dung khớp với cụm từ tìm kiếm. Lệnh này được minh hoạ trong ví dụ sau:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) {

        val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS)
        val query: String? = intent.getStringExtra(SearchManager.QUERY)

        // Some of these extras might not be available depending on the search mode.
        val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM)
        val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST)
        val genre: String? = intent.getStringExtra("android.intent.extra.genre")
        val playlist: String? = intent.getStringExtra("android.intent.extra.playlist")
        val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE)

        // Determine the search mode and use the corresponding extras.
        when {
            mediaFocus == null -> {
                // 'Unstructured' search mode (backward compatible)
                playUnstructuredSearch(query)
            }
            mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> {
                if (query?.isNotEmpty() == true) {
                    // 'Unstructured' search mode.
                    playUnstructuredSearch(query)
                } else {
                    // 'Any' search mode.
                    playResumeLastPlaylist()
                }
            }
            mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Genre' search mode.
                playGenre(genre)
            }
            mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Artist' search mode.
                playArtist(artist, genre)
            }
            mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Album' search mode.
                playAlbum(album, artist)
            }
            mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> {
                // 'Song' search mode.
                playSong(album, artist, genre, title)
            }
            mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Playlist' search mode.
                playPlaylist(album, artist, genre, playlist, title)
            }
        }
    }
}

Java

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

Ghi chú mới

Tạo ghi chú là một thao tác phổ biến đối với các ứng dụng ghi chú. Tạo bộ lọc ý định để quảng cáo khả năng của ứng dụng trong việc thực hiện hành động này bằng thông tin trong phần sau.

Tạo ghi chú

Để tạo một ghi chú mới, hãy sử dụng thao tác ACTION_CREATE_NOTE rồi chỉ định thông tin chi tiết về ghi chú như tiêu đề và văn bản bằng các dữ liệu bổ sung sau.

Lưu ý: Ứng dụng phải yêu cầu người dùng xác nhận trước khi hoàn tất thao tác này.

Hành động
ACTION_CREATE_NOTE
Lược đồ URI dữ liệu
Không có
Loại MIME
PLAIN_TEXT_TYPE
"*/*"
Thông tin khác
EXTRA_NAME
Một chuỗi cho biết tiêu đề hoặc chủ đề của ghi chú.
EXTRA_TEXT
Một chuỗi cho biết văn bản của ghi chú.

Ý định mẫu:

Kotlin

fun createNote(subject: String, text: String) {
    val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply {
        putExtra(NoteIntents.EXTRA_NAME, subject)
        putExtra(NoteIntents.EXTRA_TEXT, text)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Ví dụ về bộ lọc ý định:

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

Điện thoại

Bắt đầu cuộc gọi là một thao tác phổ biến đối với ứng dụng điện thoại. Tạo bộ lọc ý định để quảng cáo khả năng của ứng dụng trong việc thực hiện hành động này bằng thông tin trong phần sau.

Bắt đầu một cuộc gọi điện thoại

Để mở ứng dụng điện thoại và gọi một số điện thoại, hãy sử dụng thao tác ACTION_DIAL và chỉ định số điện thoại bằng lược đồ URI sau. Khi ứng dụng điện thoại mở ra, ứng dụng sẽ hiển thị số điện thoại và người dùng phải nhấn vào nút Call (Gọi) để bắt đầu cuộc gọi điện thoại.

Tác vụ thoại của Google

  • "gọi 555-5555"
  • "gọi bob"
  • "gọi thư thoại"

Để trực tiếp thực hiện một cuộc gọi điện thoại, hãy sử dụng thao tác ACTION_CALL và chỉ định số điện thoại bằng lược đồ URI sau. Khi ứng dụng điện thoại mở ra, nó sẽ bắt đầu cuộc gọi điện thoại. Người dùng không cần nhấn vào nút Gọi.

Thao tác ACTION_CALL yêu cầu bạn thêm quyền CALL_PHONE vào tệp kê khai:

<uses-permission android:name="android.permission.CALL_PHONE" />
Hành động
  • ACTION_DIAL - Mở trình quay số hoặc ứng dụng điện thoại.
  • ACTION_CALL – Thực hiện cuộc gọi điện thoại (cần có quyền CALL_PHONE)
Lược đồ URI dữ liệu
  • tel:<phone-number>
  • voicemail:<phone-number>
Loại MIME
Không có

Số điện thoại hợp lệ là những số được xác định trong IETF RFC 3966. Sau đây là một số ví dụ hợp lệ:

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

Trình quay số của ứng dụng Điện thoại hỗ trợ tốt các giao thức chuẩn hoá, chẳng hạn như số điện thoại. Vì vậy, bạn không bắt buộc phải sử dụng lược đồ được mô tả trong phương thức Uri.parse(). Tuy nhiên, nếu bạn chưa thử một lược đồ hoặc không chắc chắn liệu có thể xử lý một lược đồ nào đó hay không, hãy sử dụng phương thức Uri.fromParts().

Ý định mẫu:

Kotlin

fun dialPhoneNumber(phoneNumber: String) {
    val intent = Intent(Intent.ACTION_DIAL).apply {
        data = Uri.parse("tel:$phoneNumber")
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Sau đây là những thao tác phổ biến dành cho ứng dụng tìm kiếm, bao gồm cả thông tin bạn cần để tạo bộ lọc ý định nhằm quảng cáo khả năng thực hiện từng thao tác của ứng dụng.

Tìm kiếm bằng một ứng dụng cụ thể

Tác vụ thoại của Google

  • "tìm video về mèo trên ứng dụng myvideo"

Để hỗ trợ tìm kiếm trong ngữ cảnh của ứng dụng, hãy khai báo bộ lọc ý định trong ứng dụng bằng thao tác SEARCH_ACTION, như minh hoạ trong ví dụ sau về bộ lọc ý định.

Lưu ý: Bạn không nên sử dụng SEARCH_ACTION để tìm kiếm ứng dụng. Thay vào đó, hãy triển khai thao tác GET_THING để tận dụng tính năng hỗ trợ tích hợp của Trợ lý Google cho tính năng tìm kiếm trong ứng dụng. Để biết thêm thông tin, hãy xem tài liệu về Hành động trong ứng dụng của Trợ lý Google.

Hành động
"com.google.android.gms.actions.SEARCH_ACTION"
Hỗ trợ các cụm từ tìm kiếm trong Google Voice Actions.
Thông tin khác
QUERY
Một chuỗi chứa cụm từ tìm kiếm.

Ví dụ về bộ lọc ý định:

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

Tìm kiếm trên web

Để bắt đầu tìm kiếm trên web, hãy sử dụng thao tác ACTION_WEB_SEARCH và chỉ định chuỗi tìm kiếm trong phần bổ sung SearchManager.QUERY.

Hành động
ACTION_WEB_SEARCH
Lược đồ URI dữ liệu
Không có
Loại MIME
Không có
Thông tin khác
SearchManager.QUERY
Chuỗi tìm kiếm.

Ý định mẫu:

Kotlin

fun searchWeb(query: String) {
    val intent = Intent(Intent.ACTION_WEB_SEARCH).apply {
        putExtra(SearchManager.QUERY, query)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void searchWeb(String query) {
    Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
    intent.putExtra(SearchManager.QUERY, query);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Cài đặt

Để mở một màn hình trong ứng dụng Cài đặt của hệ thống khi ứng dụng yêu cầu người dùng thay đổi nội dung nào đó, hãy sử dụng một trong các thao tác theo ý định sau:

Hành động
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

Để biết các màn hình cài đặt khác có sẵn, hãy xem tài liệu Settings .

Lược đồ URI dữ liệu
Không có
Loại MIME
Không có

Ý định mẫu:

Kotlin

fun openWifiSettings() {
    val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Nhắn tin văn bản

Soạn tin nhắn SMS/MMS có tệp đính kèm là một thao tác phổ biến đối với các ứng dụng nhắn tin văn bản. Tạo bộ lọc ý định để quảng cáo khả năng của ứng dụng trong việc thực hiện hành động này bằng thông tin trong phần sau.

Soạn tin nhắn SMS/MMS có tệp đính kèm

Để bắt đầu một tin nhắn văn bản SMS hoặc MMS, hãy sử dụng một trong các thao tác theo ý định sau và chỉ định thông tin chi tiết về tin nhắn chẳng hạn như số điện thoại, tiêu đề và nội dung tin nhắn bằng các phím bổ sung sau.

Hành động
ACTION_SENDTO hoặc
ACTION_SEND hoặc
ACTION_SEND_MULTIPLE
Lược đồ URI dữ liệu
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>

Tất cả các lược đồ này đều được xử lý theo cùng một cách.

Loại MIME
"text/plain"
"image/*"
"video/*"
Thông tin khác
"subject"
Một chuỗi cho chủ đề tin nhắn (thường chỉ dành cho MMS).
"sms_body"
Một chuỗi cho tin nhắn văn bản.
EXTRA_STREAM
Uri trỏ đến hình ảnh hoặc video cần đính kèm. Nếu bạn sử dụng thao tác ACTION_SEND_MULTIPLE, thì phần bổ sung này là một ArrayList trong số Uri đối tượng trỏ đến hình ảnh hoặc video cần đính kèm.

Ý định mẫu:

Kotlin

fun composeMmsMessage(message: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        type = HTTP.PLAIN_TEXT_TYPE
        putExtra("sms_body", message)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Nếu bạn muốn đảm bảo rằng ý định chỉ được ứng dụng nhắn tin văn bản xử lý chứ không phải các ứng dụng email hoặc ứng dụng mạng xã hội khác, hãy sử dụng thao tác ACTION_SENDTO và thêm lược đồ dữ liệu "smsto:" như trong ví dụ sau:

Kotlin

fun composeMmsMessage(message: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SEND).apply {
        data = Uri.parse("smsto:")  // Only SMS apps respond to this.
        putExtra("sms_body", message)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setData(Uri.parse("smsto:"));  // Only SMS apps respond to this.
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ví dụ về bộ lọc ý định:

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

Lưu ý: Nếu đang phát triển ứng dụng nhắn tin SMS/MMS, bạn phải triển khai bộ lọc ý định cho một số thao tác bổ sung để có thể sử dụng dưới dạng ứng dụng SMS mặc định trên Android 4.4 trở lên. Để biết thêm thông tin, hãy xem tài liệu tại Telephony.

Trình duyệt web

Tải URL web là một thao tác phổ biến đối với các ứng dụng trình duyệt web. Tạo bộ lọc ý định để quảng cáo khả năng của ứng dụng trong việc thực hiện hành động này bằng thông tin trong phần sau.

Tải một URL web

Tác vụ thoại của Google

  • "mở example.com"

Để mở một trang web, hãy sử dụng thao tác ACTION_VIEW và chỉ định URL web trong dữ liệu ý định.

Hành động
ACTION_VIEW
Lược đồ URI dữ liệu
http:<URL>
https:<URL>
Loại MIME
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

Ý định mẫu:

Kotlin

fun openWebPage(url: String) {
    val webpage: Uri = Uri.parse(url)
    val intent = Intent(Intent.ACTION_VIEW, webpage)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Ví dụ về bộ lọc ý định:

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

Lưu ý: Nếu ứng dụng Android cung cấp chức năng tương tự như trang web của bạn, hãy thêm một bộ lọc ý định cho các URL trỏ đến trang web đó. Sau đó, nếu người dùng đã cài đặt ứng dụng của bạn, các đường liên kết từ email hoặc trang web khác trỏ đến trang web của bạn sẽ mở ứng dụng Android thay vì trang web của bạn. Tìm hiểu thêm về Xử lý Đường liên kết trong ứng dụng Android.

Kể từ Android 12 (API cấp 31), ý định web chung sẽ chỉ chuyển thành một hoạt động trong ứng dụng nếu ứng dụng của bạn được phê duyệt cho miền cụ thể có trong ý định web đó. Nếu ứng dụng của bạn không được phê duyệt cho miền, thì ý định web sẽ chuyển thành ứng dụng trình duyệt mặc định của người dùng.

Xác minh ý định bằng Cầu gỡ lỗi Android

Để xác minh rằng ứng dụng của bạn phản hồi các ý định mà bạn muốn hỗ trợ, bạn có thể sử dụng công cụ adb để kích hoạt các ý định cụ thể bằng cách thực hiện như sau:

  1. Thiết lập thiết bị Android để phát triển hoặc sử dụng thiết bị ảo.
  2. Cài đặt một phiên bản ứng dụng giúp xử lý các ý định bạn muốn hỗ trợ.
  3. Kích hoạt ý định bằng cách sử dụng adb:
    adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \
      -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
    

    Ví dụ:

    adb shell am start -a android.intent.action.DIAL \
      -d tel:555-5555 -n org.example.MyApp/.MyActivity
    
  4. Nếu bạn xác định các bộ lọc ý định bắt buộc, hãy xử lý ý định đó.

Để biết thêm thông tin, hãy xem phần Phát hành lệnh shell.