android实现第三方登录之QQ登录

时间:2023-03-09 02:44:05
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);
}