package cn.sharesdk.onekeyshare;
import static cn.sharesdk.framework.utils.BitmapHelper.captureView;
import static cn.sharesdk.framework.utils.R.getStringRes;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler.Callback;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import cn.sharesdk.framework.CustomPlatform;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.framework.utils.UIHandler;
/**
* 快捷分享的入口
*
* 通過不同的setter設置參數,然後調用{@link #show(Context)}方法啟動快捷分享
*/
public class OnekeyShare implements PlatformActionListener, Callback {
private static final int MSG_TOAST = 1;
private static final int MSG_ACTION_CCALLBACK = 2;
private static final int MSG_CANCEL_NOTIFY = 3;
private HashMap<string> shareParamsMap;/<string>
private ArrayList<customerlogo> customers;/<customerlogo>
private boolean silent;
private PlatformActionListener callback;
private ShareContentCustomizeCallback customizeCallback;
private boolean dialogMode = false;
private boolean disableSSO;
private HashMap<string> hiddenPlatforms;/<string>
private View bgView;
private OnekeyShareTheme theme;
private Context context;
private PlatformListFakeActivity.OnShareButtonClickListener onShareButtonClickListener;
public OnekeyShare() {
shareParamsMap = new HashMap<string>();/<string>
customers = new ArrayList<customerlogo>();/<customerlogo>
callback = this;
hiddenPlatforms = new HashMap<string>();/<string>
}
public void show(Context context) {
ShareSDK.initSDK(context);
this.context = context;
// 打開分享菜單的統計
ShareSDK.logDemoEvent(1, null);
// 顯示方式是由platform和silent兩個字段控制的
// 如果platform設置了,則無須顯示九宮格,否則都會顯示;
// 如果silent為true,表示不進入編輯頁面,否則會進入。
// 本類只判斷platform,因為九宮格顯示以後,事件交給PlatformGridView控制
// 當platform和silent都為true,則直接進入分享;
// 當platform設置了,但是silent為false,則判斷是否是“使用客戶端分享”的平臺,
// 若為“使用客戶端分享”的平臺,則直接分享,否則進入編輯頁面
if (shareParamsMap.containsKey("platform")) {
String name = String.valueOf(shareParamsMap.get("platform"));
Platform platform = ShareSDK.getPlatform(name);
if (silent
|| ShareCore.isUseClientToShare(name)
|| platform instanceof CustomPlatform
) {
HashMap<platform>> shareData/<platform>
= new HashMap<platform>>();/<platform>
shareData.put(ShareSDK.getPlatform(name), shareParamsMap);
share(shareData);
return;
}
}
PlatformListFakeActivity platformListFakeActivity;
try {
if(OnekeyShareTheme.SKYBLUE == theme){
platformListFakeActivity = (PlatformListFakeActivity) Class.forName("cn.sharesdk.onekeyshare.theme.skyblue.PlatformListPage").newInstance();
}else{
platformListFakeActivity = (PlatformListFakeActivity) Class.forName("cn.sharesdk.onekeyshare.theme.classic.PlatformListPage").newInstance();
}
} catch (Exception e) {
e.printStackTrace();
return;
}
platformListFakeActivity.setDialogMode(dialogMode);
platformListFakeActivity.setShareParamsMap(shareParamsMap);
platformListFakeActivity.setSilent(silent);
platformListFakeActivity.setCustomerLogos(customers);
platformListFakeActivity.setBackgroundView(bgView);
platformListFakeActivity.setHiddenPlatforms(hiddenPlatforms);
platformListFakeActivity.setOnShareButtonClickListener(onShareButtonClickListener);
platformListFakeActivity.setThemeShareCallback(new ThemeShareCallback() {
@Override
public void doShare(HashMap<platform>> shareData) {/<platform>
share(shareData);
}
});
if (shareParamsMap.containsKey("platform")) {
String name = String.valueOf(shareParamsMap.get("platform"));
Platform platform = ShareSDK.getPlatform(name);
platformListFakeActivity.showEditPage(context, platform);
return;
}
platformListFakeActivity.show(context, null);
}
public void setTheme(OnekeyShareTheme theme) {
this.theme = theme;
}
/** address是接收人地址,僅在信息和郵件使用,否則可以不提供 */
public void setAddress(String address) {
shareParamsMap.put("address", address);
}
/**
* title標題,在印象筆記、郵箱、信息、微信(包括好友、朋友圈和收藏)、
* 易信(包括好友、朋友圈)、人人網和QQ空間使用,否則可以不提供
*/
public void setTitle(String title) {
shareParamsMap.put("title", title);
}
/** titleUrl是標題的網絡鏈接,僅在人人網和QQ空間使用,否則可以不提供 */
public void setTitleUrl(String titleUrl) {
shareParamsMap.put("titleUrl", titleUrl);
}
/** text是分享文本,所有平臺都需要這個字段 */
public void setText(String text) {
shareParamsMap.put("text", text);
}
/** 獲取text字段的值 */
public String getText() {
return shareParamsMap.containsKey("text") ? String.valueOf(shareParamsMap.get("text")) : null;
}
/** imagePath是本地的圖片路徑,除Linked-In外的所有平臺都支持這個字段 */
public void setImagePath(String imagePath) {
if(!TextUtils.isEmpty(imagePath))
shareParamsMap.put("imagePath", imagePath);
}
/** imageUrl是圖片的網絡路徑,新浪微博、人人網、QQ空間和Linked-In支持此字段 */
public void setImageUrl(String imageUrl) {
if (!TextUtils.isEmpty(imageUrl))
shareParamsMap.put("imageUrl", imageUrl);
}
/** url在微信(包括好友、朋友圈收藏)和易信(包括好友和朋友圈)中使用,否則可以不提供 */
public void setUrl(String url) {
shareParamsMap.put("url", url);
}
/** filePath是待分享應用程序的本地路勁,僅在微信(易信)好友和Dropbox中使用,否則可以不提供 */
public void setFilePath(String filePath) {
shareParamsMap.put("filePath", filePath);
}
/** comment是我對這條分享的評論,僅在人人網和QQ空間使用,否則可以不提供 */
public void setComment(String comment) {
shareParamsMap.put("comment", comment);
}
/** site是分享此內容的網站名稱,僅在QQ空間使用,否則可以不提供 */
public void setSite(String site) {
shareParamsMap.put("site", site);
}
/** siteUrl是分享此內容的網站地址,僅在QQ空間使用,否則可以不提供 */
public void setSiteUrl(String siteUrl) {
shareParamsMap.put("siteUrl", siteUrl);
}
/** foursquare分享時的地方名 */
public void setVenueName(String venueName) {
shareParamsMap.put("venueName", venueName);
}
/** foursquare分享時的地方描述 */
public void setVenueDescription(String venueDescription) {
shareParamsMap.put("venueDescription", venueDescription);
}
/** 分享地緯度,新浪微博、騰訊微博和foursquare支持此字段 */
public void setLatitude(float latitude) {
shareParamsMap.put("latitude", latitude);
}
/** 分享地經度,新浪微博、騰訊微博和foursquare支持此字段 */
public void setLongitude(float longitude) {
shareParamsMap.put("longitude", longitude);
}
/** 是否直接分享 */
public void setSilent(boolean silent) {
this.silent = silent;
}
/** 設置編輯頁的初始化選中平臺 */
public void setPlatform(String platform) {
shareParamsMap.put("platform", platform);
}
/** 設置KakaoTalk的應用下載地址 */
public void setInstallUrl(String installurl) {
shareParamsMap.put("installurl", installurl);
}
/** 設置KakaoTalk的應用打開地址 */
public void setExecuteUrl(String executeurl) {
shareParamsMap.put("executeurl", executeurl);
}
/** 設置微信分享的音樂的地址 */
public void setMusicUrl(String musicUrl) {
shareParamsMap.put("musicUrl", musicUrl);
}
/** 設置自定義的外部回調 */
public void setCallback(PlatformActionListener callback) {
this.callback = callback;
}
/** 返回操作回調 */
public PlatformActionListener getCallback() {
return callback;
}
/** 設置用於分享過程中,根據不同平臺自定義分享內容的回調 */
public void setShareContentCustomizeCallback(ShareContentCustomizeCallback callback) {
customizeCallback = callback;
}
/** 返回自定義分享內容的回調 */
public ShareContentCustomizeCallback getShareContentCustomizeCallback() {
return customizeCallback;
}
/** 設置自己圖標和點擊事件,可以重複調用添加多次 */
public void setCustomerLogo(Bitmap enableLogo,Bitmap disableLogo, String label, OnClickListener ocListener) {
CustomerLogo cl = new CustomerLogo();
cl.label = label;
cl.enableLogo = enableLogo;
cl.disableLogo = disableLogo;
cl.listener = ocListener;
customers.add(cl);
}
/** 設置一個總開關,用於在分享前若需要授權,則禁用sso功能 */
public void disableSSOWhenAuthorize() {
disableSSO = true;
}
/** 設置編輯頁面的顯示模式為Dialog模式 */
public void setDialogMode() {
dialogMode = true;
shareParamsMap.put("dialogMode", dialogMode);
}
/** 添加一個隱藏的platform */
public void addHiddenPlatform(String platform) {
hiddenPlatforms.put(platform, platform);
}
/** 設置一個將被截圖分享的View , surfaceView是截不了圖片的*/
public void setViewToShare(View viewToShare) {
try {
Bitmap bm = captureView(viewToShare, viewToShare.getWidth(), viewToShare.getHeight());
shareParamsMap.put("viewToShare", bm);
} catch (Throwable e) {
e.printStackTrace();
}
}
/** 騰訊微博分享多張圖片 */
public void setImageArray(String[] imageArray) {
shareParamsMap.put("imageArray", imageArray);
}
public void setEditPageBackground(View bgView) {
this.bgView = bgView;
}
public void setOnShareButtonClickListener(PlatformListFakeActivity.OnShareButtonClickListener onShareButtonClickListener) {
this.onShareButtonClickListener = onShareButtonClickListener;
}
/** 循環執行分享 */
public void share(HashMap<platform>> shareData) {/<platform>
boolean started = false;
for (Entry<platform>> ent : shareData.entrySet()) {/<platform>
Platform plat = ent.getKey();
plat.SSOSetting(disableSSO);
String name = plat.getName();
//boolean isGooglePlus = "GooglePlus".equals(name);
//if (isGooglePlus && !plat.isValid()) {
//Message msg = new Message();
//msg.what = MSG_TOAST;
//int resId = getStringRes(context, "google_plus_client_inavailable");
//msg.obj = context.getString(resId);
//UIHandler.sendMessage(msg, this);
//continue;
//}
boolean isKakaoTalk = "KakaoTalk".equals(name);
if (isKakaoTalk && !plat.isClientValid()) {
Message msg = new Message();
msg.what = MSG_TOAST;
int resId = getStringRes(context, "kakaotalk_client_inavailable");
msg.obj = context.getString(resId);
UIHandler.sendMessage(msg, this);
continue;
}
boolean isKakaoStory = "KakaoStory".equals(name);
if (isKakaoStory && !plat.isClientValid()) {
Message msg = new Message();
msg.what = MSG_TOAST;
int resId = getStringRes(context, "kakaostory_client_inavailable");
msg.obj = context.getString(resId);
UIHandler.sendMessage(msg, this);
continue;
}
boolean isLine = "Line".equals(name);
if (isLine && !plat.isClientValid()) {
Message msg = new Message();
msg.what = MSG_TOAST;
int resId = getStringRes(context, "line_client_inavailable");
msg.obj = context.getString(resId);
UIHandler.sendMessage(msg, this);
continue;
}
boolean isWhatsApp = "WhatsApp".equals(name);
if (isWhatsApp && !plat.isClientValid()) {
Message msg = new Message();
msg.what = MSG_TOAST;
int resId = getStringRes(context, "whatsapp_client_inavailable");
msg.obj = context.getString(resId);
UIHandler.sendMessage(msg, this);
continue;
}
boolean isPinterest = "Pinterest".equals(name);
if (isPinterest && !plat.isClientValid()) {
Message msg = new Message();
msg.what = MSG_TOAST;
int resId = getStringRes(context, "pinterest_client_inavailable");
msg.obj = context.getString(resId);
UIHandler.sendMessage(msg, this);
continue;
}
if ("Instagram".equals(name) && !plat.isClientValid()) {
Message msg = new Message();
msg.what = MSG_TOAST;
int resId = getStringRes(context, "instagram_client_inavailable");
msg.obj = context.getString(resId);
UIHandler.sendMessage(msg, this);
continue;
}
boolean isLaiwang = "Laiwang".equals(name);
boolean isLaiwangMoments = "LaiwangMoments".equals(name);
if(isLaiwang || isLaiwangMoments){
if (!plat.isClientValid()) {
Message msg = new Message();
msg.what = MSG_TOAST;
int resId = getStringRes(context, "laiwang_client_inavailable");
msg.obj = context.getString(resId);
UIHandler.sendMessage(msg, this);
continue;
}
}
boolean isYixin = "YixinMoments".equals(name) || "Yixin".equals(name);
if (isYixin && !plat.isClientValid()) {
Message msg = new Message();
msg.what = MSG_TOAST;
int resId = getStringRes(context, "yixin_client_inavailable");
msg.obj = context.getString(resId);
UIHandler.sendMessage(msg, this);
continue;
}
HashMap<string> data = ent.getValue();/<string>
int shareType = Platform.SHARE_TEXT;
String imagePath = String.valueOf(data.get("imagePath"));
if (imagePath != null && (new File(imagePath)).exists()) {
shareType = Platform.SHARE_IMAGE;
if (imagePath.endsWith(".gif")) {
shareType = Platform.SHARE_EMOJI;
} else if (data.containsKey("url") && !TextUtils.isEmpty(data.get("url").toString())) {
shareType = Platform.SHARE_WEBPAGE;
if (data.containsKey("musicUrl") && !TextUtils.isEmpty(data.get("musicUrl").toString())) {
shareType = Platform.SHARE_MUSIC;
}
}
} else {
Bitmap viewToShare = (Bitmap) data.get("viewToShare");
if (viewToShare != null && !viewToShare.isRecycled()) {
shareType = Platform.SHARE_IMAGE;
if (data.containsKey("url") && !TextUtils.isEmpty(data.get("url").toString())) {
shareType = Platform.SHARE_WEBPAGE;
if (data.containsKey("musicUrl") && !TextUtils.isEmpty(data.get("musicUrl").toString())) {
shareType = Platform.SHARE_MUSIC;
}
}
} else {
Object imageUrl = data.get("imageUrl");
if (imageUrl != null && !TextUtils.isEmpty(String.valueOf(imageUrl))) {
shareType = Platform.SHARE_IMAGE;
if (String.valueOf(imageUrl).endsWith(".gif")) {
shareType = Platform.SHARE_EMOJI;
} else if (data.containsKey("url") && !TextUtils.isEmpty(data.get("url").toString())) {
shareType = Platform.SHARE_WEBPAGE;
if (data.containsKey("musicUrl") && !TextUtils.isEmpty(data.get("musicUrl").toString())) {
shareType = Platform.SHARE_MUSIC;
}
}
}
}
}
data.put("shareType", shareType);
if (!started) {
started = true;
if (this == callback) {
int resId = getStringRes(context, "sharing");
if (resId > 0) {
showNotification(context.getString(resId));
}
}
}
plat.setPlatformActionListener(callback);
ShareCore shareCore = new ShareCore();
shareCore.setShareContentCustomizeCallback(customizeCallback);
shareCore.share(plat, data);
}
}
public void onComplete(Platform platform, int action,
HashMap<string> res) {/<string>
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 1;
msg.arg2 = action;
msg.obj = platform;
UIHandler.sendMessage(msg, this);
}
public void onError(Platform platform, int action, Throwable t) {
t.printStackTrace();
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 2;
msg.arg2 = action;
msg.obj = t;
UIHandler.sendMessage(msg, this);
// 分享失敗的統計
ShareSDK.logDemoEvent(4, platform);
}
public void onCancel(Platform platform, int action) {
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 3;
msg.arg2 = action;
msg.obj = platform;
UIHandler.sendMessage(msg, this);
}
public boolean handleMessage(Message msg) {
switch(msg.what) {
case MSG_TOAST: {
String text = String.valueOf(msg.obj);
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
break;
case MSG_ACTION_CCALLBACK: {
switch (msg.arg1) {
case 1: {
// 成功
int resId = getStringRes(context, "share_completed");
if (resId > 0) {
showNotification(context.getString(resId));
}
}
break;
case 2: {
// 失敗
String expName = msg.obj.getClass().getSimpleName();
if ("WechatClientNotExistException".equals(expName)
|| "WechatTimelineNotSupportedException".equals(expName)
|| "WechatFavoriteNotSupportedException".equals(expName)) {
int resId = getStringRes(context, "wechat_client_inavailable");
if (resId > 0) {
showNotification(context.getString(resId));
}
} else if ("GooglePlusClientNotExistException".equals(expName)) {
int resId = getStringRes(context, "google_plus_client_inavailable");
if (resId > 0) {
showNotification(context.getString(resId));
}
} else if ("QQClientNotExistException".equals(expName)) {
int resId = getStringRes(context, "qq_client_inavailable");
if (resId > 0) {
showNotification(context.getString(resId));
}
} else if ("YixinClientNotExistException".equals(expName)
|| "YixinTimelineNotSupportedException".equals(expName)) {
int resId = getStringRes(context, "yixin_client_inavailable");
if (resId > 0) {
showNotification(context.getString(resId));
}
} else if ("KakaoTalkClientNotExistException".equals(expName)) {
int resId = getStringRes(context, "kakaotalk_client_inavailable");
if (resId > 0) {
showNotification(context.getString(resId));
}
}else if ("KakaoStoryClientNotExistException".equals(expName)) {
int resId = getStringRes(context, "kakaostory_client_inavailable");
if (resId > 0) {
showNotification(context.getString(resId));
}
}else if("WhatsAppClientNotExistException".equals(expName)){
int resId = getStringRes(context, "whatsapp_client_inavailable");
if (resId > 0) {
showNotification(context.getString(resId));
}
}else {
int resId = getStringRes(context, "share_failed");
if (resId > 0) {
showNotification(context.getString(resId));
}
}
}
break;
case 3: {
// 取消
int resId = getStringRes(context, "share_canceled");
if (resId > 0) {
showNotification(context.getString(resId));
}
}
break;
}
}
break;
case MSG_CANCEL_NOTIFY: {
NotificationManager nm = (NotificationManager) msg.obj;
if (nm != null) {
nm.cancel(msg.arg1);
}
}
break;
}
return false;
}
// 在狀態欄提示分享操作
private void showNotification(String text) {
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
/** 是否支持QQ,QZone授權登錄後發微博 */
public void setShareFromQQAuthSupport(boolean shareFromQQLogin)
{
shareParamsMap.put("isShareTencentWeibo", shareFromQQLogin);
}
}
閱讀更多 富IT 的文章