[Android]-SDK QQ&微信登入

来源:互联网 发布:qq三国79js 79xs 编辑:程序博客网 时间:2024/05/22 06:10

在Unity中接入大量SDK,对一个零Android开发基础的人来说还是比较蛋疼的.在网上搜了一大堆资料,总算折腾出一个能用的QQ&微信登入SDK.

在QQ互联和微信开放平台注册,并申请相关权限后,可拿到指定AppID和AppSecret.有了这些东西才能让接入SDK正常运行.



QQ登入

先将官方的SDK,jar包导入项目.
再在onCreate中创建Tencent类实例..

@Overrideprotected 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) {        }    }};@Overrideprotected 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框架).

@Overrideprotected 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

源码分享链接https://github.com/B-CK/QQ-WXLoginSDK