編寫:kesenhoo - 原文:http://developer.android.com/training/sharing/send.html
在構(gòu)建一個intent時,必須指定這個intent需要觸發(fā)的actions。Android定義了一些actions,比如ACTION_SEND,該action表明該intent用于從一個activity發(fā)送數(shù)據(jù)到另外一個activity的,甚至可以是跨進程之間的數(shù)據(jù)發(fā)送。
為了發(fā)送數(shù)據(jù)到另外一個activity,我們只需要指定數(shù)據(jù)與數(shù)據(jù)的類型,系統(tǒng)會自動識別出能夠兼容接受的這些數(shù)據(jù)的activity。如果這些選擇有多個,則把這些activity顯示給用戶進行選擇;如果只有一個,則立即啟動該Activity。同樣的,我們可以在manifest文件的Activity描述中添加接受的數(shù)據(jù)類型。
在不同的程序之間使用intent收發(fā)數(shù)據(jù)是在社交分享內(nèi)容時最常用的方法。Intent使用戶能夠通過最常用的程序進行快速簡單的分享信息。
注意:為ActionBar添加分享功能的最佳方法是使用ShareActionProvider,其運行與API level 14以上的系統(tǒng)。ShareActionProvider將在第3課中進行詳細介紹。
ACTION_SEND最直接常用的地方是從一個Activity發(fā)送文本內(nèi)容到另外一個Activity。例如,Android內(nèi)置的瀏覽器可以將當(dāng)前顯示頁面的URL作為文本內(nèi)容分享到其他程序。這一功能對于通過郵件或者社交網(wǎng)絡(luò)來分享文章或者網(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è)備上安裝有某個能夠匹配ACTION_SEND且MIME類型為text/plain的程序,則Android系統(tǒng)會立即執(zhí)行它。若有多個匹配的程序,則系統(tǒng)會把他們都給篩選出來,并呈現(xiàn)Dialog給用戶進行選擇。
如果為intent調(diào)用了Intent.createChooser(),那么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));
效果圖如下:
http://wiki.jikexueyuan.com/project/android-training-geek/images/share-text-screenshot.png" alt="share-text-screenshot.png" />
另外,我們可以為intent設(shè)置一些標(biāo)準的附加值,例如:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT等。然而,如果接收程序沒有針對那些做特殊的處理,則不會有對應(yīng)的反應(yīng)。
注意:一些e-mail程序,例如Gmail,對應(yīng)接收的是EXTRA_EMAIL與EXTRA_CC,他們都是String類型的,可以使用putExtra(string,string[])方法來添加至intent中。
分享二進制的數(shù)據(jù)需要結(jié)合設(shè)置特定的MIME類型,需要在
EXTRA_STREAM`里面放置數(shù)據(jù)的URI,下面有個分享圖片的例子,該例子也可以修改用于分享任何類型的二進制數(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)));
請注意以下內(nèi)容:
*/*
這樣的方式來指定MIME類型,但是這僅僅會match到那些能夠處理一般數(shù)據(jù)類型的Activity(即一般的Activity無法詳盡所有的MIME類型)將數(shù)據(jù)存儲在ContentProvider中,確保其他程序有訪問provider的權(quán)限。較好的提供訪問權(quán)限的方法是使用 per-URI permissions,其對接收程序而言是只是暫時擁有該許可權(quán)限。類似于這樣創(chuàng)建ContentProvider的一種簡單的方法是使用FileProvider helper類。
使用MediaStore系統(tǒng)。MediaStore系統(tǒng)主要用于音視頻及圖片的MIME類型。但在Android3.0之后,其也可以用于存儲非多媒體類型。
為了同時分享多種不同類型的內(nèi)容,需要使用ACTION_SEND_MULTIPLE
與指定到那些數(shù)據(jù)的URIs列表。MIME類型會根據(jù)分享的混合內(nèi)容而不同。例如,如果分享3張JPEG的圖片,那么MIME類型仍然是image/jpeg
。如果是不同圖片格式的話,應(yīng)該是用image/*
來匹配那些可以接收任何圖片類型的activity。如果需要分享多種不同類型的數(shù)據(jù),可以使用*/*
來表示MIME。像前面描述的那樣,這取決于那些接收的程序解析并處理我們的數(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.."));
當(dāng)然,請確保指定到數(shù)據(jù)的URIs能夠被接收程序所訪問(添加訪問權(quán)限)。