android实现第三方登录之QQ登录
首先,当然是在腾讯开放平台(http://open.qq.com/)注册成为开发者,然后获取APP ID
1.下载SDK
http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD
2.把open-sdk.jar文件和mta_sdk_x.x.x.jar文件拷贝到libs(或lib)目录下
`http://wiki.open.qq.com/wiki/%E5%88%9B%E5%BB%BA%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%B7%A5%E7%A8%8B`
3.配置AndroidManifest
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 从QQ登录中copy的代码--> <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="tencent1105546048" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
4.创建实例 http://wiki.open.qq.com/wiki/%E5%88%9B%E5%BB%BA%E5%AE%9E%E4%BE%8B%E5%B9%B6%E5%AE%9E%E7%8E%B0%E5%9B%9E%E8%B0%83
// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。 // 其中APP_ID是分配给第三方应用的appid,类型为String。 mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());
5.实现回调 IUiListener
6.接收到回调
需要在调用接口的Activity的onActivityResult方法中增加如下代码:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Tencent.onActivityResultData(requestCode,resultCode,data,listener); }
具体源码:
//变量 boolean isServerSideLogin = false; public static Tencent mTencent; //点击按钮之后QQ登录 public void loginQQ(View view){ //初始化,得到APPID mTencent = Tencent.createInstance(ConstantsData.QQ_APP_ID, this); if (!mTencent.isSessionValid()) { mTencent.login(this, "all", loginListener); isServerSideLogin = false; Log.d("SDKQQAgentPref", "FirstLaunch_SDK:" + SystemClock.elapsedRealtime()); } else { if (isServerSideLogin) { // Server-Side 模式的登陆, 先退出,再进行SSO登陆 mTencent.logout(this); mTencent.login(this, "all", loginListener); isServerSideLogin = false; Log.d("SDKQQAgentPref", "FirstLaunch_SDK:" + SystemClock.elapsedRealtime()); return; } mTencent.logout(this); } } //初始化OPENID和TOKEN值(为了得了用户信息) public static void initOpenidAndToken(JSONObject jsonObject) { try { String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN); String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN); String openId = jsonObject.getString(Constants.PARAM_OPEN_ID); if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires) && !TextUtils.isEmpty(openId)) { mTencent.setAccessToken(token, expires); mTencent.setOpenId(openId); } } catch(Exception e) { } } IUiListener loginListener = new BaseUiListener() { @Override protected void doComplete(JSONObject values) { Log.d("SDKQQAgentPref", "AuthorSwitch_SDK:" + SystemClock.elapsedRealtime()); initOpenidAndToken(values); } }; //实现回调 private class BaseUiListener implements IUiListener { @Override public void onComplete(Object response) { if (null == response) { Util.showResultDialog(LoginActivity.this, "返回为空", "登录失败"); return; } JSONObject jsonResponse = (JSONObject) response; if (null != jsonResponse && jsonResponse.length() == 0) { Util.showResultDialog(LoginActivity.this, "返回为空", "登录失败"); return; } Util.showResultDialog(LoginActivity.this, response.toString(), "登录成功"); // 有奖分享处理 // handlePrizeShare(); doComplete((JSONObject)response); } protected void doComplete(JSONObject values) { } @Override public void onError(UiError e) { Util.toastMessage(LoginActivity.this, "onError: " + e.errorDetail); Util.dismissDialog(); } @Override public void onCancel() { Util.toastMessage(LoginActivity.this, "onCancel: "); Util.dismissDialog(); if (isServerSideLogin) { isServerSideLogin = false; } } } //QQ登录后的回调 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("TAG", "-->onActivityResult " + requestCode + " resultCode=" + resultCode); if (requestCode == Constants.REQUEST_LOGIN || requestCode == Constants.REQUEST_APPBAR) { Tencent.onActivityResultData(requestCode,resultCode,data,loginListener); } super.onActivityResult(requestCode, resultCode, data); }
种一棵树最早的时间是十年前,其次是现在。