微信登录,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报错导致onResp不回调的曲线解决法
找到这个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来继续登录流程
				}
			}
		}
	}
}

当然这个方法可能只适用于微信登录的情况,微信分享等其他操作暂时未知可行性。

上一篇:postgres 定义变量


下一篇:Java图像处理Thumbnails库的使用