天天看點

使用Umeng統計跟分享,使用原生微信登陸(umeng跟微信原生登陸沖突)使用Umeng統計跟分享,使用原生微信登陸(umeng跟微信原生登陸沖突)

使用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,然後進行下一步操作。