Android sử dụng ý định và tiện ích bổ sung liên quan để cho phép người dùng chia sẻ thông tin một cách nhanh chóng và dễ dàng bằng các ứng dụng mà các em yêu thích.
Android cung cấp 2 cách để người dùng chia sẻ dữ liệu giữa các ứng dụng:
- Trang chia sẻ nội dung Android chủ yếu được thiết kế để gửi nội dung ra bên ngoài ứng dụng của bạn và/hoặc trực tiếp thành một người dùng khác. Ví dụ: chia sẻ URL với bạn bè.
- Trình phân giải ý định của Android là lựa chọn phù hợp nhất để truyền dữ liệu đến giai đoạn tiếp theo của một nhiệm vụ được xác định rõ ràng. Ví dụ: mở tệp PDF từ ứng dụng của bạn và cho phép người dùng chọn người xem mong muốn.
Khi tạo một ý định, bạn sẽ chỉ định hành động mà bạn muốn ý định đó thực hiện.
Android sử dụng thao tác ACTION_SEND
để gửi dữ liệu từ hoạt động này sang hoạt động khác,
thậm chí xuyên suốt ranh giới của quá trình. Bạn cần chỉ định
dữ liệu và loại dữ liệu. Hệ thống tự động xác định các hoạt động tương thích
có thể nhận dữ liệu và hiển thị chúng cho người dùng. Trong trường hợp trình phân giải ý định,
nếu chỉ có một hoạt động có thể xử lý ý định, thì hoạt động đó sẽ bắt đầu ngay lập tức.
Lý do bạn nên sử dụng Trang chia sẻ nội dung của Android
Bạn nên sử dụng Trang chia sẻ nội dung của Android để tạo sự nhất quán cho người dùng trên của chúng tôi. Không hiển thị danh sách mục tiêu chia sẻ của riêng ứng dụng hoặc tạo mục tiêu chia sẻ của riêng bạn Các biến thể của trang chia sẻ nội dung.
Trang chia sẻ nội dung Android cho phép người dùng chia sẻ thông tin với đúng người, cùng với các đề xuất ứng dụng phù hợp, tất cả chỉ bằng một lần nhấn. Trang chia sẻ nội dung có thể đề xuất các mục tiêu không có sẵn cho các giải pháp tuỳ chỉnh và sử dụng thứ hạng nhất quán. Nguyên nhân là vì Trang chia sẻ nội dung có thể xem xét thông tin về hoạt động của người dùng và trong ứng dụng chỉ dành cho hệ thống.
Trang chia sẻ nội dung trên Android cũng có nhiều tính năng tiện lợi cho nhà phát triển. Ví dụ: bạn có thể hãy làm như sau:
- Tìm hiểu thời điểm người dùng hoàn tất lượt chia sẻ và địa điểm
- Thêm
ChooserTarget
tuỳ chỉnh và các mục tiêu ứng dụng - Cung cấp bản xem trước nội dung văn bản đa dạng thức, kể từ Android 10 (API cấp 29)
- Loại trừ những mục tiêu khớp với tên thành phần cụ thể
Sử dụng Trang chia sẻ nội dung của Android
Đối với mọi hình thức chia sẻ, hãy tạo một ý định và đặt hành động cho ý định đó thành
Intent.ACTION_SEND
.
Để hiển thị Trang chia sẻ nội dung trong Android, hãy gọi
Intent.createChooser()
,
truyền vào đó đối tượng Intent
.
Phương thức này trả về một phiên bản ý định của bạn luôn cho thấy Trang chia sẻ nội dung Android.
Gửi nội dung văn bản
Cách đơn giản và phổ biến nhất của Trang chia sẻ nội dung trên Android là gửi nội dung văn bản từ hoạt động này sang hoạt động khác. Ví dụ: hầu hết các trình duyệt đều có thể chia sẻ URL của trình duyệt đang hiển thị trang dưới dạng văn bản với một ứng dụng khác. Điều này rất hữu ích khi chia sẻ bài viết hoặc trang web với bạn bè thông qua email hoặc mạng xã hội. Sau đây là một ví dụ về cách thực hiện việc này:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
Nếu muốn, bạn có thể thêm ứng dụng khác để thêm thông tin khác, chẳng hạn như người nhận email
(EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
),
tiêu đề email
(EXTRA_SUBJECT
), v.v.
Lưu ý: Một số ứng dụng email, chẳng hạn như Gmail, dự kiến có
String[]
cho các ứng dụng khác như
EXTRA_EMAIL
và EXTRA_CC
. Sử dụng
putExtra(String, String[])
để thêm những thông tin này vào ý định của bạn.
Gửi nội dung nhị phân
Chia sẻ dữ liệu nhị phân bằng thao tác ACTION_SEND
.
Đặt loại MIME thích hợp và đặt một URI vào dữ liệu trong phần bổ sung
EXTRA_STREAM
, với tư cách
như trong ví dụ sau.
Tệp này thường dùng để chia sẻ hình ảnh nhưng cũng có thể dùng để chia sẻ bất kỳ loại nội dung nhị phân nào.
Kotlin
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Java
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
Ứng dụng nhận cần có quyền truy cập vào dữ liệu trong Uri
trỏ đến. Bạn nên áp dụng 2 cách sau đây:
- Lưu trữ dữ liệu trong
ContentProvider
của riêng bạn, đảm bảo rằng ứng dụng có quyền thích hợp để truy cập vào nhà cung cấp của bạn. Cơ chế ưu tiên để cung cấp là sử dụng quyền theo mỗi URI, tức là tạm thời và chỉ cấp quyền truy cập cho ứng dụng nhận. Một cách dễ dàng để tạoContentProvider
như thế này là để sử dụng Lớp trợ giúpFileProvider
. - Sử dụng hệ thống
MediaStore
.MediaStore
chủ yếu dành cho loại MIME video, âm thanh và hình ảnh. Tuy nhiên, bắt đầu với Android 3.0 (API cấp 11), nhưng công cụ này cũng có thể lưu trữ các loại nội dung không phải nội dung nghe nhìn. Để biết thêm thông tin, hãy xemMediaStore.Files
. Bạn có thể chèn tệp vàoMediaStore
bằngscanFile()
, sau đó mộtUri
kiểucontent://
phù hợp để chia sẻ sẽ được chuyển đếnonScanCompleted()
. Lưu ý rằng sau khi được thêm vào hệ thốngMediaStore
, nội dung có thể truy cập được bất kỳ ứng dụng nào trên thiết bị.
Sử dụng đúng loại MIME
Cung cấp loại MIME cụ thể nhất hiện có cho dữ liệu mà bạn đang
đang gửi. Ví dụ: sử dụng text/plain
khi chia sẻ văn bản thuần tuý. Sau đây là một vài
các loại MIME phổ biến khi gửi dữ liệu đơn giản trong Android:
Người nhận đăng ký | Người gửi gửi |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Đuôi tệp được hỗ trợ | application/pdf |
Để biết thêm thông tin về loại MIME, hãy xem IANA sổ đăng ký chính thức của các loại nội dung đa phương tiện MIME.
Trang chia sẻ nội dung Android có thể hiển thị bản xem trước nội dung, tuỳ thuộc vào loại MIME được cung cấp. Hơi nhiều tính năng xem trước chỉ dành cho một số loại mã nhận dạng.
Chia sẻ nhiều đoạn nội dung
Để chia sẻ nhiều nội dung, hãy sử dụng ACTION_SEND_MULTIPLE
cùng với danh sách URI trỏ đến nội dung. Loại MIME khác nhau tuỳ theo
kết hợp nội dung bạn đang chia sẻ. Ví dụ: nếu bạn chia sẻ 3 hình ảnh JPEG, bạn hãy sử dụng kiểu
"image/jpg"
. Đối với việc kết hợp nhiều loại hình ảnh, hãy sử dụng "image/*"
để khớp
xử lý mọi loại hình ảnh. Mặc dù có thể kết hợp nhiều loại, nhưng chúng tôi
không khuyến khích điều này, bởi vì
không rõ cho người nhận nội dung dự định gửi. Nếu cần gửi nhiều loại, hãy sử dụng
"*/*"
. Việc phân tích cú pháp tuỳ thuộc vào ứng dụng nhận
và xử lý dữ liệu của bạn. Ví dụ:
Kotlin
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
Java
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, null));
Đảm bảo điểm của các đối tượng Uri
đã cung cấp
vào dữ liệu mà ứng dụng nhận có thể truy cập.
Thêm nội dung đa dạng thức vào bản xem trước văn bản
Kể từ Android 10 (API cấp 29), Trang chia sẻ nội dung Android sẽ hiển thị bản xem trước văn bản đang
đã chia sẻ. Trong một số trường hợp, văn bản được chia sẻ có thể khó hiểu. Hãy cân nhắc việc chia sẻ
URL phức tạp như https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Phong phú hơn
bản xem trước có thể giúp người dùng yên tâm
nội dung đang được chia sẻ.
Nếu đang xem trước văn bản, bạn có thể đặt tiêu đề, hình thu nhỏ hoặc cả hai. Thêm mô tả cho
Intent.EXTRA_TITLE
trước khi gọi Intent.createChooser()
và thêm một
hình thu nhỏ phù hợp bằng ClipData
.
Lưu ý: URI nội dung hình ảnh được cung cấp từ một
FileProvider
, thường qua một <cache-path>
đã định cấu hình.
Để biết thêm thông tin, hãy xem bài viết Chia sẻ tệp. Hãy nhớ cung cấp
Trang chia sẻ nội dung có các quyền phù hợp để đọc mọi hình ảnh mà bạn muốn dùng làm hình thu nhỏ. Để biết thêm thông tin,
xem Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Ví dụ:
Kotlin
val share = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
Bản xem trước sẽ có dạng như sau:
Thêm thao tác tuỳ chỉnh vào trang chia sẻ nội dung
Trên Android 14 (API cấp 34) trở lên, các ứng dụng có thể thêm thao tác tuỳ chỉnh vào Trang chia sẻ nội dung Android.
Các thao tác tuỳ chỉnh sẽ xuất hiện dưới dạng biểu tượng thao tác nhỏ ở đầu Trang chia sẻ nội dung Android, và các ứng dụng
có thể chỉ định bất kỳ Intent
nào dưới dạng hành động được gọi khi người dùng nhấp vào biểu tượng.
Để thêm thao tác tuỳ chỉnh trên Trang chia sẻ nội dung Android, trước tiên, hãy tạo một
ChooserAction
thông qua tính năng
ChooserAction.Builder
Bạn có thể chỉ định PendingIntent
là hành động được gọi khi người dùng nhấp vào biểu tượng. Sáng tạo
một mảng chứa tất cả các thao tác tuỳ chỉnh của bạn và chỉ định thao tác đó là
EXTRA_CHOOSER_CUSTOM_ACTIONS
Intent
phần chia sẻ.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Thêm mục tiêu tuỳ chỉnh
Trang chia sẻ nội dung Android cho phép bạn chỉ định tối đa 2 đối tượng ChooserTarget
được hiển thị trước lối tắt chia sẻ và mục tiêu trình chọn được tải từ ChooserTargetServices
. Bạn cũng có thể
chỉ định tối đa 2 ý định trỏ đến các hoạt động được liệt kê
trước các đề xuất về ứng dụng:
Thêm Intent.EXTRA_CHOOSER_TARGETS
và Intent.EXTRA_INITIAL_INTENTS
vào
Ý định chia sẻ của bạn sau khi gọi điện
Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Java
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
Hãy thận trọng khi sử dụng tính năng này. Mọi Intent
tuỳ chỉnh
và ChooserTarget
mà bạn thêm vào sẽ làm giảm số lượng hệ thống đề xuất. Thông thường, chúng tôi
không nên thêm mục tiêu tuỳ chỉnh. Một ví dụ phổ biến và phù hợp về việc thêm
Intent.EXTRA_INITIAL_INTENTS
sẽ cung cấp thêm những hành động mà người dùng có thể thực hiện đối với nội dung được chia sẻ
nội dung. Ví dụ: người dùng chia sẻ hình ảnh và Intent.EXTRA_INITIAL_INTENTS
được dùng để
hãy cho phép họ gửi một đường liên kết. Một ví dụ phổ biến và phù hợp về việc thêm Intent.EXTRA_CHOOSER_TARGETS
là hiển thị những người hoặc thiết bị phù hợp mà ứng dụng của bạn cung cấp.
Loại trừ các mục tiêu cụ thể theo thành phần
Bạn có thể loại trừ những mục tiêu cụ thể bằng cách cung cấp Intent.EXTRA_EXCLUDE_COMPONENTS
.
Chỉ làm điều này để xóa các mục tiêu mà bạn có quyền kiểm soát. Một trường hợp sử dụng phổ biến là ẩn
mục tiêu chia sẻ của ứng dụng khi người dùng chia sẻ từ bên trong ứng dụng của bạn, vì ý định của họ có khả năng chia sẻ
ra bên ngoài ứng dụng.
Thêm Intent.EXTRA_EXCLUDE_COMPONENTS
vào ý định của bạn sau khi gọi Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Java
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
Xem thông tin về cách chia sẻ
Bạn nên biết thời điểm người dùng chia sẻ và mục tiêu mà họ chọn. Chiến lược phát hành đĩa đơn
Trang chia sẻ nội dung Android giúp bạn nắm được thông tin này bằng cách cung cấp ComponentName
của
nhắm mục tiêu đến người dùng của bạn chọn bằng cách sử dụng IntentSender
.
Trước tiên, hãy tạo PendingIntent
cho BroadcastReceiver
và cung cấp
IntentSender
trong Intent.createChooser()
:
Kotlin
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
Java
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
Nhận lệnh gọi lại trong MyBroadcastReceiver
và tìm
Intent.EXTRA_CHOSEN_COMPONENT
:
Kotlin
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Java
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Thêm thao tác tuỳ chỉnh vào trang chia sẻ nội dung
Trên Android 14 (API cấp 34) trở lên, các ứng dụng có thể thêm thao tác tuỳ chỉnh vào Trang chia sẻ nội dung Android.
Tạo một ChooserAction
thông qua tính năng
ChooserAction.Builder
Bạn có thể chỉ định PendingIntent
là hành động được gọi khi người dùng nhấp vào biểu tượng. Sáng tạo
một mảng chứa tất cả các thao tác tuỳ chỉnh của bạn và chỉ định thao tác đó là
EXTRA_CHOOSER_CUSTOM_ACTIONS
Intent
phần chia sẻ.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
Sử dụng trình phân giải ý định của Android
Bạn nên sử dụng trình phân giải ý định của Android khi gửi dữ liệu đến một ứng dụng khác trong quy trình tác vụ được xác định rõ.
Để sử dụng trình phân giải ý định Android, hãy tạo một ý định và thêm dữ liệu bổ sung như cách bạn gọi
Trang chia sẻ nội dung Android. Tuy nhiên, không gọi
Intent.createChooser()
.
Có nhiều ứng dụng đã cài đặt có bộ lọc trùng khớp
ACTION_SEND
và loại MIME, hệ thống sẽ hiển thị hộp thoại phân định có tên là trình phân giải ý định
cho phép người dùng chọn một mục tiêu để chia sẻ. Nếu một ứng dụng
phù hợp, thì lệnh này sẽ chạy.
Dưới đây là ví dụ về cách sử dụng trình phân giải ý định của Android để gửi văn bản:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
Tìm hiểu thêm
Để biết thêm thông tin về cách gửi dữ liệu, hãy xem Ý định và bộ lọc ý định.