微信登录,handleIntent报错导致onResp不回调的曲线解决法
作者:互联网
这是我第一次在CSDN写博客,平时太忙了(主要是懒~)。
这几天正在做微信第三方登录这一块,起初一切都严格按照微信官方的文档来做,因为刚刚做好QQ登录,感觉微信登录也可以毫不费力地完成吧,结果,它给我来了这么一句报错:
MicroMsg.SDK.WXApiImplV10: handleIntent fail, ex = println needs a message
既然出错了那么就上网找找,找了半天(事实上找了两天)只找到了有相同问题的帖子,但是没找到解决方法。。好吧,那就只能自己来研究研究了。
我们的目标是获得微信传递过来的Authorization Code,只有得到这个才能继续登录步骤。
首先这句话是由WXEntryActivity的onCreate中的handleIntent方法引起:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, Global.WX_APP_ID);
api.handleIntent(getIntent(), this); // 这一句报错
}
@Override
public void onReq(BaseReq req) {}
@Override
public void onResp(BaseResp resp) {}
}
那么我们直接从微信的sdk中找到它(那个BaseWXApiImplV10.class)
找到这个handleIntent函数:
public boolean handleIntent(Intent var1, IWXAPIEventHandler var2) {
try {
// 此处省略n行代码
// 因为报错行之前还有一行提示,cmd = 1,所以在这里停住
int var17 = var1.getIntExtra("_wxapi_command_type", 0);
Log.i("MicroMsg.SDK.WXApiImplV10", "handleIntent, cmd = " + var17);
switch(var17) {
case 1:
Resp var30 = new Resp(var1.getExtras()); // 肯定是这里报错啦
var2.onResp(var30);
return true;
// 此处省略
}
} catch (Exception var8) {
Log.e("MicroMsg.SDK.WXApiImplV10", "handleIntent fail, ex = " + var8.getMessage());
}
return false;
}
继续深入
public Resp(Bundle var1) {
this.fromBundle(var1);
}
public void fromBundle(Bundle var1) {
super.fromBundle(var1);
this.code = var1.getString("_wxapi_sendauth_resp_token"); // 目标找到
this.state = var1.getString("_wxapi_sendauth_resp_state");
this.url = var1.getString("_wxapi_sendauth_resp_url");
this.lang = var1.getString("_wxapi_sendauth_resp_lang");
this.country = var1.getString("_wxapi_sendauth_resp_country");
}
public void fromBundle(Bundle var1) {
this.errCode = var1.getInt("_wxapi_baseresp_errcode");
this.errStr = var1.getString("_wxapi_baseresp_errstr");
this.transaction = var1.getString("_wxapi_baseresp_transaction");
this.openId = var1.getString("_wxapi_baseresp_openId");
}
接下来不用多说,直接在WXEntryActivity的onCreate里面解析Bundle获得code即可!
public class WXEntryActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
int errCode = bundle.getInt("_wxapi_baseresp_errcode");
if (errCode == 0) {
final String code = bundle.getString("_wxapi_sendauth_resp_token");
if (code != null) {
// 利用这个code来继续登录流程
}
}
}
}
}
当然这个方法可能只适用于微信登录的情况,微信分享等其他操作暂时未知可行性。
标签:var1,getString,微信,handleIntent,报错,wxapi,public 来源: https://blog.csdn.net/Livart_Corp/article/details/94354236