Android集成微信登录
问题描述
最近有个项目要集成微信第三方登录,而且要求用原生的SDK,客户端是Unity3D开发,所以需要用Android Studio来做个plugin给U3D,网上找了些资料,自己琢磨了一下,有几个问题1.拉起微信授权后,用户点击了登录,回到MainActivity,但是code却没有获取到,于是我在MainActivity里设置了个lock,还有在onResume方法里判断code是否已经返回了值,虽然能用,但是总觉得好别扭啊2.这个工程要打成arr文件给u3d用,请问怎么把code传给U3D,后续的获取access_token这些工作都是服务器端完成。下面是我写的代码,安卓下可以用,一切正常,能获取code,请教一下如何优化我的代码能在用户在微信授权里点完登录回到MainActivity后得到code,而且能打包成arr,u3D可以获取到,非常感谢,下面是我的代码
MainActivity
package com.mazingtec.hxddz;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.mazingtec.hxddz.wxapi.WXEntryActivity;import com.tencent.mm.opensdk.modelmsg.SendAuth;import com.tencent.mm.opensdk.openapi.IWXAPI;import com.tencent.mm.opensdk.openapi.WXAPIFactory;import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity implements View.OnClickListener { boolean lock = true; Button btnWeChat; public String code; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnWeChat = (Button) findViewById(R.id.btnWeChat);btnWeChat.setOnClickListener(this); } @Override protected void onResume() {super.onResume();if(WXEntryActivity.isOK && lock){ lock = false; code = WXEntryActivity.CODE;} } private void GetCode() {IWXAPI iwxapi = WXAPIFactory.createWXAPI(this, WXEntryActivity.APP_ID, true);iwxapi.registerApp(WXEntryActivity.APP_ID);if (iwxapi != null && iwxapi.isWXAppInstalled()) { SendAuth.Req req = new SendAuth.Req(); req.scope = 'snsapi_userinfo'; req.state = 'We_did_it'; iwxapi.sendReq(req);} else Toast.makeText(this, '用户未安装微信', Toast.LENGTH_SHORT).show(); } @Override public void onClick(View v) {if(v == btnWeChat){ GetCode();} }}
WXEntryActivity
package com.mazingtec.hxddz.wxapi;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import com.tencent.mm.opensdk.modelbase.BaseReq;import com.tencent.mm.opensdk.modelbase.BaseResp;import com.tencent.mm.opensdk.modelmsg.SendAuth;import com.tencent.mm.opensdk.openapi.IWXAPI;import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;import com.tencent.mm.opensdk.openapi.WXAPIFactory;/** * Created by wei on 2017/6/21. */public class WXEntryActivity extends Activity implements IWXAPIEventHandler { public static final String APP_ID = 'wxopq239o809uqewfojoasidfj'; private IWXAPI iwxapi; public static String CODE; public static boolean isOK = false; @Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);iwxapi = WXAPIFactory.createWXAPI(this, APP_ID, true);iwxapi.handleIntent(this.getIntent(), this); } @Override protected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);iwxapi.handleIntent(intent, this); } @Override public void onReq(BaseReq baseReq) { } @Override public void onResp(BaseResp baseResp) {switch (baseResp.errCode){ case BaseResp.ErrCode.ERR_OK://发送成功SendAuth.Resp sendResp = (SendAuth.Resp) baseResp;if (sendResp != null) { CODE = sendResp.code; isOK = true;}WXEntryActivity.this.finish();break; case BaseResp.ErrCode.ERR_USER_CANCEL:isOK = false;WXEntryActivity.this.finish();//发送取消break; case BaseResp.ErrCode.ERR_AUTH_DENIED:isOK = false;WXEntryActivity.this.finish();//发送被拒绝break; default:isOK = false;WXEntryActivity.this.finish();//发送返回break;} }}
问题解答
回答1:问题是从WXEntryActivity 拿到的Code如何回传给MainActivity, 如果图方便的话通过Intent携带这个code, 返回给MainActivity就可以了, 在MainActivity中getIntent再取出这个code. 其次就是可以通过EventBus来解决, 不过有点得不偿失.
看着应该是Unity3D和android的通信问题吧? 网上解决方案蛮多的
回答2:泻药。没集成过微信登录,也没用过U3D,不敢妄下评论。但是我有个疑问,微信SDK回传的code不应该是通过onActivityResult之类的回传的么?
相关文章:
1. docker安装后出现Cannot connect to the Docker daemon.2. docker内创建jenkins访问另一个容器下的服务器问题3. nignx - docker内nginx 80端口被占用4. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!5. docker gitlab 如何git clone?6. dockerfile - 为什么docker容器启动不了?7. docker 17.03 怎么配置 registry mirror ?8. html - css气泡,实现“倒三角(不知道算不算三角了)”可透明的。9. 列宽好窄,跟老师显示的列宽不一样10. 如何解决docker宿主机无法访问容器中的服务?