Ý định cho phép bạn bắt đầu một hoạt động trong một ứng dụng khác bằng cách mô tả một hành động mà bạn muốn thực hiện, chẳng hạn như "xem bản đồ" hoặc "chụp ảnh", trong một đối tượng Intent
. Loại ý định này được gọi là ý định ngầm ẩn vì không chỉ định thành phần ứng dụng sẽ bắt đầu mà thay vào đó 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 cho nó một ý định ngầm ẩn, hệ thống sẽ phân giải
ý định thành một ứng dụng có thể xử lý ý định đó và khởi động Activity
tương ứng. Nếu có nhiều ứng dụng có thể xử lý ý định này, 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 hành động 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 bạn có thể tạo một bộ lọc ý định để quảng cáo 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, thì ứng dụng sẽ gặp sự cố khi gọi startActivity()
. Để xác minh rằng có một ứng dụng nhận ý định, hãy gọi resolveActivity()
trên đối tượng Intent
của bạn. Nếu kết quả không rỗng, thì có ít nhất một ứng dụng có thể xử lý ý định và bạn có thể gọi startActivity()
một cách an toàn. 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 biết 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 được liệt kê trên trang này từ máy chủ lưu trữ phát triển của bạn, hãy xem phần Xác minh ý định bằng Cầu gỡ lỗi Android.
Thao tác bằng giọng nói của Google
Các thao tác bằng Google Voice sẽ kích hoạt một số ý định được liệt kê trên trang này để phản hồi các lệnh thoại. Để biết thêm thông tin, hãy xem bài viết Bắt đầu sử dụng Lệnh thoại hệ thống.
Đồng hồ báo thức
Sau đây là các thao tác thường gặp đối với ứ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ạo chuông báo mới, hãy 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à thông báo bằng cách dùng các phần bổ sung sau.
Lưu ý: Chỉ có giờ, phút và các phần bổ sung của thông báo trong Android 2.3 (API cấp 9) trở xuống. Các thành phần 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ờ báo thức.
EXTRA_MINUTES
- Số phút của chuông báo.
EXTRA_MESSAGE
- Thông báo tuỳ chỉnh để xác định chuông báo.
EXTRA_DAYS
- Một
ArrayList
bao gồm mỗi 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 trong lớpCalendar
, chẳng hạn nhưMONDAY
.Đối với chuông báo một lần, đừng chỉ định thêm thông tin này.
EXTRA_RINGTONE
- Một URI
content:
chỉ định nhạc chuông sẽ dùng với chuông báo hoặcVALUE_RINGTONE_SILENT
nếu không có nhạc chuông.Để sử dụng nhạc chuông mặc định, đừng chỉ định thêm thông tin này.
EXTRA_VIBRATE
- 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 xem ứng dụng phản hồi có phải bỏ qua giao diện người dùng khi đặt báo thức 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 ví dụ:
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); } }
Để 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 bộ hẹn giờ
Để tạo một đồ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ề đồng hồ hẹn giờ, chẳng hạn như thời lượng bằng cách sử dụng các phần 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ộ hẹn giờ tính bằng giây.
EXTRA_MESSAGE
- Thông báo tuỳ chỉnh để xác định bộ hẹn giờ.
EXTRA_SKIP_UI
- Một giá trị boolean chỉ định xem ứng dụng phản hồi có phải bỏ qua giao diện người dùng khi đặt bộ hẹn 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 ví dụ:
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); } }
Để 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 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 dùng bởi các ứng dụng hệ thống), nhưng mọi ứng dụng hoạt động như một đồ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 báo thức 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 các ứng dụng lịch. Tạo một 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 cách sử dụng thông tin trong phần sau.
Thêm sự kiện trê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 cách sử dụ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 phần 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
- Giá trị boolean chỉ định xem đây có phải là sự kiện diễn ra cả ngày hay không.
EXTRA_EVENT_BEGIN_TIME
- Thời gian bắt đầu của sự kiện (tính bằng 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 sự kiện (tính bằng mili giây kể từ thời gian bắt đầu của hệ thống).
TITLE
- Tiêu đề 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 người được 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ố được xác định trong lớp
CalendarContract.EventsColumns
.
Ý định ví dụ:
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à các thao tác thường gặp đố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 rồi trả về
Để mở một ứng dụng máy ảnh và nhận ảnh hoặc video kết quả, hãy sử 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 camera lưu ảnh hoặc video, trong phần EXTRA_OUTPUT
dữ liệu bổ sung.
- 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ả lại tiêu điểm thành công cho hoạt động của bạn (nói cách khác, ứng dụng của bạn nhận được lệnh gọi lại onActivityResult()
), bạn có thể truy cập vào ảnh hoặc video tại URI mà bạn đã chỉ định bằng 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 có kích thước nhỏ hơn 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 là "data"
.
Ý định ví dụ:
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.
Ý định ví dụ:
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
phù hợp cho vị trí đầu ra, hãy đọc phần 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 để hoạt động của bạn kiểm tra phần bổ sung EXTRA_OUTPUT
trong Intent
đến, sau đó lưu hình ảnh hoặc video đã chụp tại vị trí do phần bổ sung đó chỉ định và gọi setResult()
bằng một Intent
bao gồm hình thu nhỏ nén trong một phần bổ sung có tên là "data"
.
Khởi động ứng dụng camera ở chế độ ảnh tĩnh
Để mở một ứng dụng máy ảnh ở chế độ ả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 ví dụ:
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
Để mở một ứ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 ví dụ:
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 dùng
Sau đây là các thao tác thường gặp đối với ứ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 địa chỉ liên hệ
Để người dùng chọn một người 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 thành 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 người liên hệ đã chọn. Phản hồi này cấp cho ứng dụng của bạn quyền tạm thời để đọc thông tin liên hệ đó bằng API Contacts Provider, ngay cả khi ứng dụng của bạn không có quyền READ_CONTACTS
.
Lưu ý: 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 ví dụ:
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 của người liên hệ, hãy đọc phần Truy xuất thông tin chi tiết về một người liên hệ.
Khi truy xuất URI của người liên hệ bằng ý định này, bạn thường 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ể
Để người dùng chọn một thông tin cụ thể trong danh bạ, chẳng hạn như số điện thoại, địa chỉ email hoặc loại dữ liệu khác, hãy dùng thao tác ACTION_PICK
và chỉ định loại MIME thành một trong các loại nội dung sau, chẳng hạn như CommonDataKinds.Phone.CONTENT_TYPE
để lấy số điện thoại của người 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 từ 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ư minh hoạ trong phần trước. Kết quả này 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 thực hiện một truy vấn phức tạp hơn đối với Contacts Provider.
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 cấp cho ứng dụng của bạn quyền tạm thời để đọc dữ liệu liên hệ đó ngay cả khi ứng dụng của bạn 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 trong số những người liên hệ có số điện thoại.
CommonDataKinds.Email.CONTENT_TYPE
- Chọn trong số 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 trongContactsContract
.
Ý định ví dụ:
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 người liên hệ
Để hiện thông tin chi tiết của một người liên hệ đã biết, hãy dùng thao tác ACTION_VIEW
và chỉ định người liên hệ bằng URI content:
làm dữ liệu theo ý định.
Có hai cách chính để truy xuất URI của người liên hệ ban đầu:
- Sử dụng URI của danh bạ do thao tác
ACTION_PICK
trả về như trong phần trước. Phương pháp này không yêu cầu bất kỳ quyền nào của ứ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 này được suy luận từ URI của người liên hệ.
Ý định ví dụ:
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 địa chỉ liên hệ hiện có
Để chỉnh sửa một người liên hệ đã biết, hãy dùng thao tác ACTION_EDIT
, chỉ định người liên hệ bằng URI content:
làm dữ liệu ý định và thêm mọi thông tin liên hệ đã biết vào các phần bổ sung do hằng số chỉ định trong ContactsContract.Intents.Insert
.
Có hai cách chính để truy xuất URI liên hệ ban đầu:
- Sử dụng URI của danh bạ do thao tác
ACTION_PICK
trả về như trong phần trước. Phương pháp này không yêu cầu bất kỳ quyền nào của ứ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 này được suy luận từ URI của người liên hệ.
- Thông tin khác
- Một hoặc nhiều phần bổ sung được xác định trong
ContactsContract.Intents.Insert
để bạn có thể điền vào các trường thông tin liên hệ.
Ý định ví dụ:
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 người liên hệ, hãy đọc bài viết Sửa đổi người 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 sử 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 các phần bổ sung do hằng số chỉ định 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 phần bổ sung được xác định trong
ContactsContract.Intents.Insert
.
Ý định ví dụ:
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 người liên hệ, hãy đọc bài viết Sửa đổi người liên hệ bằng ý định.
Soạn email có tệp đính kèm (không bắt buộc) là một thao tác phổ biến đối với các ứng dụng email. Tạo một 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 cách sử dụng thông tin trong phần sau.
Soạn email 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 đây, tuỳ thuộc vào việc bạn có đính kèm tệp hay không, đồng thời cung cấp thông tin chi tiết về email như người nhận và tiêu đề bằng cách sử dụng các phím bổ sung được liệt kê.
- Hành động
ACTION_SENDTO
(không có tệp đính kèm) hoặc
ACTION_SEND
(có một tệp đính kèm) hoặc
ACTION_SEND_MULTIPLE
(có 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 của 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 "CC".
Intent.EXTRA_BCC
- Một mảng chuỗi gồm tất cả địa chỉ email của người nhận "BCC".
Intent.EXTRA_SUBJECT
- Một chuỗi có tiêu đề email.
Intent.EXTRA_TEXT
- Một chuỗi có nội dung của email.
Intent.EXTRA_STREAM
- Một
Uri
trỏ đến tệp đính kèm. Nếu sử dụng thao tácACTION_SEND_MULTIPLE
, thì đây làArrayList
chứa nhiều đối tượngUri
.
Ý định ví dụ:
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 của bạn chỉ được xử lý bởi một ứng dụng email chứ không phải ứng dụng nhắn tin văn bản hoặc ứng dụng xã hội, hãy sử dụng thao tác ACTION_SENDTO
và đưa lược đồ dữ liệu "mailto:"
vào 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>
Lưu trữ tệp
Sau đây là các thao tác phổ biến đối với ứ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 (chẳng hạn như tài liệu hoặc ảnh) và trả về một thông tin tham chiếu cho ứ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. Tham chiếu tệp được trả về cho ứng dụng của bạn là tạm thời đối với vòng đời hiện tại của hoạt động, vì vậy, nếu muốn truy cập vào tham chiếu đó sau này, 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 quá trình này. Ví dụ: thay vì chọn một bức ảnh hiện có, người dùng có thể chụp ảnh mới bằng camera.
Ý đị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 cứ thứ gì, chẳng hạn như URI http:
, URI file:
hoặc URI content:
. Tuy nhiên, nếu bạn muốn hạn chế các tệp có thể chọn chỉ là những tệp có thể truy cập từ một trình cung cấp nội dung (một URI content:
) và có sẵn dưới dạng một luồng tệp có 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 vào từng tệp đã chọn trong một đố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 xem 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 xem tệp được trả về có phải có sẵn trực tiếp trên 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ể được biểu thị dưới dạng luồng tệp bằng
openFileDescriptor()
.
Ví dụ về ý định lấy ả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ề một bức ả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 supportsOpenableColumns
andContentResolver.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 một 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ở một 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 một loại MIME.
Để 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 vị trí mà họ muốn tạo một 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 nơi ứng dụng có thể ghi tài liệu mới.
Trong khi ý định được gửi đến phương thức onActivityResult()
của bạn từ thao tác ACTION_GET_CONTENT
có thể trả về một URI thuộc bất kỳ loại nào, thì ý định kết quả từ ACTION_OPEN_DOCUMENT
và ACTION_CREATE_DOCUMENT
luôn chỉ định tệp đã chọn dưới dạng URI content:
được hỗ trợ bởi DocumentsProvider
. Bạn có thể mở tệp bằng openFileDescriptor()
và truy vấn thông tin chi tiết của tệp bằng các cột trong DocumentsContract.Document
.
URI được trả về cấp cho ứng dụng của bạn quyền đọc lâu dài đối với tệp, cũng có thể có quyền ghi. Hành động 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 sao chép 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ừ một đối tượng ClipData
do getClipData()
trả về.
Lưu ý: Ý định của bạn phải chỉ định một loại MIME và phải khai báo danh mục CATEGORY_OPENABLE
. Nếu thích 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 bằng 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 phần 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 xem người dùng có thể chọn nhiều tệp cùng một lúc hay không.
EXTRA_TITLE
- Để 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 xem tệp được trả về có phải có sẵn trực tiếp trên 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ể được biểu thị dưới dạng luồng tệp bằng
openFileDescriptor()
.
Ví dụ về ý định lấy ả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 một ý đị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ó 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 một DocumentsProvider
và thêm 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 mở các tệp do ứng dụng của bạn quản lý từ các ứng dụng khác, hãy đọc phần 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 liên quan đến địa điểm thực tế. Tạo một 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
Thao tác bằng giọng nói của Google
- "gọi taxi cho tôi"
- "gọi cho tôi một chiếc xe"
(Chỉ dành cho Wear OS)
Để gọi taxi, hãy 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 hành động 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 ví dụ:
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ị một vị trí trên bản đồ là một thao tác phổ biến đối với các ứng dụng bản đồ. Tạo một 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 cách sử dụng thông tin trong phần sau.
Hiển thị một vị trí trên bản đồ
Để mở bản đồ, hãy 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 đồ tại kinh độ và vĩ độ đã cho.
Ví dụ:
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
- Hiện bản đồ tại kinh độ và vĩ độ đã cho ở một mức thu phóng nhất định. Mức thu phóng 1 cho thấy toàn bộ Trái Đất, được đặt ở giữa tại lat,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 bản đồ tại kinh độ và vĩ độ đã cho bằng nhãn dạng 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", có thể là một địa chỉ cụ thể hoặc cụm từ tìm kiếm vị trí.
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ỗi1st & Pike, Seattle
sẽ trở thành1st%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 ví dụ:
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à các thao tác thường gặp đối với ứng dụng nhạc và video, bao gồm cả thông tin bạn cần để tạo một 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 tệp nội dung nghe nhìn
Để phát một tệp nhạc, hãy sử dụng thao tác ACTION_VIEW
và chỉ định vị trí URI của tệp trong dữ liệu theo ý đị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ỳ thông tin nào khác mà ứng dụng của bạn yêu cầu.
Ý định ví dụ:
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
Để 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
. Một ứ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 nhằm phát nhạc. Ứng dụng nhận lệnh này sẽ tìm kiếm trong kho nội dung của mình để so khớp nội dung hiện có với cụm từ tìm kiếm đã cho và bắt đầu phát nội dung đó.
Trong ý định này, hãy thêm chuỗi EXTRA_MEDIA_FOCUS
, trong đó chỉ định chế độ tìm kiếm dự kiến. Ví dụ: chế độ tìm kiếm có thể chỉ định xem bạn đang tìm 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 đ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 các 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ó 3 phần bổ sung khác: 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 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 lựa chọn thông minh, chẳng hạn như danh sách phát gần đây nhất mà người dùng đã nghe.
Các tiện ích bổ sung:
QUERY
(bắt buộc): một chuỗi trống. Phần 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ó không biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng một cụm từ 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ể từ 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 một ý định bằng chế độ tìm kiếm này khi không xác định được 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ể.
Các tiện ích bổ sung:
QUERY
(bắt buộc): một chuỗi chứa mọi tổ hợp 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ể.
Các tiện ích bổ sung:
"android.intent.extra.genre"
(bắt buộc) – Thể loại.QUERY
(bắt buộc): thể loại. Phần 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ó không biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng một cụm từ 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ể.
Các tiện ích 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 mọi tổ hợp của nghệ sĩ hoặc thể loại. Phần 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ó không biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng một cụm từ tìm kiếm không có cấu trúc.
Đĩa nhạc –
Audio.Albums.ENTRY_CONTENT_TYPE
-
Phát nhạc trong một đĩa nhạc cụ thể.
Các tiện ích 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 mọi tổ hợp của đĩa nhạc hoặc nghệ sĩ. Phần 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ó không biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng một cụm từ 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ể.
Các tiện ích 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 mọi tổ hợp của đĩa nhạc, nghệ sĩ, thể loại hoặc tiêu đề. Phần 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ó không biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng một cụm từ 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 một danh sách phát đáp ứng một số tiêu chí do các phần bổ sung khác chỉ định.
Các tiện ích 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 mà danh sách phát dựa trên.QUERY
(bắt buộc): một chuỗi chứa mọi tổ hợp của đĩa nhạc, nghệ sĩ, thể loại, danh sách phát hoặc tiêu đề. Phần 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ó không biết về chế độ tìm kiếm có thể xử lý ý định này dưới dạng một cụm từ tìm kiếm không có cấu trúc.
Ý định ví dụ:
Nếu người dùng muốn nghe nhạc của một nghệ sĩ cụ thể, thì một ứ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 phần bổ sung EXTRA_MEDIA_FOCUS
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 các giá trị của các phần bổ sung khác 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 tìm kiếm trong kho nội dung để 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 một 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 cách sử dụng thông tin trong phần sau.
Tạo ghi chú
Để tạo một ghi chú mới, hãy dùng thao tác
ACTION_CREATE_NOTE
và chỉ định thông tin chi tiết về ghi chú, chẳng hạn như tiêu đề và văn bản bằng cách dùng các phần 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 hành động 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ú.
-
- Hành động
-
ACTION_DIAL
– Mở ứng dụng 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 (yêu cầu có quyềnCALL_PHONE
)
- Lược đồ URI dữ liệu
-
tel:<phone-number>
voicemail:<phone-number>
- Loại MIME
- Không có
tel:2125551212
tel:(212) 555 1212
- Hành động
-
"com.google.android.gms.actions.SEARCH_ACTION"
- Hỗ trợ cụm từ tìm kiếm từ tính năng Thao tác bằng giọng nói của Google.
- Thông tin khác
-
QUERY
- Một chuỗi chứa cụm từ tìm kiếm.
- 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.
- 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 bổ sung hiện có, hãy xem tài liệu
Settings
. - Lược đồ URI dữ liệu
- Không có
- Loại MIME
- Không có
- 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 tiêu đề của 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
- Một
Uri
chỉ vào hình ảnh hoặc video cần đính kèm. Nếu dùng thao tácACTION_SEND_MULTIPLE
, thì phần bổ sung này là mộtArrayList
gồm các đối tượngUri
trỏ đến hình ảnh hoặc video cần đính kèm.
- 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"
- Thiết lập một thiết bị Android để phát triển hoặc sử dụng một thiết bị ảo.
- Cài đặt một phiên bản ứng dụng xử lý các ý định mà bạn muốn hỗ trợ.
- Kích hoạt một ý định bằng cách 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
- Nếu bạn xác định các bộ lọc ý định bắt buộc, hãy xử lý ý định.
Ý định ví dụ:
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 các ứng dụng điện thoại. Tạo một 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 cách sử dụ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à quay số điện thoại, hãy dùng thao tác ACTION_DIAL
và chỉ định số điện thoại bằng cách sử dụng lược đồ URI sau. Khi ứng dụng điện thoại mở ra, ứng dụng này sẽ hiển thị số điện thoại và người dùng phải nhấn vào nút Gọi để bắt đầu cuộc gọi điện thoại.
Để thực hiện cuộc gọi điện thoại trực tiếp, hãy sử dụng thao tác ACTION_CALL
và chỉ định số điện thoại bằng cách sử dụng lược đồ URI sau. Khi ứng dụng điện thoại mở ra, ứng dụng này 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" />
Số điện thoại hợp lệ là số điện thoại được xác định trong IETF RFC 3966. Sau đây là một số ví dụ hợp lệ:
Trình quay số của ứng dụng Điện thoại có khả năng chuẩn hoá các lược đồ, chẳng hạn như số điện thoại. Vì vậy, bạn không nhất thiết 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 lược đồ đó có thể được xử lý hay không, hãy sử dụng phương thức Uri.fromParts()
.
Ý định ví dụ:
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); } }
Tìm kiếm
Sau đây là các thao tác phổ biến đối với ứ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ể
Để hỗ trợ tìm kiếm trong bối cảnh ứng dụng, hãy khai báo một bộ lọc ý định trong ứng dụng bằng thao tác SEARCH_ACTION
, như minh hoạ trong ví dụ về bộ lọc ý định sau đây.
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 hoạt độ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.
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>
Thực hiện 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
.
Ý định ví dụ:
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 hệ thống khi ứng dụng của bạn yêu cầu người dùng thay đổi một nội dung nào đó, hãy dùng một trong các thao tác theo ý định sau:
Ý định ví dụ:
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
Việc 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 một 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 cách sử dụng thông tin trong phần sau.
Soạn tin nhắn SMS/MMS có tệp đính kèm
Để bắt đầu gửi 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 khoá bổ sung sau.
Ý định ví dụ:
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 của mình chỉ được xử lý bởi một ứng dụng nhắn tin văn bản chứ không phải các ứng dụng email hoặc mạng xã hội khác, hãy sử dụng thao tác ACTION_SENDTO
và thêm giản đồ dữ liệu "smsto:"
như minh hoạ 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 một ứ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ể dùng làm ứ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 một URL trên 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 một 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 cách sử dụng thông tin trong phần sau.
Tải một URL trên web
Để mở một trang web, hãy sử dụng thao tác ACTION_VIEW
và chỉ định URL của trang web trong dữ liệu ý định.
Ý định ví dụ:
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 của bạn 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 những URL trỏ đến trang web của bạn. Sau đó, nếu người dùng đã cài đặt ứng dụng của bạn, thì các đường liên kết từ email hoặc các trang web khác trỏ đến trang web của bạn sẽ mở ứng dụng Android của bạn thay vì trang web của bạn. Tìm hiểu thêm trong phần Xử lý Đường liên kết trong ứng dụng Android.
Kể từ Android 12 (API cấp 31), ý định chung trên web chỉ phân giải thành một hoạt động trong ứng dụng của bạn nếu ứng dụng đó được phê duyệt cho miền cụ thể có trong ý định đó trên web. Nếu ứng dụng của bạn không được phê duyệt cho miền này, thì ý định trên web sẽ chuyển sang ứ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ể dùng công cụ adb
để kích hoạt các ý định cụ thể bằng cách làm như sau:
Để biết thêm thông tin, hãy xem phần Gửi lệnh shell.