在Unity中接入大量SDK,对一个零Android开发基础的人来说还是比较蛋疼的.在网上搜了一大堆资料,总算折腾出一个能用的QQ&微信登入SDK.
在QQ互联和微信开放平台注册,并申请相关权限后,可拿到指定AppID和AppSecret.有了这些东西才能让接入SDK正常运行.
QQ登入
先将官方的SDK,jar包导入项目.
再在onCreate中创建Tencent类实例..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("MainActivity", "---->>onCreate");
mInstance = this;
mTencent = Tencent.createInstance(AppConst.AppID_QQ, this.getApplicationContext());
mWXapi = WXEntryActivity.initWeiXin(this, AppConst.AppID_WX);
initOkHttp();
}
重写指定listener和onActivityResult..
//QQ登入
public void LoginQQ() {
ShowToast("LoginQQ 调用");
mTencent.logout(this);
if (!mTencent.isSessionValid()) {
ShowToast("LoginQQ 客户端访问");
mTencent.login(this, "all", loginListener);
isServerSideLogin = false;
}
}
//QQ登出
public void LogoutQQ() {
mTencent.logout(this);
}
private class BaseUiListener implements IUiListener {
@Override
public void onComplete(Object response) {
if (null == response) {
ShowToast("登录失败");
return;
}
JSONObject jsonResponse = (JSONObject) response;
if (null != jsonResponse && jsonResponse.length() == 0) {
ShowToast("登录失败");
return;
}
ShowToast("登录成功 : " + response);
doComplete((JSONObject) response);
}
protected void doComplete(JSONObject values) {
}
@Override
public void onError(UiError e) {
ShowToast("QQ 登入异常");
}
@Override
public void onCancel() {
ShowToast("QQ 登入取消");
}
}
IUiListener loginListener = new BaseUiListener() {
@Override
protected void doComplete(JSONObject values) {
ShowToast("QQ 登入返回数据 :" + values);
try {
String token = values.getString(Constants.PARAM_ACCESS_TOKEN);
String expires = values.getString(Constants.PARAM_EXPIRES_IN);
String openId = values.getString(Constants.PARAM_OPEN_ID);
if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires)
&& !TextUtils.isEmpty(openId)) {
mTencent.setAccessToken(token, expires);
mTencent.setOpenId(openId);
UnityPlayer.UnitySendMessage(AppConst.gameObject, AppConst.loginCallBack, openId);
}
} catch (Exception e) {
}
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("Tencent", "-->onActivityResult " + requestCode + " resultCode=" + resultCode);
if (requestCode == Constants.REQUEST_LOGIN ||
requestCode == Constants.REQUEST_APPBAR) {
Tencent.onActivityResultData(requestCode, resultCode, data, loginListener);
}
super.onActivityResult(requestCode, resultCode, data);
}
微信登入
先将官方的SDK,jar包和okhttp框架的jar包导入项目.
再在onCreate中初始化IWXAPI类和okhttp(http框架).
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("MainActivity", "---->>onCreate");
mInstance = this;
mTencent = Tencent.createInstance(AppConst.AppID_QQ, this.getApplicationContext());
mWXapi = WXEntryActivity.initWeiXin(this, AppConst.AppID_WX);
initOkHttp();
}
//封装okhttp框架的初始化配置
private void initOkHttp() {
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new LoggerInterceptor("TAG"))
.cookieJar(cookieJar)
.connectTimeout(20000L, TimeUnit.MILLISECONDS)
.readTimeout(20000L, TimeUnit.MILLISECONDS)
.writeTimeout(20000L, TimeUnit.MILLISECONDS)
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
//其他配置
.build();
OkHttpUtils.initClient(okHttpClient);
}
微信SDK的接入,需要在wxapi文件夹中放入WXEntryActivity类,这是硬性要求.
WXEntryActivity类需要实现IWXAPIEventHandler和Activity.主要实现如下.
private static final String TAG = "WXEntryActivity";
public static WeChatCode mWeChatCode;
public static WXEntryActivity mInstance;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "-->> onCreate");
mInstance = this;
try {
MainActivity.mWXapi.handleIntent(getIntent(), this);
} catch (Exception e) {
e.printStackTrace();
}
}
//微信组件注册初始化
public static IWXAPI initWeiXin(Context context, String appId) {
Log.i(TAG, "-->> initWeiXin");
if (TextUtils.isEmpty(appId)) {
Toast.makeText(context.getApplicationContext(), "app_id 不能为空", Toast.LENGTH_SHORT).show();
}
IWXAPI api = WXAPIFactory.createWXAPI(context, appId, true);
api.registerApp(appId);
return api;
}
// 登录微信
public static void loginWeixin(Context context, IWXAPI api, WeChatCode wechatCode) {
Log.i(TAG, "-->> loginWeiXin");
mWeChatCode = wechatCode;
// 发送授权登录信息,来获取code
SendAuth.Req req = new SendAuth.Req();
// 应用的作用域,获取个人信息
req.scope = "snsapi_userinfo";
req.state = "login_state";
api.sendReq(req);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
// 发送成功
case BaseResp.ErrCode.ERR_OK:
MainActivity.mInstance.ShowToast("第一步:请求CODE 成功");
// 获取code
String code = ((SendAuth.Resp) resp).code;
mWeChatCode.getResponse(code);
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
MainActivity.mInstance.ShowToast("onResp ERR_USER_CANCEL");
//发送取消
finish();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
MainActivity.mInstance.ShowToast("onResp ERR_AUTH_DENIED");
//发送被拒绝
break;
default:
MainActivity.mInstance.ShowToast("onResp default errCode " + resp.errCode);
//发送返回
break;
}
}
/**
* 返回code的回调接口
*/
public interface WeChatCode {
void getResponse(String code);
}
通讯数据使用的是json格式.所以这里还需要为指定数据生成json数据类.关于json数据类的生成,网上有现成的在线生成工具.
这里还有一个WXApi类实现,具体逻辑看Demo
AndroidManifest.xml配置文件中添加
<!-- QQ 登入 -->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent 你的AppID" />
</intent-filter>
</activity>
<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
<!-- 微信登入 -->
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
QQ SDK具体接入流程以及注意事项可查看http://wiki.connect.qq.com/
微信 SDK具体接入流程以及注意事项可查看
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN
在线生成工具类链接http://tool.chinaz.com/tools/json2entity.aspx