現(xiàn)在用的比較多的都是三方的分享俩莽,其實(shí)安卓自帶的就有簡單的分享缓溅。
在構(gòu)建Intent時,可以指定這個Intent需要觸發(fā)的actions缤苫。比如ACTION_SEND,該action表明該intent用于從一個activity發(fā)送數(shù)據(jù)到另外一個activity的墅拭,甚至可以跨進(jìn)程之間的數(shù)據(jù)發(fā)送活玲。系統(tǒng)會自動識別出能夠兼容接受的這些數(shù)據(jù)的activity。如果這些選擇有多個谍婉,則把這些activity顯示給用戶進(jìn)行選擇舒憾;如果只有一個,則立即啟動該Activity穗熬。
分享數(shù)據(jù)
分享簡單的數(shù)據(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(sendIntent);
在不同的程序之間使用intent收發(fā)數(shù)據(jù)是在社交分享內(nèi)容時最常用的方法镀迂。
若有多個匹配的程序,則系統(tǒng)會把他們都給篩選出來唤蔗,并呈現(xiàn)Dialog給用戶進(jìn)行選擇探遵。
如果設(shè)備上安裝有某個能夠匹配ACTION_SEND且MIME類型為text/plain的程序,則Android系統(tǒng)會立即執(zhí)行它妓柜。
不過為intent調(diào)用了Intent.createChooser(),那么Android總是會顯示可供選擇:
startActivity(Intent.createChooser(sendIntent,getResources().getText(R.string.send_to)));
看下顯示效果:
分享圖片
如果想要分享圖片不是文字的話箱季,首先得將setType設(shè)置成“image/jpeg”,如果不確定圖片類型直接使用"image/*棍掐,同時數(shù)據(jù)需要結(jié)合設(shè)置特定的MIME類型藏雏,EXTRA_STREAM里面放置數(shù)據(jù)的URI。
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, mCroppedImageFile.getPath());
sendIntent.setType("image/");
startActivity(Intent.createChooser(sendIntent, "分享"));
分享多種類型數(shù)據(jù)
如果分享3張JPEG的圖片作煌,那么MIME類型仍然是image/jpeg掘殴。如果是不同圖片格式的話赚瘦,應(yīng)該是用image/來匹配那些可以接收任何圖片類型的activity。如果需要分享多種不同類型的數(shù)據(jù)奏寨,可以使用/*來表示MIME起意。
- 一次分享多張圖片
ArrayList<Uri> imageUris = new ArrayList<>();
imageUris.add(Uri.fromFile(mCroppedImageFile));
imageUris.add(Uri.fromFile(mCroppedImageFile));
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
sendIntent.putExtra(Intent.EXTRA_STREAM, imageUris);
sendIntent.setType("image/*");
startActivity(Intent.createChooser(sendIntent, "分享"));
可以看到同時分發(fā)了2張圖片:
接收從其他App傳送來的數(shù)據(jù)
讓自己的app可以接受數(shù)據(jù)
Intent filters告訴Android系統(tǒng)一個程序愿意接受的數(shù)據(jù)類型。
<activity
android:name=".MainActivity"
android:theme="@style/CustomActionBarTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
上面將當(dāng)前app的MainActivity可以接受文字服爷。然后我們用另外一個app來分享文字:
上圖中的TraningApp就是我自己定義能接受文字分享的app
處理接受到的數(shù)據(jù)
為了處理從Intent帶來的數(shù)據(jù)杜恰,可以通過調(diào)用getIntent()方法來獲取到Intent對象。拿到這個對象后仍源,我們可以對其中面的數(shù)據(jù)進(jìn)行判斷心褐,從而決定下一步行為。
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
if (Intent.ACTION_SEND.equals(action)){
if ("text/plain".equals(type)){
Log.e(TAG, "ACTION_SEND:"+intent.getStringExtra(Intent.EXTRA_TEXT) );
}
}
然后發(fā)送消息:
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "測試文字");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, "分享"));
查看log日志:
07-26 12:32:51.315 9746-9746/com.example.frc.trainingapp E/MainActivity: ACTION_SEND:測試文字
同樣我們可以添加圖片的處理:
if (Intent.ACTION_SEND.equals(action)) {
if ("text/plain".equals(type)) {
Log.e(TAG, "ACTION_SEND:" + intent.getStringExtra(Intent.EXTRA_TEXT));
} else if ("image/*".equals(type)) {
Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
Log.e(TAG, "ACTION_SEND_URI:"+uri.toString());
}
}
查看Log日志:
07-26 14:09:37.135 30944-30944/com.yanxiu.yxsanke_android E/SK::: /storage/emulated/0/YXSanKe_Android/res/nnnn.jpg
note:需要注意的是處理發(fā)送過來的數(shù)據(jù)可能會是耗時操作笼踩,建議不要在UI線程進(jìn)行