Android給其他App發(fā)送簡(jiǎn)單的數(shù)據(jù)

2018-08-02 18:35 更新

編寫(xiě):kesenhoo - 原文:http://developer.android.com/training/sharing/send.html

在構(gòu)建一個(gè)intent時(shí),必須指定這個(gè)intent需要觸發(fā)的actions。Android定義了一些actions,比如ACTION_SEND,該action表明該intent用于從一個(gè)activity發(fā)送數(shù)據(jù)到另外一個(gè)activity的,甚至可以是跨進(jìn)程之間的數(shù)據(jù)發(fā)送。

為了發(fā)送數(shù)據(jù)到另外一個(gè)activity,我們只需要指定數(shù)據(jù)與數(shù)據(jù)的類型,系統(tǒng)會(huì)自動(dòng)識(shí)別出能夠兼容接受的這些數(shù)據(jù)的activity。如果這些選擇有多個(gè),則把這些activity顯示給用戶進(jìn)行選擇;如果只有一個(gè),則立即啟動(dòng)該Activity。同樣的,我們可以在manifest文件的Activity描述中添加接受的數(shù)據(jù)類型。

在不同的程序之間使用intent收發(fā)數(shù)據(jù)是在社交分享內(nèi)容時(shí)最常用的方法。Intent使用戶能夠通過(guò)最常用的程序進(jìn)行快速簡(jiǎn)單的分享信息。

注意:為ActionBar添加分享功能的最佳方法是使用ShareActionProvider,其運(yùn)行與API level 14以上的系統(tǒng)。ShareActionProvider將在第3課中進(jìn)行詳細(xì)介紹。

分享文本內(nèi)容(Send Text Content)

ACTION_SEND最直接常用的地方是從一個(gè)Activity發(fā)送文本內(nèi)容到另外一個(gè)Activity。例如,Android內(nèi)置的瀏覽器可以將當(dāng)前顯示頁(yè)面的URL作為文本內(nèi)容分享到其他程序。這一功能對(duì)于通過(guò)郵件或者社交網(wǎng)絡(luò)來(lái)分享文章或者網(wǎng)址給好友而言是非常有用的。下面是一段Sample Code:

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);

如果設(shè)備上安裝有某個(gè)能夠匹配ACTION_SEND且MIME類型為text/plain的程序,則Android系統(tǒng)會(huì)立即執(zhí)行它。若有多個(gè)匹配的程序,則系統(tǒng)會(huì)把他們都給篩選出來(lái),并呈現(xiàn)Dialog給用戶進(jìn)行選擇。

如果為intent調(diào)用了Intent.createChooser(),那么Android總是會(huì)顯示可供選擇。這樣有一些好處:

  • 即使用戶之前為這個(gè)intent設(shè)置了默認(rèn)的action,選擇界面還是會(huì)被顯示。
  • 如果沒(méi)有匹配的程序,Android會(huì)顯示系統(tǒng)信息。
  • 我們可以指定選擇界面的標(biāo)題。

下面是更新后的代碼:

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));

效果圖如下:

share-text-screenshot.png

另外,我們可以為intent設(shè)置一些標(biāo)準(zhǔn)的附加值,例如:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT等。然而,如果接收程序沒(méi)有針對(duì)那些做特殊的處理,則不會(huì)有對(duì)應(yīng)的反應(yīng)。

注意:一些e-mail程序,例如Gmail,對(duì)應(yīng)接收的是EXTRA_EMAIL與EXTRA_CC,他們都是String類型的,可以使用putExtra(string,string[])方法來(lái)添加至intent中。

分享二進(jìn)制內(nèi)容(Send Binary Content)

分享二進(jìn)制的數(shù)據(jù)需要結(jié)合設(shè)置特定的MIME類型,需要在EXTRA_STREAM`里面放置數(shù)據(jù)的URI,下面有個(gè)分享圖片的例子,該例子也可以修改用于分享任何類型的二進(jìn)制數(shù)據(jù):

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)));

請(qǐng)注意以下內(nèi)容:

  • 我們可以使用*/*這樣的方式來(lái)指定MIME類型,但是這僅僅會(huì)match到那些能夠處理一般數(shù)據(jù)類型的Activity(即一般的Activity無(wú)法詳盡所有的MIME類型)
  • 接收的程序需要有訪問(wèn)URI資源的權(quán)限。下面有一些方法來(lái)處理這個(gè)問(wèn)題:
    • 將數(shù)據(jù)存儲(chǔ)在ContentProvider中,確保其他程序有訪問(wèn)provider的權(quán)限。較好的提供訪問(wèn)權(quán)限的方法是使用 per-URI permissions,其對(duì)接收程序而言是只是暫時(shí)擁有該許可權(quán)限。類似于這樣創(chuàng)建ContentProvider的一種簡(jiǎn)單的方法是使用FileProvider helper類。
    • 使用MediaStore系統(tǒng)。MediaStore系統(tǒng)主要用于音視頻及圖片的MIME類型。但在Android3.0之后,其也可以用于存儲(chǔ)非多媒體類型。

發(fā)送多塊內(nèi)容(Send Multiple Pieces of Content)

為了同時(shí)分享多種不同類型的內(nèi)容,需要使用ACTION_SEND_MULTIPLE與指定到那些數(shù)據(jù)的URIs列表。MIME類型會(huì)根據(jù)分享的混合內(nèi)容而不同。例如,如果分享3張JPEG的圖片,那么MIME類型仍然是image/jpeg。如果是不同圖片格式的話,應(yīng)該是用image/*來(lái)匹配那些可以接收任何圖片類型的activity。如果需要分享多種不同類型的數(shù)據(jù),可以使用*/*來(lái)表示MIME。像前面描述的那樣,這取決于那些接收的程序解析并處理我們的數(shù)據(jù)。下面是一個(gè)例子:

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.."));

當(dāng)然,請(qǐng)確保指定到數(shù)據(jù)的URIs能夠被接收程序所訪問(wèn)(添加訪問(wèn)權(quán)限)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)