使用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 = 1;
private static final int RETURN_MSG_TYPE_SHARE = 2;
@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,然后进行下一步操作。