使用Umeng統計跟分享,使用原生微信登陸(umeng跟微信原生登陸沖突)
本文根據項目經驗得出,已經經過測試:
因項目中使用umeng的分享統計等功能,但是在接入微信原生登陸的時候發現
umeng會調用擷取AsscesToken的接口,導緻原生方式擷取到的code碼在調用
擷取AsscesToken接口是報錯“40163 code been used”;
出現問題原因
因為使用umeng 全家桶以後,建立的WXEntryActivity必須繼承自WXCallbackActivity(umeng封裝),umeng會在内部接收原生請求的回調并執行擷取AsscesToken的接口,這個時候拿到的code已經失效了,是以會有這個問題。
解決方式
在看了umeng封裝的WXCallbackActivity類以後,發現他内部建立了幾個方法,還有回調處理。根據java的繼承關系,子類覆寫了父類的方法,會優先執行子類中的方法。
package com.umeng.socialize.weixin.view;
public abstract class WXCallbackActivity extends android.app.Activity implements com.umeng.weixin.umengwx.e {
private final java.lang.String b;
protected com.umeng.weixin.handler.UmengWXHandler a;
public WXCallbackActivity() { /* compiled code */ }
protected void onCreate(android.os.Bundle bundle) { /* compiled code */ }
protected void a(android.content.Intent intent) { /* compiled code */ }
protected void onNewIntent(android.content.Intent intent) { /* compiled code */ }
public void a(com.umeng.weixin.umengwx.b b) { /* compiled code */ }
public void a(com.umeng.weixin.umengwx.a a) { /* compiled code */ }
}
看上邊的代碼。我們隻要覆寫其中被混淆過的方法即可。以下是覆寫代碼:
/**
* Created by zenmen on 2018/3/23.
*/
public class WXEntryActivity extends WXCallbackActivity implements IWXAPIEventHandler {
private static final int RETURN_MSG_TYPE_LOGIN = ;
private static final int RETURN_MSG_TYPE_SHARE = ;
@Override
protected void onDestroy() {
super.onDestroy();
hintKeyboard();
//如果沒回調onResp,八成是這句沒有寫
JIXiangApplication.mWxApi.handleIntent(getIntent(), this);
}
private void hintKeyboard() {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm.isActive()&&getCurrentFocus()!=null){
if (getCurrentFocus().getWindowToken()!=null) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
CustomLog.e("getPlatformInfo="+baseResp.errCode);
LoginEvent event = new LoginEvent();
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_BAN:
case BaseResp.ErrCode.ERR_AUTH_DENIED:
case BaseResp.ErrCode.ERR_USER_CANCEL:
event.setAuthSucess(false);
if (RETURN_MSG_TYPE_SHARE == baseResp.getType()) {
event.setMsg("分享失敗");
Toasty.normal(this, "分享失敗");
}
else {
event.setMsg("登入失敗");
Toasty.normal(this, "登入失敗");
}
break;
case BaseResp.ErrCode.ERR_OK:
switch (baseResp.getType()) {
case RETURN_MSG_TYPE_LOGIN:
event.setAuthSucess(true);
//拿到了微信傳回的code,立馬再去請求access_token
String code = ((SendAuth.Resp) baseResp).code;
//就在這個地方,用網絡庫什麼的或者自己封的網絡api,發請求去咯,注意是get請求
CustomLog.e("getPlatformInfo="+code);
event.setLoginCode(code);
event.setMsg("授權成功");
break;
case RETURN_MSG_TYPE_SHARE:
Toasty.normal(this,"微信分享成功");
break;
}
break;
}
EventBus.getDefault().post(event);
}
//該方法執行umeng登陸的回調的處理
@Override
public void a(com.umeng.weixin.umengwx.b b) {
// super.a(b);
}
@Override
protected void a(Intent intent) {
super.a(intent);
}
//在onResume中處理從微信授權通過以後不會自動跳轉的問題,手動結束該頁面
@Override
protected void onResume() {
super.onResume();
finish();
}
}
手動結束頁面以後,會自動調用onResp方法,這個時候就可以拿到code,然後進行下一步操作。