Android官方开发文档Training系列课程中文版:分享简单数据之发送简单数据给其它APP
原文地址:http://android.xsoftlab.net/training/building-content-sharing.html
引言
Android應(yīng)用程序有一項(xiàng)偉大的事情就是它們有可以與其它應(yīng)用程序交流及整合。為什么不重新使用已經(jīng)存在于其它APP中的非核心功能呢?
這節(jié)課覆蓋了一些共同的方式,你可以使用這些方式在兩個(gè)程序之間使用IntentAPI以及ActionProvider對(duì)象發(fā)送和接收一些簡(jiǎn)單的數(shù)據(jù)。
發(fā)送簡(jiǎn)單的數(shù)據(jù)給其它APP
當(dāng)在構(gòu)造Intent時(shí),必須指定intent要觸發(fā)的功能。Android定義了包括ACTION_SEND在內(nèi)的若干功能。你可以猜到,ACTION_SEND表明這個(gè)intent可以發(fā)送數(shù)據(jù)從一個(gè)activity到另一個(gè)activity,甚至是跨進(jìn)程。如果要發(fā)送數(shù)據(jù)到另一個(gè)activity,你需要做的就是指定數(shù)據(jù)與類型,系統(tǒng)會(huì)識(shí)別適合接收的activity列表并展示給用戶選擇,如果有多個(gè)的話,或者立即啟動(dòng)activity。相似的,你可以公布你的activity支持接收的數(shù)據(jù)類型。
在兩個(gè)應(yīng)用之間發(fā)送接收數(shù)據(jù)在社會(huì)化分享中非常常見(jiàn)。Intent使用戶可以更快捷更方便的使用他們喜歡的應(yīng)用分享信息。
Note:在ActionBar上添加分享按鈕的最好方式是使用ShareActionProvider,ShareActionProvider從API 14開(kāi)始可用。我們會(huì)在課程Adding an Easy Share Action中討論ShareActionProvider。
發(fā)送文本內(nèi)容
上圖:在手持設(shè)備上ACTION_SEND意圖選擇器的對(duì)話框。
ACTION_SEND的大多數(shù)功能是發(fā)送文本從一個(gè)activity到另一個(gè)activity。舉個(gè)例子,系統(tǒng)內(nèi)置的瀏覽器可以將當(dāng)前頁(yè)面的URL作為文本分享給任何程序。這對(duì)通過(guò)email或者社交網(wǎng)絡(luò)分享一篇文章或者一個(gè)網(wǎng)站給朋友來(lái)說(shuō)是非常有用的。這里的代碼實(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);如果有應(yīng)用程序的過(guò)濾器可以匹配到ACTION_SEND以及MIME類型text/plain,那么Android系統(tǒng)會(huì)運(yùn)行它;如果有多個(gè)應(yīng)用程序匹配到,系統(tǒng)會(huì)展示一個(gè)選擇對(duì)話框,來(lái)允許用戶選在一個(gè)APP。
然而,如果你調(diào)用的是Intent.createChooser(),那么它返回的Intent版本將總是會(huì)展示一個(gè)選擇器對(duì)話框。這里是它的一些優(yōu)勢(shì):
- 雖然用戶原先已經(jīng)選擇過(guò)這個(gè)Intent的默認(rèn)應(yīng)用,但是對(duì)話框還是需要每次都出現(xiàn)。
- 如果沒(méi)有程序匹配到,那么Android系統(tǒng)會(huì)展示一條系統(tǒng)消息。
- 你可以指定選擇對(duì)話框的標(biāo)題。
這里升級(jí)后的代碼:
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)));它的結(jié)果會(huì)向上圖顯示的那樣。
你可以給Intent設(shè)置一些附加標(biāo)準(zhǔn):EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT。如果接收的應(yīng)用程序不是被設(shè)計(jì)為使用它們的話,程序會(huì)忽略這些附加標(biāo)準(zhǔn)。
Note:一些e-mail的應(yīng)用程序,比如Gmail,會(huì)期望接收附加的字符串?dāng)?shù)組,類似EXTRA_EMAIL和EXTRA_CC,使用putExtra(String, String[])方法來(lái)將這些信息添加到Intent。
發(fā)送二進(jìn)制內(nèi)容
分享二進(jìn)制內(nèi)容需要通過(guò)ACTION_SEND行為結(jié)合合適的MIME類型然后將數(shù)據(jù)放入到URI以 EXTRA_STREAM命名的附加值中。下面是分享一張圖片的例子,不過(guò),它適用于分享任何類型的二進(jìn)制內(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)));注意以下事項(xiàng):
- 你可以使用”*/*”的MIME類型,但是這只是會(huì)匹配有能力處理通用數(shù)據(jù)流的Activity。
- 匹配到的應(yīng)用程序需要有權(quán)限來(lái)訪問(wèn)Uri所指向的資源。下面是推薦的方式:
- 將數(shù)據(jù)存儲(chǔ)到你自己的ContentProvider中,確保其他APP有正確的權(quán)限訪問(wèn)你的提供者。提供訪問(wèn)的首選機(jī)制是使用per-URI permissions,它是一個(gè)臨時(shí)的只授權(quán)接收到的應(yīng)用程序訪問(wèn)的權(quán)限。可以像使用FileProvider幫助類那樣簡(jiǎn)單的創(chuàng)建一個(gè)ContentProvider。
- 使用系統(tǒng)的MediaStore,MediaStore會(huì)首先瞄準(zhǔn)視頻,音頻,以及圖像MIME類型,然而從Android 3.0之后,它還可以存儲(chǔ)非媒體類型。文件可以通過(guò)scanFile()被插入到MediaStore之后,scanFile()所提供的onScanCompleted()回調(diào)方法會(huì)傳遞一個(gè)適用于分享的content://風(fēng)格的Uri。注意,一旦將內(nèi)容被添加到MediaStore中,那么設(shè)備上的任何APP都可以訪問(wèn)它。
發(fā)送多個(gè)內(nèi)容片段
如果要分享內(nèi)容的多個(gè)片段的話,使用ACTION_SEND_MULTIPLE行為可以將Uri分別指向的內(nèi)容整合成為一個(gè)列表。MIME類型取決于你分享的內(nèi)容。舉個(gè)例子,如果要分享3張JPEG圖片,使用的類型仍然是”image/jpeg”。如果混合了多個(gè)類型的話,應(yīng)該使用”image/*”來(lái)匹配一個(gè)可以處理任何類型的Activity。如果你分享出一個(gè)類型很多樣的內(nèi)容的話,你應(yīng)該使用”*/*”。就像原先陳述的,這取決于接收的應(yīng)用程序解析并處理你的數(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.."));和以前需要注意的一樣,請(qǐng)確保提供的URI所指向的數(shù)據(jù),那些接收的應(yīng)用程序可以訪問(wèn)。
總結(jié)
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:分享简单数据之发送简单数据给其它APP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实时事理学习与搜索平台DemoV1.0正
- 下一篇: Android中动态的更改selecto