package cn.bidaround.ytcore.sina;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.Toast;
import cn.bidaround.ytcore.YtCore;
import cn.bidaround.ytcore.YtShareListener;
import cn.bidaround.ytcore.data.BaseShare;
import cn.bidaround.ytcore.data.ShareData;
import cn.bidaround.ytcore.data.YtPlatform;
import cn.bidaround.ytcore.login.AuthListener;
import cn.bidaround.ytcore.login.AuthLogin;
import cn.bidaround.ytcore.login.AuthUserInfo;
import com.sina.weibo.sdk.api.ImageObject;
import com.sina.weibo.sdk.api.MusicObject;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.VideoObject;
import com.sina.weibo.sdk.api.WeiboMessage;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.BaseResponse;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.utils.Utility;
/**
* 新浪微博分享操作以及分享回调
*
* @author youtui
* @since 14/4/25
*/
public class SinaSSOShare extends BaseShare {
/** 新浪微博分享接口 */
private IWeiboShareAPI iWeiboShareAPI;
private YtPlatform platform = YtPlatform.PLATFORM_SINAWEIBO;
public SinaSSOShare(Activity activity, ShareData shareData, YtShareListener listener) {
super(activity, shareData, listener);
iWeiboShareAPI = WeiboShareSDK.createWeiboAPI(activity, platform.getAppId());
}
/**
* 发送共享到新浪微博
*/
public void shareToSina() {
if (shareData.getShareType() == ShareData.SHARETYPE_MUSIC || shareData.getShareType() == ShareData.SHARETYPE_VIDEO) {
Toast.makeText(activity, "新浪微博不支持音乐和视频分享", Toast.LENGTH_SHORT).show();
return;
}
if (SinaAccessTokenKeeper.readAccessToken(activity).isSessionValid()) {
doSSOShare();
}
// 未授权的情况
else {
sinaSSOAuth();
}
}
/**
* 通过客户端分享
*/
private void doSSOShare() {
// 新浪微博在10351以上版本支持多条微博发送
if (iWeiboShareAPI.getWeiboAppSupportAPI() >= 10351) {
if (shareData.getShareType() == ShareData.SHARETYPE_IMAGEANDTEXT) {
// 如果是图文类型
sendMultiMessage();
} else if (shareData.getShareType() == ShareData.SHARETYPE_IMAGE) {
// 如果是纯图分享
sendSingleMessage();
} else if (shareData.getShareType() == ShareData.SHARETYPE_TEXT) {
// 纯文字分享
sendTextMessage();
} else if (shareData.getShareType() == ShareData.SHARETYPE_MUSIC) {
// 音乐分享
sendMusicMessage();
} else if (shareData.getShareType() == ShareData.SHARETYPE_VIDEO) {
sendVideoMessage();
}
} else {
sendSingleMessage();
}
}
/**
* 新浪微博sso授权
*/
private void sinaSSOAuth() {
AuthLogin auth = new AuthLogin();
AuthListener listener = new AuthListener() {
@Override
public void onAuthSucess(AuthUserInfo userInfo) {
doSSOShare();
}
@Override
public void onAuthFail() {
}
@Override
public void onAuthCancel() {
}
};
auth.sinaAuth(activity, listener);
}
/**
* 第三方应用发送请求消息到微博,唤起微博分享界面 < 10351 时,只支持分享单条消息,该方法发送一条网页消息
*/
private boolean sendSingleMessage() {
// 1. 初始化微博的分享消息
WeiboMessage weiboMessage = new WeiboMessage();
weiboMessage.mediaObject = getImageObj(shareData);
// 2. 初始化从第三方到微博的消息请求
SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.message = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
return iWeiboShareAPI.sendRequest(request);
}
/**
* 分享纯文字
*
* @return
*/
private boolean sendTextMessage() {
// 1. 初始化微博的分享消息
WeiboMessage weiboMessage = new WeiboMessage();
weiboMessage.mediaObject = getTextObject(shareData);
// 2. 初始化从第三方到微博的消息请求
SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.message = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
return iWeiboShareAPI.sendRequest(request);
}
/**
* 第三方应用发送请求消息到微博,唤起微博分享界面 > 10351 时,支持分享多条消息,该方法发送一条网页消息和一条图片消息
*/
private void sendMultiMessage() {
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
weiboMessage.imageObject = getImageObj(shareData);
weiboMessage.textObject = getTextObject(shareData);
// 2. 初始化从第三方到微博的消息请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
iWeiboShareAPI.sendRequest(request);
}
private boolean sendMusicMessage() {
// 1. 初始化微博的分享消息
WeiboMessage weiboMessage = new WeiboMessage();
weiboMessage.mediaObject = getMusicObj(shareData);
// 2. 初始化从第三方到微博的消息请求
SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.message = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
return iWeiboShareAPI.sendRequest(request);
}
private boolean sendVideoMessage() {
// 1. 初始化微博的分享消息
WeiboMessage weiboMessage = new WeiboMessage();
weiboMessage.mediaObject = getVideoObj(shareData);
// 2. 初始化从第三方到微博的消息请求
SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.message = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
return iWeiboShareAPI.sendRequest(request);
}
/**
* 获得要分享的文字信息
*
* @return TextObject
*/
private TextObject getTextObject(ShareData shareData) {
TextObject textObject = new TextObject();
textObject.title = shareData.getTitle();
textObject.description = shareData.getDescription();
String text = shareData.getText();
// 如果文字太长,截取部分,不然微博无法发送
if (text.length() > 110) {
text = text.substring(0, 109);
text += "...";
}
if (shareData.getTargetUrl() != null && !"".equals(shareData.getTargetUrl()) && !"null".equals(shareData.getTargetUrl())) {
textObject.text = text + shareData.getTargetUrl();
textObject.actionUrl = shareData.getTargetUrl();
} else {
textObject.text = text;
}
return textObject;
}
/**
* 获得要分享的图片信息
*
* @return ImageObject
*/
private ImageObject getImageObj(ShareData shareData) {
ImageObject image = new ImageObject();
Bitmap bitmap = null;
if (shareData == null) {
} else if (shareData.getImagePath() != null) {
bitmap = BitmapFactory.decodeFile(shareData.getImagePath());
} else if (shareData.getImageUrl() != null) {
try {
bitmap = BitmapFactory.decodeStream(new URL(shareData.getImageUrl()).openStream());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bitmap == null) {
bitmap = BitmapFactory.decodeResource(activity.getResources(), YtCore.res.getIdentifier("loadfail", "drawable", YtCore.packName));
}
image.setImageObject(bitmap);
image.actionUrl = shareData.getTargetUrl();
image.description = shareData.getText();
return image;
}
/**
* 获得要分享的音乐
*
* @param shareData
* @return
*/
private MusicObject getMusicObj(ShareData shareData) {
// 创建媒体消息
MusicObject musicObject = new MusicObject();
musicObject.identify = Utility.generateGUID();
musicObject.title = shareData.getTitle();
musicObject.description = shareData.getDescription();
// 设置 Bitmap 类型的图片到视频对象里
Bitmap bitmap = null;
Bitmap bmpThum = null;
if (shareData.getImagePath() != null) {
bitmap = BitmapFactory.decodeFile(shareData.getImagePath());
}
// bitmap为空时微信分享会没有响应,所以要设置一个默认图片让用户知道
if (bitmap != null) {
bmpThum = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
} else {
bmpThum = Bitmap.createScaledBitmap(
BitmapFactory.decodeResource(activity.getResources(), YtCore.res.getIdentifier("yt_loadfail", "drawable", YtCore.packName)), 150,
150, true);
}
musicObject.setThumbImage(bmpThum);
musicObject.actionUrl = shareData.getMusicUrl();
musicObject.dataUrl = shareData.getTargetUrl();
musicObject.dataHdUrl = shareData.getTargetUrl();
musicObject.duration = 10;
musicObject.defaultText = shareData.getText();
return musicObject;
}
/**
* 获得要分享的视频
*
* @param shareData
* @return
*/
private VideoObject getVideoObj(ShareData shareData) {
// 创建媒体消息
VideoObject videoObject = new VideoObject();
videoObject.identify = Utility.generateGUID();
videoObject.title = shareData.getTitle();
videoObject.description = shareData.getText();
// 设置 Bitmap 类型的图片到视频对象里
Bitmap bitmap = null;
Bitmap bmpThum = null;
if (shareData.getImagePath() != null) {
bitmap = BitmapFactory.decodeFile(shareData.getImagePath());
}
// bitmap为空时微信分享会没有响应,所以要设置一个默认图片让用户知道
if (bitmap != null) {
bmpThum = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
} else {
bmpThum = Bitmap.createScaledBitmap(
BitmapFactory.decodeResource(activity.getResources(), YtCore.res.getIdentifier("yt_loadfail", "drawable", YtCore.packName)), 150,
150, true);
}
videoObject.setThumbImage(bmpThum);
videoObject.actionUrl = shareData.getVideoUrl();
videoObject.dataUrl = shareData.getTargetUrl();
videoObject.dataHdUrl = shareData.getTargetUrl();
videoObject.duration = 10;
videoObject.defaultText = shareData.getText();
return videoObject;
}
// @Override
public void onResponse(BaseResponse baseResp) {
switch (baseResp.errCode) {
// 分享成功
case WBConstants.ErrorCode.ERR_OK:
YtShareListener.sharePoint(activity, platform.getChannleId(), !shareData.isAppShare());
if (listener != null)
listener.onSuccess(platform, baseResp.errMsg);
break;
// 分享取消
case WBConstants.ErrorCode.ERR_CANCEL:
if (listener != null)
listener.onCancel(platform);
break;
// 分享错误
case WBConstants.ErrorCode.ERR_FAIL:
if ("auth faild!!!!".equals(baseResp.errMsg)) {
iWeiboShareAPI.registerApp();
} else {
if (listener != null)
listener.onError(platform, baseResp.errMsg);
}
break;
default:
break;
}
}
public IWeiboShareAPI getIWeiboShareAPI() {
return iWeiboShareAPI;
}
/** 新浪accessToken */
private Oauth2AccessToken oauth2AccessToken;
/** 新浪微博授权类 */
private WeiboAuth mWeiboAuth;
/** 新浪微博sso授权类 */
private SsoHandler mSsoHandler;
private String sinaWbAccessToken;
}