Android 會使用意圖和相關聯的額外資訊,讓使用者透過喜愛的應用程式快速輕鬆地分享資訊。
Android 提供兩種方式,讓使用者在應用程式之間分享資料:
- Android 分享功能表主要用於將內容傳送至應用程式外部,和/或直接傳送給其他使用者。例如與好友分享網址。
- Android 意圖解析器最適合將資料傳遞至明確定義工作流程的下一個階段。舉例來說,從應用程式開啟 PDF,並讓使用者選擇偏好的檢視器。
建構意圖時,請指定意圖要執行的動作。
Android 會使用動作 ACTION_SEND
將資料從一個活動傳送至另一個活動,即使跨越程序界線也沒問題。您需要指定資料及其類型。系統會自動找出可接收資料的相容活動,並向使用者顯示。如果是意圖解析器,如果只有一個活動可以處理意圖,系統會立即啟動該活動。
使用 Android Sharesheet 的好處

強烈建議您使用 Android 分享功能表,為使用者提供一致的應用程式體驗。請勿顯示應用程式自己的分享目標清單,或建立自己的 Sharesheet 變化版本。
Android 分享功能表可讓使用者透過輕觸一下,將資訊分享給合適的對象,並提供相關應用程式建議。分享表單可以建議自訂解決方案無法使用的目標,並採用一致的排名。 這是因為分享功能表可考量應用程式和使用者活動的相關資訊,但這些資訊只有系統才能存取。
Android 分享功能表也提供許多實用功能,可供開發人員使用。舉例來說,您可以執行下列操作:
- 瞭解使用者何時完成分享,以及分享到哪裡
- 新增自訂
ChooserTarget
和應用程式目標 - 提供 RTF 內容預覽畫面 (Android 10 (API 級別 29) 以上版本)
- 排除符合特定元件名稱的目標
使用 Android Sharesheet
如要分享任何類型的內容,請建立意圖並將動作設為 Intent.ACTION_SEND
。如要顯示 Android 分享畫面,請呼叫 Intent.createChooser()
,並傳遞 Intent
物件。這個方法會傳回一律顯示 Android 分享功能表的意圖版本。
傳送文字內容
Android 分享功能表最直接且常見的用途,就是將文字內容從一個活動傳送至另一個活動。舉例來說,大多數瀏覽器都能將目前顯示的網頁網址以文字形式分享給其他應用程式。這項功能很實用,可透過電子郵件或社群網路與朋友分享文章或網站。以下舉例說明如何進行這項操作:
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);
您可以視需要新增額外項目,加入更多資訊,例如電子郵件收件者 (EXTRA_EMAIL
、EXTRA_CC
、EXTRA_BCC
)、電子郵件主旨 (EXTRA_SUBJECT
) 等。
注意:部分電子郵件應用程式 (例如 Gmail) 會預期有
String[]
,以便提供額外功能,例如
EXTRA_EMAIL
和 EXTRA_CC
。使用 putExtra(String, String[])
將這些項目新增至意圖。
傳送二進位內容
使用 ACTION_SEND
動作共用二進位資料。
設定適當的 MIME 類型,並在額外 EXTRA_STREAM
中放置資料的 URI,如下列範例所示。這項功能通常用於分享圖片,但也可以分享任何類型的二進位內容。
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));
接收應用程式必須具備存取 Uri
所指資料的權限。建議採用下列兩種方式:
- 將資料儲存在您自己的
ContentProvider
中,確保其他應用程式具備存取供應商的正確權限。提供存取權的偏好機制是使用每個 URI 的權限,這類權限是暫時性的,且只會授予接收應用程式存取權。如要輕鬆建立類似這樣的ContentProvider
,可以使用FileProvider
輔助類別。 - 使用系統
MediaStore
。MediaStore
主要用於影片、音訊和圖片 MIME 類型。不過,從 Android 3.0 (API 級別 11) 開始,它也可以儲存非媒體類型。詳情請參閱MediaStore.Files
。檔案可使用scanFile()
插入MediaStore
,之後系統會將適合共用的content://
樣式Uri
傳遞至提供的onScanCompleted()
回呼。請注意,一旦新增至系統MediaStore
,裝置上的任何應用程式都能存取該內容。
使用正確的 MIME 類型
請提供可用的最特定 MIME 類型,以傳送資料。舉例來說,分享純文字時請使用 text/plain
。以下是在 Android 中傳送簡單資料時,幾個常見的 MIME 類型:
接收器註冊 | 寄件者傳送 |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
支援的副檔名 | application/pdf |
如要進一步瞭解 MIME 類型,請參閱 IANA 官方 MIME 媒體類型登錄。
Android 分享功能表可能會根據提供的 MIME 類型顯示內容預覽畫面。部分預覽功能僅適用於特定類型。
分享多個內容
如要分享多個內容,請使用 ACTION_SEND_MULTIPLE
動作,以及指向內容的 URI 清單。MIME 類型會因分享的內容組合而異。舉例來說,如果您分享三張 JPEG 圖片,請使用 "image/jpg"
類型。如要混合使用圖片類型,請使用 "image/*"
比對可處理任何圖片類型的活動。雖然可以分享多種檔案類型,但我們強烈建議不要這麼做,因為接收者無法判斷傳送者想傳送的內容。如果必須傳送多個型別,請使用 "*/*"
。接收應用程式會負責剖析及處理資料。範例如下:
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));
請確認提供的 Uri
物件指向接收應用程式可存取的資料。
在文字預覽中加入豐富內容
自 Android 10 (API 級別 29) 起,Android 分享功能表會顯示要分享文字的預覽畫面。在某些情況下,分享的文字可能難以理解。請考慮分享複雜的網址,例如 https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
。更豐富的預覽畫面可讓使用者放心分享內容。
預覽文字時,你可以設定標題、縮圖或兩者。在呼叫 Intent.createChooser()
之前,請先為 Intent.EXTRA_TITLE
新增說明,並使用 ClipData
新增相關縮圖。
注意:圖片內容 URI 是從 FileProvider
提供,通常是來自已設定的 <cache-path>
。詳情請參閱「共用檔案」。請務必授予「分享功能表」適當權限,允許讀取要用做縮圖的圖片。詳情請參閱 Intent.FLAG_GRANT_READ_URI_PERMISSION
。
範例如下:
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));
預覽畫面如下所示:

