Android sử dụng ý định và các thành phần 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à họ 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:
- Android Sharesheet được thiết kế chủ yếu để gửi nội dung ra bên ngoài ứng dụng của bạn và/hoặc trực tiếp cho một người dùng khác. Ví dụ: chia sẻ một URL với bạn bè.
- Trình phân giải ý định của Android phù hợp nhất để truyền dữ liệu đến giai đoạn tiếp theo của một tác vụ được xác định rõ. Ví dụ: mở một tệp PDF từ ứng dụng của bạn và cho phép người dùng chọn trình xem họ 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 dùng thao tác ACTION_SEND
để gửi dữ liệu từ một hoạt động sang một hoạt động khác, ngay cả khi vượt qua các ranh giới xử lý. Bạn cần chỉ định dữ liệu và loại dữ liệu. Hệ thống sẽ tự động xác định những hoạt động tương thích có thể nhận dữ liệu và hiển thị 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 nên sử dụng Trang chia sẻ nội dung trong Android

Bạn nên sử dụng Trang chia sẻ của Android để tạo sự nhất quán cho người dùng trên các ứng dụng. Đừng hiển thị danh sách mục tiêu chia sẻ của riêng ứng dụng hoặc tạo các biến thể Sharesheet của riêng bạn.
Tờ chia sẻ của 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 có liên quan, tất cả chỉ bằng một lần nhấn. Sharesheet có thể đề xuất cả những mục tiêu không sẵn có cho các giải pháp tuỳ chỉnh và sử dụng một bảng xếp hạng nhất quán. Điều này là do Tờ chia sẻ có thể xem xét thông tin về hoạt động của ứng dụng và người dùng mà chỉ hệ thống mới có.
Tờ chia sẻ của Android cũng có nhiều tính năng hữu ích cho nhà phát triển. Ví dụ: bạn có thể làm như sau:
- Tìm hiểu thời điểm người dùng hoàn tất việc chia sẻ và nơi họ chia sẻ
- Thêm
ChooserTarget
tuỳ chỉnh và 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, bắt đầu từ Android 10 (API cấp 29)
- Loại trừ các 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 trong Android
Đối với tất cả các loại chia sẻ, hãy tạo một ý định và đặt hành động của ý định đó thành Intent.ACTION_SEND
.
Để hiển thị Android Sharesheet, hãy gọi Intent.createChooser()
, truyền vào đó đối tượng Intent
của bạn.
Hàm này trả về một phiên bản của ý định luôn hiển thị Tờ chia sẻ của Android.
Gửi nội dung văn bản
Cách sử dụng đơn giản và phổ biến nhất của Trang chia sẻ 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 trang hiện đang hiển thị 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 bạn muốn chia sẻ một bài viết hoặc trang web với bạn bè qua email hoặc mạng xã hội. Dưới đây là ví dụ về cách thực hiện:
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);
Bạn có thể thêm các phần bổ sung để cung cấp thêm thông tin, 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) mong đợi một String[]
cho các tiện ích bổ sung như EXTRA_EMAIL
và EXTRA_CC
. Sử dụng putExtra(String, String[])
để thêm các 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 cho dữ liệu trong phần bổ sung EXTRA_STREAM
, như minh hoạ trong ví dụ sau.
Thường được dùng để chia sẻ hình ảnh nhưng cũng có thể dùng để chia sẻ mọi loại nội dung nhị phân.
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 mà Uri
trỏ đến. Có 2 cách nên dùng để thực hiện việc này:
- Lưu trữ dữ liệu trong
ContentProvider
của riêng bạn, đảm bảo rằng các ứng dụng khác có quyền truy cập chính xác vào trình cung cấp của bạn. Cơ chế ưu tiên để cấp quyền truy cập là sử dụng quyền theo URI. Đây là quyền 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ạo mộtContentProvider
như thế này là sử dụng lớp trợ giúpFileProvider
. - Sử dụng
MediaStore
của hệ thống.MediaStore
chủ yếu dành cho các loại MIME video, âm thanh và hình ảnh. Tuy nhiên, kể từ Android 3.0 (API cấp 11), nó cũng có thể lưu trữ các loại 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ằng cách sử dụngscanFile()
, sau đó, mộtUri
theo kiểucontent://
phù hợp để chia sẻ sẽ được truyền đến lệnh gọi lạionScanCompleted()
được cung cấp. Xin lưu ý rằng sau khi được thêm vào hệ thốngMediaStore
, mọi ứng dụng trên thiết bị đều có thể truy cập vào nội dung đó.
Sử dụng loại MIME phù hợp
Cung cấp loại MIME cụ thể nhất có sẵn cho dữ liệu mà bạn đang gửi. Ví dụ: sử dụng text/plain
khi chia sẻ văn bản thuần tuý. Dưới đây là một số loại MIME phổ biến khi gửi dữ liệu đơn giản trong Android:
Đầu thu đă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ề các loại MIME, hãy xem sổ đăng ký chính thức của IANA về các loại nội dung nghe nhìn MIME.
Tờ chia sẻ 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. Một số tính năng xem trước chỉ có sẵn cho một số loại nhất định.
Chia sẻ nhiều nội dung
Để chia sẻ nhiều nội dung, hãy dùng thao tác ACTION_SEND_MULTIPLE
cùng với danh sách URI trỏ đến nội dung. Loại MIME sẽ thay đổi tuỳ theo hỗn hợp nội dung mà bạn đang chia sẻ. Ví dụ: nếu chia sẻ 3 hình ảnh JPEG, bạn sẽ dùng loại "image/jpg"
. Đối với nhiều loại hình ảnh, hãy dùng "image/*"
để so khớp một hoạt động xử lý mọi loại hình ảnh. Mặc dù bạn có thể chia sẻ nhiều loại nội dung, nhưng chúng tôi không khuyến khích bạn làm như vậy vì người nhận sẽ không biết bạn muốn gửi loại nội dung nào. Nếu cần gửi nhiều loại, hãy sử dụng "*/*"
. Ứng dụng nhận sẽ phân tích cú pháp 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 các đối tượng Uri
được cung cấp trỏ đến 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), Tờ chia sẻ của Android sẽ cho thấy bản xem trước của văn bản đang được chia sẻ. Trong một số trường hợp, văn bản được chia sẻ có thể khó hiểu. Cân nhắc việc chia sẻ một URL phức tạp như https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. Bản xem trước chi tiết hơn có thể giúp người dùng yên tâm về nội dung đượ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 nội dung mô tả vào Intent.EXTRA_TITLE
trước khi gọi Intent.createChooser()
và thêm hình thu nhỏ có liên quan bằng cách sử dụng ClipData
.
Lưu ý: URI nội dung hình ảnh được cung cấp từ một FileProvider
, thường là từ 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ớ cấp cho Sharesheet các quyền thích 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, hãy 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 có dạng như sau:

