package com.yang.sharelogin.platform.weixin;
import android.content.Context;
import android.graphics.Bitmap;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXAppExtendObject;
import com.tencent.mm.sdk.modelmsg.WXImageObject;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.modelmsg.WXMusicObject;
import com.tencent.mm.sdk.modelmsg.WXTextObject;
import com.tencent.mm.sdk.modelmsg.WXVideoObject;
import com.tencent.mm.sdk.modelmsg.WXWebpageObject;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.yang.sharelogin.TPManager;
import com.yang.sharelogin.bean.WXShareContent;
import com.yang.sharelogin.listener.StateListener;
import com.yang.sharelogin.util.WXUtil;
/**
* Created by lujun on 2015/9/6.
*/
public class WXManager {
private static StateListener<String> mListener;
private static final String SCOPE = "snsapi_userinfo";
private static final String STATE = "co.lujun.library.TPShareLogin_wechat_login";
private Context mContext;
private static IWXAPI mAPI;
private static String appId;
public WXManager(Context context){
this.mContext = context;
appId = TPManager.getInstance().getWXAppId();
mAPI = WXAPIFactory.createWXAPI(context, appId, true);
}
/**
* 微信登录
*/
public void onLoginWithWX(){
judegeWX();
mAPI.registerApp(appId);
final SendAuth.Req req = new SendAuth.Req();
req.scope = SCOPE;
req.state = STATE;
mAPI.sendReq(req);
}
/**
* WXShareContent
* @param content
*/
public void share(WXShareContent content){
judegeWX();
mAPI.registerApp(appId);
WXMediaMessage msg = new WXMediaMessage();
SendMessageToWX.Req req = new SendMessageToWX.Req();
switch (content.getType()){
case Text:
shareText(content, msg, req);
break;
case Image:
sharePicture(content, msg, req);
break;
case WebPage:
shareWebPage(content, msg, req);
break;
case Music:
shareMusic(content, msg, req);
break;
case Video:
shareVideo(content, msg, req);
break;
case Appdata:
shareAppData(content, msg, req);
break;
case Emoji:
break;
default:break;
}
}
/**
* share AppData only
* @param content
* @param msg
* @param req
*/
private void shareAppData(WXShareContent content, WXMediaMessage msg, SendMessageToWX.Req req){
WXAppExtendObject wxAppExtendObject = new WXAppExtendObject();
wxAppExtendObject.fileData = WXUtil.readFromFile(content.getApp_data_path(), 0, -1);
wxAppExtendObject.extInfo = "this is ext info";
msg.mediaObject = wxAppExtendObject;
msg.title = content.getTitle();
msg.description = content.getDescription();
msg.setThumbImage(WXUtil.extractThumbNail(content.getApp_data_path(), 150, 150, true));
req.transaction = buildTransaction("appdata");
req.message = msg;
req.scene = content.getScene();
mAPI.sendReq(req);
}
/**
* share music only
* @param content
* @param msg
* @param req
*/
private void shareMusic(WXShareContent content, WXMediaMessage msg, SendMessageToWX.Req req){
WXMusicObject wxMusicObject = new WXMusicObject();
wxMusicObject.musicUrl = content.getMusic_url();
msg.mediaObject = wxMusicObject;
msg.title = content.getTitle();
msg.description = content.getDescription();
req.transaction = buildTransaction("music");
req.message = msg;
req.scene = content.getScene();
shareAsync(content.getImage_url(), req, true);
}
/**
* share video only
* @param content
* @param msg
* @param req
*/
private void shareVideo(WXShareContent content, WXMediaMessage msg, SendMessageToWX.Req req){
WXVideoObject wxVideoObject = new WXVideoObject();
wxVideoObject.videoUrl = content.getVideo_url();
msg.mediaObject = wxVideoObject;
msg.title = content.getTitle();
msg.description = content.getDescription();
req.transaction = buildTransaction("video");
req.message = msg;
req.scene = content.getScene();
shareAsync(content.getImage_url(), req, true);
}
/**
* share picture only
* @param content
* @param msg
* @param req
*/
private void sharePicture(WXShareContent content, WXMediaMessage msg, SendMessageToWX.Req req){
WXImageObject wxImageObject = new WXImageObject();
msg.mediaObject = wxImageObject;
req.transaction = buildTransaction("image");
req.message = msg;
req.scene = content.getScene();
shareAsync(content.getImage_url(), req, false);
}
/**
* share webPage only
* @param content
* @param msg
* @param req
*/
private void shareWebPage(WXShareContent content, WXMediaMessage msg, SendMessageToWX.Req req){
WXWebpageObject wxWebpageObject = new WXWebpageObject();
wxWebpageObject.webpageUrl = content.getWeb_url();
msg.mediaObject = wxWebpageObject;
msg.title = content.getTitle();
msg.description = content.getDescription();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = content.getScene();
shareAsync(content.getImage_url(), req, true);
}
/**
* share text only
* @param content
* @param msg
* @param req
*/
private void shareText(WXShareContent content, WXMediaMessage msg, SendMessageToWX.Req req){
WXTextObject wxTextObject = new WXTextObject();
wxTextObject.text = content.getText();
msg.mediaObject = wxTextObject;
msg.description = content.getText();
req.transaction = buildTransaction("text");
req.message = msg;
//发送的目标场景, 可以选择发送到会话 WXSceneSession 或者朋友圈 WXSceneTimeline。 默认发送到会话。
//WXSceneTimeline, WXSceneSession
req.scene = content.getScene();
mAPI.sendReq(req);
}
private static final int THUMB_SIZE = 116;
/**
* 异步分享
* @param imageUrl
* @param req
*/
private void shareAsync(final String imageUrl, final SendMessageToWX.Req req, final boolean isNeedScale){
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = WXUtil.getBitmapFromUrl(imageUrl);
if (bitmap != null){
if (isNeedScale){
req.message.thumbData = WXUtil.bmpToByteArray(
WXUtil.scaleCenterCrop(bitmap, THUMB_SIZE, THUMB_SIZE), true);
}else {
req.message.mediaObject = new WXImageObject(bitmap);
req.message.thumbData = WXUtil.bmpToByteArray(
WXUtil.scaleCenterCrop(bitmap, THUMB_SIZE, THUMB_SIZE), true);
}
bitmap.recycle();
}
mAPI.sendReq(req);
}
}).start();
}
/**
* set state listener
* @param listener
*/
public void setListener(StateListener<String> listener){
this.mListener = listener;
}
/**
* 检测判断合法性
*/
private void judegeWX(){
if (mAPI == null){
if (mListener != null){
mListener.onError("createWXAPI error!");
}
return;
}
if (!mAPI.isWXAppInstalled()){
if (mListener != null){
mListener.onError("WeChat is not install!");
}
return;
}
}
/**
* get IWXAPI
* @return
*/
public static IWXAPI getWXAPI(){
return mAPI;
}
/**
* get StateListener
* @return
*/
public static StateListener<String> getStateListener(){
return mListener;
}
/**
* build transaction
* @param type
* @return
*/
private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
}