[Android]-SDK QQ&微信登入

在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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值