Thêm các thao tác tuỳ chỉnh vào trang chia sẻ nội dung

Ảnh chụp màn hình các thao tác tuỳ chỉnh trên Trang chia sẻ nội dung của Android.
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 của Android.
Các thao tác tuỳ chỉnh xuất hiện dưới dạng biểu tượng thao tác nhỏ ở đầu Trang chia sẻ của Android và ứng dụng có thể chỉ định bất kỳ Intent
nào làm thao tác được gọi khi biểu tượng được nhấp vào.
Để thêm các thao tác tuỳ chỉnh vào Trang chia sẻ nội dung trên Android, trước tiên, hãy tạo một ChooserAction
bằng ChooserAction.Builder
.
Bạn có thể chỉ định một PendingIntent
làm thao tác được gọi khi biểu tượng được nhấp vào. 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 mảng đó làm EXTRA_CHOOSER_CUSTOM_ACTIONS
của thao tác chia sẻ Intent
.
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
Tờ chia sẻ Android cho phép bạn chỉ định tối đa 2 đối tượng ChooserTarget
xuất hiện trước các lối tắt chia sẻ và mục tiêu của bộ 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 ứng dụng:

Thêm Intent.EXTRA_CHOOSER_TARGETS
và Intent.EXTRA_INITIAL_INTENTS
vào Intent chia sẻ sau khi gọi 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
và ChooserTarget
tuỳ chỉnh mà bạn thêm sẽ làm giảm số lượng mà hệ thống đề xuất. Chúng tôi thường không khuyến khích bạn thêm mục tiêu tuỳ chỉnh. Một ví dụ thích hợp thường thấy về việc thêm Intent.EXTRA_INITIAL_INTENTS
là cung cấp các thao tác bổ sung mà người dùng có thể thực hiện trên nội dung được chia sẻ. Ví dụ: người dùng chia sẻ hình ảnh và Intent.EXTRA_INITIAL_INTENTS
được dùng để cho phép họ gửi đường liên kết thay thế. Một ví dụ thường gặp và phù hợp về việc thêm Intent.EXTRA_CHOOSER_TARGETS
là hiển thị những người dùng hoặc thiết bị có liên quan 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ừ các mục tiêu cụ thể bằng cách cung cấp Intent.EXTRA_EXCLUDE_COMPONENTS
.
Chỉ thực hiện thao tác này để xoá những 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 các 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ì họ có thể muốn chia sẻ bên ngoài ứng dụng của bạn.
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);
Nhận thông tin về việc 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. Android Sharesheet cho phép bạn lấy thông tin này bằng cách cung cấp ComponentName
của các mục tiêu mà người dùng chọn bằng IntentSender
.
Trước tiên, hãy tạo một PendingIntent
cho BroadcastReceiver
và cung cấp IntentSender
của BroadcastReceiver
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 trong 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 các 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 của Android.
Tạo một ChooserAction
bằng ChooserAction.Builder
.
Bạn có thể chỉ định một PendingIntent
làm thao tác được gọi khi biểu tượng được nhấp vào. 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 mảng đó làm EXTRA_CHOOSER_CUSTOM_ACTIONS
của thao tác chia sẻ Intent
.
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

Ảnh chụp màn hình của trình phân giải ý định ACTION_SEND
.
Bạn nên 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 của Android, hãy tạo một ý định và thêm các phần bổ sung như khi bạn gọi Trang chia sẻ nội dung trong Android. Tuy nhiên, đừng gọi Intent.createChooser()
.
Nếu có nhiều ứng dụng đã cài đặt có bộ lọc khớp với ACTION_SEND
và loại MIME, hệ thống sẽ hiển thị một hộp thoại phân định gọi 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 có một ứng dụng trùng khớp, ứng dụng đó 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 phần Ý định và bộ lọc ý định.