前言
~
現(xiàn)在的社會化分享大多是使用的第三方的分享盏道,例如友盟,ShareSDK等等吐句,當(dāng)然也用使用微信,qq等官方的SDK分享店读。不過最近在項目中嗦枢,要求使用安卓系統(tǒng)自帶的分享來實現(xiàn),于是就有了這篇文章屯断。這篇文章將會告訴你文虏。
- 原生分享的優(yōu)劣
- 如何進(jìn)行原生分享
- 對原生分享的分享項進(jìn)行篩選
1.原生分享的優(yōu)劣
~
分享類型 | 優(yōu)勢 | 劣勢 |
---|---|---|
原生分享 | 1.簡單粗暴,輕松實現(xiàn)分享功能 | 1.系統(tǒng)會調(diào)出手機(jī)中所有具有分享的功能的App |
2.沒有多余的架包和依賴庫 | 2.界面風(fēng)格不統(tǒng)一跟隨系統(tǒng)的版本 | |
3.無需申請繁瑣的AppKey | 3.如果沒有安裝需要分享的指定APP殖演,則無法分享 | |
第三方SDK | 1.可以統(tǒng)一分享的界面風(fēng)格 | 1.需要添加大量依賴庫和架包 |
2.支持網(wǎng)頁分享和App直接分享 | 2.需要申請繁瑣的AppKey | |
3.分享的類型比較多氧秘,封裝了分享內(nèi)容的樣式 | 3.經(jīng)常更新版本,兼容性和穩(wěn)定性不好 |
2.如何進(jìn)行原生分享
~
如下代碼趴久,代碼原作者:liuyazhuang 原地址
Intent share_intent = new Intent();
share_intent.setAction(Intent.ACTION_SEND);//設(shè)置分享行為
share_intent.setType("text/plain");//設(shè)置分享內(nèi)容的類型
share_intent.putExtra(Intent.EXTRA_SUBJECT, contentTitle);//添加分享內(nèi)容標(biāo)題
share_intent.putExtra(Intent.EXTRA_TEXT, content);//添加分享內(nèi)容
//創(chuàng)建分享的Dialog
share_intent = Intent.createChooser(share_intent, dialogTitle);
activity.startActivity(share_intent);
效果如下:
簡析:這樣我們就很簡單的實現(xiàn)了分享功能丸相,確實比第三方的簡單很多,不過需要你的手機(jī)安裝了應(yīng)用才可以分享,即只有支持ACTION_SEND的Activity才會被列入可選列表彼棍,其實這樣也很合理灭忠,用戶都不常用某個app你還要去分享,這有點不合理了座硕。不過從推廣的角度來說就是要提高你應(yīng)用的知名度和使用率弛作,所以原生分享對于App的推廣來說有局限性。原生分享適用于只需要具有分享功能的App即可(沒有網(wǎng)頁分享)华匾。
3.對原生分享的分享項進(jìn)行篩選
~
上面我們只是簡單的實現(xiàn)了這個功能缆蝉,實際項目中你要這么用,估計會被老板嗯在地上一頓痛毆。直接調(diào)用的缺點:
- 分享項實在太多了刊头,有些根本就不需要
- 一個應(yīng)用有好幾個分享黍瞧,我只需要一個就行了
接下來我就用微信分享來舉個例子:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
// 查詢所有可以分享的Activity
List<ResolveInfo> resInfo = MainActivity.this.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
if (!resInfo.isEmpty()) {
List<Intent> targetedShareIntents = new ArrayList<Intent>();
for (ResolveInfo info : resInfo) {
Intent targeted = new Intent(Intent.ACTION_SEND);
targeted.setType("text/plain");
ActivityInfo activityInfo = info.activityInfo;
Log.v("logcat", "packageName=" + activityInfo.packageName + "Name=" + activityInfo.name);
// 分享出去的內(nèi)容
targeted.putExtra(Intent.EXTRA_TEXT, "這是我的分享內(nèi)容" + getPackageName());
// 分享出去的標(biāo)題
targeted.putExtra(Intent.EXTRA_SUBJECT, "主題");
targeted.setPackage(activityInfo.packageName);
targeted.setClassName(activityInfo.packageName, info.activityInfo.name);
PackageManager pm = MainActivity.this.getApplication().getPackageManager();
// 微信有2個怎么區(qū)分-。- 朋友圈還有微信
if (info.activityInfo.applicationInfo.loadLabel(pm).toString().equals("微信")) {
targetedShareIntents.add(targeted);
}
}
// 選擇分享時的標(biāo)題
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "選擇分享");
if (chooserIntent == null) {
return;
}
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[] {}));
try {
startActivity(chooserIntent);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "找不到該分享應(yīng)用組件", Toast.LENGTH_SHORT).show();
}}
效果如下:
簡析:基本原理是先找到存儲所有可以分享的App信息的鏈表原杂,即List<ResolveInfo>印颤,然后根據(jù)應(yīng)用的包名進(jìn)行篩選
info.activityInfo.applicationInfo.loadLabel(pm).toString().equals("微信")
可是新的問題來了,有個微信朋友圈和微信穿肄,又該如何篩選呢年局?
~
上面我們已經(jīng)知道了只有支持ACTION_SEND的Activity才會被列入可選列表,而這個ResolveInfo正是存儲這類Activity數(shù)據(jù)的咸产,根據(jù)ResolveInfo的Label即可以篩選矢否,于是修改代碼:
if (info.activityInfo.applicationInfo.loadLabel(pm).toString().equals("微信")&& !info.loadLabel(pm).toString().contains("添加到微信收藏")) {
targetedShareIntents.add(targeted);
}
//只是為了顯示效果,如果只有一個可以分享的脑溢,會直接跳轉(zhuǎn)僵朗,沒有Dialog
if (info.activityInfo.applicationInfo.loadLabel(pm).toString().equals("信息")
&& !info.loadLabel(pm).toString().contains("新信息")) {
targetedShareIntents.add(targeted);
效果如下:
簡析:微信中包含了2個ResolveInfo所以我們需要根據(jù)ResolveInfo的label再篩選一次,將“添加到微信收藏”移除
溫馨提示:我們可以先輸出ResolveInfo的Label來獲取名稱
Toast.makeText(getApplicationContext(),info.resolvePackageName.toString(), Toast.LENGTH_LONG).show();
后記
- 根據(jù)應(yīng)用名來篩選的方式有點麻煩屑彻,應(yīng)該可以優(yōu)化
- 注意多語言的適配問題验庙,以及多機(jī)型的適配,比如SMS在三星中稱為“信息”社牲,而在小米中稱為“短信”
- 如果需要定義樣式粪薛,推薦一篇文章或許對你有用Android不一樣的原生分享
- 推薦文章:Android原生分享功能的思考與實現(xiàn)