注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/sharing/send.html
當你構造了一個intent,你需要制定你的intent將會“ 激活 ”的行為。Andriud定義了一些行為,就像你所料想的一樣,這里面就有 ACTION_SEND 這個行為,它表明了這個intent是將一個數據從一個Activity發送至另一個Activity,甚至這一操作可能會跨進程執行。為了將數據發送中另一個activity,所有你需要做的就是指定這個數據以及它的類型,系統會尋找出于其要求相符合的所有activity,并將它們展現給用戶(如果有多個選擇);或者直接啟動這個activity(只有一個符合的activity)。類似的,你可以將你的activity所能支持的來自其它應用的數據類型在你的清單文件中聲明出來。
在應用之間通過intent發送和接收數據在社交分享內容一塊最為常用。Intent允許同于使用他們最喜愛的應用快速和簡單的分享信息。
Note:
使用 ShareActionProvider 將一個分享行為添加到一個 ActionBar 是最好的方法,這在API Level 14及以上的平臺上可以使用。 ShareActionProvider 將會在課程: Adding an Easy Share Action 中做進一步討論。
?
一). 發送文字內容
最直接和通用的使用 ACTION_SEND 行為的場景是將文本內容從一個activity發送至另一個activity。例如,內置的瀏覽器應用可以將當前頁面的URL以文本形式分享給任何一個應用。這對于將一個文章或者網站通過Email或者社交網站分享給朋友是很有用的。下面就是實現這樣的分享的代碼:
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);
如果有一個安裝的應用,它的intent過濾器能夠匹配
ACTION_SEND
和"
text/plain
"的MIME類型,Android就會執行這個應用;如果不止一個應用能夠符合要求,系統會展示一個單選對話框(即一個應用選擇器),來讓用戶選擇一個應用。如果你為這個Intent調用
Intent.createChooser()
,Android將會
永遠
顯示這個選擇對話框,這有一些優勢:
- 哪怕用戶之前已經選擇了一個默認應用,選擇器仍然會顯示出來。
- 如果沒有匹配的應用,Android會顯示一個系統消息。
- 你可以自定義對話框的標題。
下面是更新優化后的代碼:
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(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));
運行結果如圖1所示。
圖1. 手持設備上選擇器對話框的截圖
另外,你可以為Intent設置一下附加選項(extras):
EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
,
EXTRA_SUBJECT
等。不過,如果接收intent的應用沒有設計成會使用它們,那么什么事情都不會發生。你也可以使用自定義的附加選項,當然只有接收intent的應用笨笨狗狗理解它們才會有效果。一般而言,你會使用被接收intent應用自己定義的附加選項。
Note:
一些Email應用,比如 Gmail ,會期望一個 String[] 的附加選項,比如: EXTRA_EMAIL 和 EXTRA_CC 。你可以使用 putExtra(String, String[]) 來將它們添加至你的intent。
?
二). 發送二進制內容
二進制數據的分享是將 ACTION_SEND 的行為,恰當的MIME類型,數據的URI放置在名為 EXTRA_STREAM 的附加選項中,這三者結合在一起。下面的例子經常被用來分享一個圖片,但也能用來分享二進制類型的數據內容:
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType( "image/jpeg" ); startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
務必記住下面的幾點提示:
- 你可以使用“ */* ”做為MIME類型,這將只會匹配到可以處理通用數據流的activity。
- 接受的應用需要響應的權限來訪問 Uri 指向的數據。推薦的操作方式是這樣的:
- 在你的 ContentProvider 中保存數據,要確保其他應用有正確的權限訪問你的Provider。比較推薦的訪問機制是使用 per-URI permissions ,它是臨時的,并只將訪問權限授權給接收intent的應用。一個簡單的方法是使用 FileProvider 輔助類來創建一個這樣的 ContentProvider 。
- 使用系統的 MediaStore 。 MediaStore 主要針對的是視頻,音頻和圖像的MIME類型,然而從Android 3.0(API Level 11)開始,它也能存儲非多媒體的數據類型(查看: MediaStore.Files 了解更多)。當一個“ content:// ”類型的用來分享的 Uri 被傳遞到 onScanCompleted() 回調函數之后,可以通過使用 scanFile() 將文件插入到 MediaStore 中。注意:一旦內容被添加到系統的 MediaStore ,它將會被設備上任何應用所訪問。
?
三). 發送多組內容
要分享多組內容,使用 ACTION_SEND_MULTIPLE 行為,和一個指向內容的URI的List。MIME的類型根據你要分享的內容而變化。例如,如果你要分享三張JPEG圖片,那么類型仍然是“ image/jpeg ”。如果是各種圖片格式的混合,那么類型就應該是“ image/* ”,它會尋找能夠處理任意 格式 圖片的Activity。僅在你在分享很多種類型的內容時,才應該使用“ */* ”。如之前所述,解析和處理數據的行為就要看接收intent的應用了。下面是一個發送多組內容數據的例子:
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, "Share images to.."));
如之前所述,確保提供的 URIs 所指向的數據是接收intent應用能夠有權限訪問的數據。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
