package cn.bidaround.ytcore.wxapi; import java.io.ByteArrayOutputStream; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.MotionEvent; import android.view.Window; import cn.bidaround.ytcore.YtBaseActivity; import cn.bidaround.ytcore.YtCore; import cn.bidaround.ytcore.YtShareListener; import cn.bidaround.ytcore.data.ShareData; import cn.bidaround.ytcore.data.YtPlatform; import cn.bidaround.ytcore.login.AuthListener; import cn.bidaround.ytcore.util.Util; import cn.bidaround.ytcore.util.YtLog; import com.tencent.mm.sdk.modelbase.BaseReq; import com.tencent.mm.sdk.modelbase.BaseResp; import com.tencent.mm.sdk.modelmsg.SendAuth; import com.tencent.mm.sdk.modelmsg.SendMessageToWX; 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.IWXAPIEventHandler; import com.tencent.mm.sdk.openapi.WXAPIFactory; /** * 微信分享activity * * 微信分享时生命周期为: onCreate --> onResp --> onDestory * 微信朋友圈分享时生命周期为: onCreate --> onDestory --> onCreate --> onResp --> onDestory * 所以YtShareListener,AuthListener,YtPlatform,ShareData都设置成static,防止朋友圈分享后onDestory将对象销毁 * @author youtui * @since 14/5/4 */ public class WXEntryActivity extends YtBaseActivity implements IWXAPIEventHandler { /** 微信接口 */ private IWXAPI mIWXAPI; /** 待分享图片 */ private Bitmap bitmap; /** 分享图片的缩略图 */ private Bitmap bmpThum; /** 微信是否为分享时打开 */ private boolean fromShare; /** 分享事件监听 */ public static YtShareListener listener; /** 微信授权登录监听事件 */ public static AuthListener authListener; /** 显示授权进度窗口不能使用WXEntryActivity,这个Activity很快会被销毁 */ public static Activity activity; /** 分享的平台,用于区别微信好友和微信朋友圈 */ public static YtPlatform platform; /** 待分享数据 */ public static ShareData shareData; private boolean isWechatAuth; /** 微信朋友圈第二次oncreate后才能回调*/ private int destoryTime = 0 ; @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); fromShare = getIntent().getExtras().getBoolean("fromShare"); isWechatAuth = getIntent().getExtras().getBoolean("isWechatAuth"); if (platform == null) platform = YtPlatform.PLATFORM_WECHAT; mIWXAPI = WXAPIFactory.createWXAPI(WXEntryActivity.this, platform.getAppId(), false); mIWXAPI.registerApp(platform.getAppId()); mIWXAPI.handleIntent(getIntent(), WXEntryActivity.this); if (isWechatAuth) { SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo_test"; mIWXAPI.sendReq(req); } else shareToWx(); } /** * 分享到微信或朋友圈 当微信没有登陆时,分享会先进入登陆界面,登录后再次启动该activity, * 导致通过Intent传入的ShareData.shareData和pointArr读取都为null 此时在shareToWx不需要做操作 */ protected void shareToWx() { WXMediaMessage msg = new WXMediaMessage(); if (shareData == null) { return; } // 微信分享将内容设置成标题 if (YtCore.isWxCircleTextAsTitle && platform == YtPlatform.PLATFORM_WECHATMOMENTS) msg.title = shareData.getTitle() + " " + shareData.getText(); else msg.title = shareData.getTitle(); msg.description = shareData.getText(); if (shareData.getShareType() == ShareData.SHARETYPE_IMAGEANDTEXT) { // 如果是图文分享 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(getResources(), YtCore.res.getIdentifier("yt_loadfail", "drawable", YtCore.packName)), 150, 150, true); } msg.setThumbImage(bmpThum); WXWebpageObject pageObject = new WXWebpageObject(); pageObject.webpageUrl = shareData.getTargetUrl(); msg.mediaObject = pageObject; } else if (shareData.getShareType() == ShareData.SHARETYPE_IMAGE) { // 如果是纯图分享 if (shareData.getImagePath() != null) { bitmap = BitmapFactory.decodeFile(shareData.getImagePath()); } if (bitmap != null) { bmpThum = Bitmap.createScaledBitmap(bitmap, 150, 150 * bitmap.getHeight() / bitmap.getWidth(), true); bitmap.recycle(); } else { bmpThum = Bitmap.createScaledBitmap( BitmapFactory.decodeResource(getResources(), YtCore.res.getIdentifier("yt_loadfail", "drawable", YtCore.packName)), 150, 150, true); } msg.setThumbImage(bmpThum); WXImageObject image = new WXImageObject(); image.imagePath = shareData.getImagePath(); msg.mediaObject = image; // YtLog.w("SHARETYPE_IMAGE", shareData.getImageUrl()); } else if (shareData.getShareType() == ShareData.SHARETYPE_TEXT) { // 纯文字分享 WXTextObject text = new WXTextObject(); text.text = shareData.getText(); msg.mediaObject = text; } else if (shareData.getShareType() == ShareData.SHARETYPE_MUSIC) { // 音乐分享 WXMusicObject music = new WXMusicObject(); music.musicUrl = shareData.getMusicUrl(); msg.mediaObject = music; 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(getResources(), YtCore.res.getIdentifier("yt_loadfail", "drawable", YtCore.packName)), 150, 150, true); } msg.setThumbImage(bmpThum); } else if (shareData.getShareType() == ShareData.SHARETYPE_VIDEO) { // 视频分享 WXVideoObject video = new WXVideoObject(); video.videoUrl = shareData.getVideoUrl(); msg.mediaObject = video; 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(getResources(), YtCore.res.getIdentifier("yt_loadfail", "drawable", YtCore.packName)), 150, 150, true); } msg.setThumbImage(bmpThum); YtLog.w("SHARETYPE_MUSIC", shareData.getMusicUrl()); } SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("youtui"); req.message = msg; if (fromShare) { if (platform == YtPlatform.PLATFORM_WECHATMOMENTS) req.scene = SendMessageToWX.Req.WXSceneTimeline; else if (platform == YtPlatform.PLATFORM_WECHAT) req.scene = SendMessageToWX.Req.WXSceneSession; else if (platform == YtPlatform.PLATFORM_WECHATFAVORITE) req.scene = SendMessageToWX.Req.WXSceneFavorite; mIWXAPI.sendReq(req); } } public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) { ByteArrayOutputStream output = new ByteArrayOutputStream(); bmp.compress(CompressFormat.PNG, 100, output); if (needRecycle) { bmp.recycle(); } byte[] result = output.toByteArray(); try { output.close(); } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onNewIntent(Intent intent) { handIntent(intent); super.onNewIntent(intent); } /** * 微信监听分享结果 * * @param intent */ public void handIntent(Intent intent) { setIntent(intent); // 监听分享后的返回结果 mIWXAPI.handleIntent(intent, this); } /** * 创建唯一标示 * * @param type * @return 唯一标示字符串 */ protected String buildTransaction(final String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); } @Override public void onReq(BaseReq req) { } @Override protected void onRestart() { Util.dismissDialog(); finish(); super.onRestart(); } @Override protected void onDestroy() { super.onDestroy(); if(platform != null){ if(platform == YtPlatform.PLATFORM_WECHATMOMENTS){ if(destoryTime >= 1) destoryObject(); destoryTime ++; } else destoryObject(); } } private void destoryObject(){ authListener = null; listener = null; platform = null; shareData = null; } @Override /** * 微信分享监听 */ public void onResp(BaseResp response) { switch (response.errCode) { case BaseResp.ErrCode.ERR_OK: // 微信授权登录 if (isWechatAuth) { Bundle bundle = new Bundle(); response.toBundle(bundle); new WechatAuthHelper(activity, authListener).httpForUserinfor(bundle); } else { if(shareData != null) YtShareListener.sharePoint(this, platform.getChannleId(), !shareData.isAppShare()); if (listener != null) listener.onSuccess(platform, response.errStr); } break; case BaseResp.ErrCode.ERR_SENT_FAILED: if (listener != null) listener.onError(platform, response.errStr); break; case BaseResp.ErrCode.ERR_COMM: if (listener != null) listener.onError(platform, response.errStr); break; case BaseResp.ErrCode.ERR_USER_CANCEL: if (listener != null) listener.onCancel(platform); if (authListener != null) authListener.onAuthCancel(); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: break; default: break; } finish(); } @Override public boolean onTouchEvent(MotionEvent event) { finish(); return super.onTouchEvent(event); } @Override protected void onResume() { super.onResume(); // 微信签名检测 if (YtCore.getInstance().isCheckConfig()) WechatAuthHelper.checkWeChatSign(); } }