在分享選單中新增自訂動作

Android 分享功能表中的自訂動作螢幕截圖。
在 Android 14 (API 級別 34) 以上版本中,應用程式可以將自訂動作新增至 Android Sharesheet。自訂動作會以小型動作圖示的形式顯示在 Android 分享功能表頂端,應用程式可以指定點選圖示時要執行的任何 Intent
。
如要在 Android Sharesheet 中新增自訂動作,請先建立 ChooserAction
ChooserAction.Builder
。
您可以指定 PendingIntent
,做為點選圖示時叫用的動作。建立包含所有自訂動作的陣列,並指定為分享 Intent
的 EXTRA_CHOOSER_CUSTOM_ACTIONS
。
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);
新增自訂目標
Android 分享功能表最多可指定兩個 ChooserTarget
物件,這些物件會顯示在分享捷徑和從 ChooserTargetServices
載入的選擇器目標之前。您也可以指定最多兩個意圖,指向應用程式建議前列出的活動:

在呼叫 Intent.createChooser()
後,將 Intent.EXTRA_CHOOSER_TARGETS
和 Intent.EXTRA_INITIAL_INTENTS
新增至分享 Intent:
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);
請謹慎使用這項功能。您新增的每個自訂 Intent
和 ChooserTarget
都會減少系統建議的數量。一般來說,我們不建議新增自訂目標。新增 Intent.EXTRA_INITIAL_INTENTS
的常見適當範例是提供額外動作,讓使用者對共用內容採取行動。舉例來說,使用者分享圖片時,系統會使用 Intent.EXTRA_INITIAL_INTENTS
讓他們改為傳送連結。新增 Intent.EXTRA_CHOOSER_TARGETS
的常見適當範例是顯示應用程式提供的相關人員或裝置。
依元件排除特定目標
您可以提供 Intent.EXTRA_EXCLUDE_COMPONENTS
,排除特定目標。請只移除您有權控管的目標。常見的用途是在使用者從應用程式內分享內容時,隱藏應用程式的分享目標,因為他們可能想分享到應用程式外。
呼叫 Intent.createChooser()
後,將 Intent.EXTRA_EXCLUDE_COMPONENTS
新增至意圖:
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);
取得分享資訊
瞭解使用者分享內容的時間和選取的目標,有助於掌握情況。Android 分享功能表可讓您透過使用者使用 IntentSender
選取目標時提供的 ComponentName
取得這項資訊。
首先,請為 BroadcastReceiver
建立 PendingIntent
,並在 Intent.createChooser()
中提供其 IntentSender
:
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());
在 MyBroadcastReceiver
中接收回呼,並查看 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); }
在分享選單中新增自訂動作
在 Android 14 (API 級別 34) 以上版本中,應用程式可以將自訂動作新增至 Android Sharesheet。使用 ChooserAction.Builder
建立 ChooserAction
。您可以指定 PendingIntent
,做為點選圖示時叫用的動作。建立包含所有自訂動作的陣列,並指定為分享 Intent
的 EXTRA_CHOOSER_CUSTOM_ACTIONS
。
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);
使用 Android 意圖解析器

ACTION_SEND
意圖解析器的螢幕截圖。
將資料傳送至其他應用程式時,最好使用 Android 意圖解析器,做為明確定義的工作流程的一部分。
如要使用 Android Intent 解析器,請建立意圖並新增額外資訊,就像呼叫 Android Sharesheet 一樣。不過,請勿呼叫 Intent.createChooser()
。
如果已安裝多個應用程式,且這些應用程式的篩選器與 MIME 類型相符,系統會顯示稱為「意圖解析器」的消歧對話方塊,讓使用者選擇要分享的目標。ACTION_SEND
如果只有一個應用程式符合條件,系統就會執行該應用程式。
以下範例說明如何使用 Android 意圖解析器傳送文字:
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);
瞭解詳情
如要進一步瞭解如何傳送資料,請參閱「意圖和意圖篩選器」。