最近有個專案要整合微信第三方登錄,而且要求用原生的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;
}
}
}
問題是從WXEntryActivity 拿到的Code如何回傳給MainActivity, 如果圖方便的話透過Intent攜帶這個code, 返回給MainActivity就可以了, 在MainActivity中getIntent再取出這個code. 其次就是可以透過EventBus來解決,不過有點得不償失.
看著應該是Unity3D和android的通訊問題吧? 網路上解決方案蠻多的
瀉藥。
沒整合過微信登錄,也沒用過U3D,不敢妄下評論。
但是我有個疑問,微信SDK回傳的code不應該是透過onActivityResult之類的回傳的麼?