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

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