Android - 分享內容 - 給其他APP發送內容


創建一個intent時,必須要指定intent將要觸發的操作。Android定義了很多操作,包括ACTION_SEND,就象可以猜到的一樣,表示intent是把數據從一個activity發送給另一個,就算是跨界。要發送數據給其他activity,值需要指定數據和它的類型,系統會識別可兼容的接收activity然后展示給用戶(如果有多個選擇)或者立刻啟動activity(如果只有一個選擇)。相似的,也可以通過在manifest中設置來注冊你的activity可以接收其他程序的哪些數據類型。

用intent在程序之間發送和接收數據是最常用的社會化分享。Intent讓用戶可以快速的分享信息並且容易的使用他們喜歡的程序。

注意:最好的添加分享操作到Actionbar的方法是使用ShareActionProvider,在API等級14之后可用。ShareActionProvider會在后面討論。

發送字符串內容

使用ACTION_SEND時最常用和簡單的操作是發送字符串內容從一個activity到另一個。例如,內置的瀏覽器app可以以字符串的形式分享當前顯示網頁的URL給任何程序。這對於通過郵件和社交網絡和朋友分享文章或網頁時很有用。這里有一些代碼實現了這種分享:

1 Intent sendIntent = new Intent();
2 sendIntent.setAction(Intent.ACTION_SEND);
3 sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
4 sendIntent.setType("text/plain");
5 startActivity(sendIntent);

如果有一個程序匹配ACTION_SEND和MIME類型text/plain,Android系統會運行它。如果超過一個程序匹配,系統會顯示一個對話框讓用戶選一個app。如果為intent調用Intent.createChooser(),Android會總是顯示選擇對話框。這有一些好處:

  • 就算用戶選擇了這個intent的默認操作,選擇對話框仍然會顯示。
  • 如果沒有匹配的程序,Android會顯示系統消息
  • 可以為選擇對話框指定一個標題

這里是更新后的代碼:

1 Intent sendIntent = new Intent();
2 sendIntent.setAction(Intent.ACTION_SEND);
3 sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
4 sendIntent.setType("text/plain");
5 startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

結果對話框如圖1

 圖1.手機上的ACTION_SEND intent截屏

也可以為intent設置一些其他的信息:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT。然而,如果接收的程序沒有打算用他們,什么都不會發生。也可以自定義extras,但是沒有任何影響除非接收程序能解析他們。最典型的是,使用接收程序自定義的extras。

注意:一些email程序,比如Gmail,期望獲得String[]類型的EXTRA_EMAIL,EXTRA_CC等,使用putExtra(string, string[])來把他們加入intent。

發送二進制內容

二進制數據是使用ACTION_SEND並且設置合適的MIME類型並且在附件數據中的EXTRA_STREAM中放一個指向數據的URI來分享的。這個通常用來分享圖片,但是也可以用來分享任何類型的二進制內容:

1 Intent shareIntent = new Intent();
2 shareIntent.setAction(Intent.ACTION_SEND);
3 shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
4 shareIntent.setType("image/jpeg");
5 startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

注意下面的內容:

  • 可以設置MIME類型為"*/*",但是這樣會匹配到很多可以處理數據流的app。
  • 接收的程序需要進入URI指向的數據的權限。有一些方法可以處理:
    • 把數據寫到外部存儲上(比如SD卡),那樣的話所有app都可以讀。使用Uri.fromFile()來創建傳遞給share intent 的URI。然后,注意並不是所有的程序都能處理file://形式的Uri。
    • 在自己程序文件夾下用MODE_WORKD_READABLE模式使用openFileOutput()把數據寫入文件,之后再用getFileStreamPath()返回一個File。和前面的差不多,用Uri.fromFile()來為share intent創建一個file://樣式的Uri。
    • 象圖片,音頻,視頻這樣的媒體文件可以用scanFile()掃描然后加到系統媒體庫(MediaStore)中,onScanCompleted()回調方法會返回一個content://樣式的Uri,也可以加到share intent中
    • 圖片可以用insertImage()來加到媒體庫(MediaStore)中,然后會返回一個content://樣式的Uri,可以再share intent中使用。
    • 在自己的ContentProvider中保存數據,要確保其他的app有正確的權限來訪問你的provider(或者使用per-URI permissions)。

發送多條數據

要發送多條數據,使用ACTION_SNED_MULTIPLE和一個指向數據的URI list。MIME類型根據分享的內容不同而不同。例如,如果分享3張JPEG圖片,那么類型為"image/jpeg"。如果有不同的圖片類型,那么就應該用"image/*"來匹配處理不同類型圖片的activity。如果要處理各種不同的類型就應該用"*/*"了。正如前面提到的,分析和處理分享是數據是接收程序的事情了。這里是一個例子:

1 ArrayList<Uri> imageUris = new ArrayList<Uri>();
2 imageUris.add(imageUri1); // Add your image URIs here
3 imageUris.add(imageUri2);
4 
5 Intent shareIntent = new Intent();
6 shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
7 shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
8 shareIntent.setType("image/*");
9 startActivity(Intent.createChooser(shareIntent, "Share images to.."));

正如前面提到的,要確保URI指向的數據要可以被接收程序訪問到。

 

上一篇:Android - 分享內容

下一篇:Android - 分享內容 - 接收其他APP的內容

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM