Android 會使用意圖及相關聯的額外功能,讓使用者快速分享資訊,並 輕鬆使用喜愛的應用程式
Android 提供兩種在應用程式之間分享資料的方式:
- Android Sharesheet 主要用於傳送內容,以及/或直接傳送內容至應用程式之外 傳送給其他使用者例如與朋友分享網址。
- Android 意圖解析器最適合用來將資料傳送至 以產生定義好的任務例如從應用程式開啟 PDF,並讓使用者 挑選偏好的觀眾
建構意圖時,您可以指定意圖要執行的動作。
Android 採用「ACTION_SEND
」動作
在活動之間傳送資料
甚至可以跨越處理程序邊界您必須指定
以及資料類型系統會自動找出相容的活動
以便接收資料並向使用者顯示就意圖解析器而言
如果只有一個活動能夠處理意圖,該活動就會立即啟動。
為什麼要使用 Android Sharesheet
我們強烈建議您使用 Android Sharesheet,以維持使用者的一致性 應用程式。請勿顯示應用程式本身的共用目標清單,或自行建立共用目標清單 Sharesheet 變化版本。
Android Sharesheet 可讓使用者與 只要輕觸一下,就能取得相關的應用程式建議。 Sharesheet 可以建議自訂解決方案無法使用的目標,並使用一致的排名方法。 這是因為 Sharesheet 可將應用程式和使用者活動的相關資訊納入考量 提供給系統使用
Android Sharesheet 也為開發人員提供許多實用功能。舉例來說: :
- 查看使用者完成分享的時間和前往目標位置
- 新增自訂
ChooserTarget
和應用程式目標 - 自 Android 10 (API 級別 29) 起,提供 RTF 格式預覽功能
- 排除符合特定元件名稱的目標
使用 Android Sharesheet
針對所有類型的共用,建立意圖,並將動作設為
Intent.ACTION_SEND
。
如要顯示 Android Sharesheet,請呼叫
Intent.createChooser()
,
並傳送 Intent
物件給該函式。
並回傳一個一律顯示 Android Sharesheet 的意圖版本。
傳送文字內容
Android Sharesheet 是最簡單也最直觀的方法,就是從以下位置傳送文字內容: 在不同活動之間進行負載平衡舉例來說,大多數瀏覽器都可以將目前顯示的 顯示為另一個應用程式透過這項功能,當您想與好友分享文章或網站時,此功能非常實用 電子郵件或社交網路。範例如下:
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 類型,並在額外資料中放置資料的 URI
EXTRA_STREAM
,如
如以下範例所示
常用於共用圖片,但也可用於分享任何類型的二進位內容。
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
。 您可以使用以下程式碼將檔案插入MediaStore
scanFile()
, 之後content://
風格Uri
適合用於共用的內容會傳遞至提供的onScanCompleted()
回呼。請注意,一旦將內容新增至系統MediaStore
後,即可供 裝置上的任何應用程式。
使用正確的 MIME 類型
根據您的資料提供最具體的 MIME 類型
傳送。舉例來說,分享純文字時使用 text/plain
。以下是一些
在 Android 中傳送簡易資料時常見的 MIME 類型:
接收器註冊時間 | 寄件者 |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
支援的副檔名 | application/pdf |
如需進一步瞭解 MIME 類型,請參閱 愛荷華州 MIME 媒體類型的官方註冊資料庫
視提供的 MIME 類型而定,Android Sharesheet 可能會顯示內容預覽畫面。只有部分通知 預覽功能僅適用於特定類型的。
分享多項內容
如要共用多個內容片段,請使用 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
物件點
以便接收應用程式可存取的資料
在文字預覽中加入 RTF 格式內容
從 Android 10 (API 級別 29) 開始,Android Sharesheet 會顯示正在預覽
共用。在某些情況下,分享的文字可能難以理解。建議您與其他人分享
複雜的網址,例如 https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
。內容更豐富
預覽功能可以讓使用者安心知道自己分享的內容。
如果您正在預覽文字,您可以設定標題和/或縮圖圖片。新增說明至
請先Intent.EXTRA_TITLE
,再呼叫 Intent.createChooser()
,並新增
使用 ClipData
建立相關縮圖。
注意:系統會從
FileProvider
,通常來自設定的 <cache-path>
。
詳情請參閱「共用檔案」。請務必為
Sharesheet 具備適當的權限,可以讀取任何你想做為縮圖的圖片。如需更多資訊
請參閱 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));
以下是預覽畫面:
在 Sharesheet 中新增自訂動作
在 Android 14 (API 級別 34) 以上版本中,應用程式可以在 Android Sharesheet 中新增自訂動作。
自訂動作會在 Android Sharesheet 頂端和應用程式頂端顯示為小型動作圖示
可指定任何 Intent
做為點選圖示時所叫用的動作。
如要在 Android Sharesheet 中新增自訂動作,請先建立一個
ChooserAction
同時
ChooserAction.Builder
。
您可以指定 PendingIntent
做為點選圖示時所叫用的動作。創作
包含所有自訂動作的陣列,並將其指定為
EXTRA_CHOOSER_CUSTOM_ACTIONS
股份清單 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);
新增自訂目標
Android Sharesheet 可讓您指定最多兩個 ChooserTarget
物件,
會在共用捷徑和從 ChooserTargetServices
載入的選擇器目標之前顯示。你也可以
指定 (最多兩個) 指向列出的活動的意圖
並在應用程式建議之前:
將 Intent.EXTRA_CHOOSER_TARGETS
和 Intent.EXTRA_INITIAL_INTENTS
新增至
呼叫「先」之後
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);
請謹慎使用此功能。所有自訂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 Sharesheet 可讓您的 ComponentName
取得這項資訊
指定使用者透過IntentSender
選取的選項
首先,為 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); }
在 Sharesheet 中新增自訂動作
在 Android 14 (API 級別 34) 以上版本中,應用程式可以在 Android Sharesheet 中新增自訂動作。
建立 ChooserAction
同時
ChooserAction.Builder
。
您可以指定 PendingIntent
做為點選圖示時所叫用的動作。創作
包含所有自訂動作的陣列,並將其指定為
EXTRA_CHOOSER_CUSTOM_ACTIONS
股份清單 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);
使用 Android 意圖解析器
Android 意圖解析器在定義工作流程中,將資料傳送至其他應用程式時,最適合使用 Android 意圖解析器。
如要使用 Android 意圖解析器,請建立意圖並新增額外項目,做法與呼叫
Android Sharesheet但「不要」呼叫
Intent.createChooser()
。
如已安裝多個符合篩選條件的應用程式
ACTION_SEND
與 MIME 類型,系統會顯示名為「意圖解析器」的消歧對話方塊
讓使用者選擇要共用的目標。單一應用程式
就會執行
以下範例說明如何使用 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);
瞭解詳情
如要進一步瞭解如何傳送資料,請參閱 意圖和意圖篩選器: