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