最近几天项目赶的很紧,天天加班到凌晨,一直没时间来写博客,今天抽空来跟大家分享一下集成源生的QQ登录
首先肯定是去下载SDK 下载地址是:http://wiki.open.qq.com/wiki/mobile/SDK下载
效果
然后解压压缩包,把里面
jar文件夹下面的两个jar包导入到工程目录的libs文件夹下
全选之后右键,选择add As Library, 如果不as Library的话,jar包导进来是没有任何效果的
接下来就可以用了官方文档
http://wiki.open.qq.com/wiki/QQ%E7%99%BB%E5%BD%95%E5%92%8C%E6%B3%A8%E9%94%80
其中还得需要腾讯授权的AppId 用来识别不同集成登录的app ,接下来说说怎么拿到appId
进入腾讯开放着平台http://open.qq.com/ 然后登录,进入管理中心,创建应用,创建完成之后就可以得到appId了
点击进入之后
接下来就是在代码中使用了,其实使用起来很简单
首先是吧下面这些代码复制到 AndroidManifest.xml里面
<span style="font-size:18px;"></span><pre style="background-color: rgb(255, 255, 255); font-family: 宋体; font-size: 12.8pt;"><pre name="code" class="html"><pre style="background-color: rgb(255, 255, 255); font-family: 宋体; font-size: 12.8pt;"><pre name="code" class="html"> <activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:screenOrientation="portrait"
android:launchMode="singleTask" >
<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="tencent1105721156" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
其中
<data android:scheme="tencent1105721156" /><pre name="code" class="html"><span style="font-size:18px;">是appid,前面是tencent后面是appid</span>
添加2个权限
<span style="font-size:18px;"><uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></span>
然后在xml文件
<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingBottom="25dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="25dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:orientation="horizontal">
<ImageView
android:id="@+id/user_logo"
android:layout_width="90dp"
android:layout_height="90dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
android:text="姓名:"
android:textColor="#80505050"
android:textSize="18sp"/>
<TextView
android:id="@+id/user_nickname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
android:text="姓名"
android:textColor="#80505050"
android:textSize="18sp"/>
</LinearLayout>
<Button
android:id="@+id/new_login_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="login"
android:text="点击登录"/>
<TextView
android:id="@+id/user_inf"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户信息:"
android:textColor="#80505050"
android:textSize="18sp"/>
</LinearLayout></span>
拿到用户信息有3个步骤:
1,调用login()方法,成功回调得到一串json
2,解析后拿到accessToken,openId,expires,,然后调用
//**下面这两步设置很重要,如果没有设置,返回为空** mTencent.setOpenId(openID); mTencent.setAccessToken(accessToken, expires); //去拿图像和昵称 UserInfo userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken());3,在监听回调方法中拿到一串json,解析拿到用户信息,
代码中注释很清楚了,就不一一讲解了:
<pre name="code" class="html">package com.example.administrator.qqqlogindemo;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.tencent.connect.UserInfo;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
//app_id
public static final String app_id = "1105721156";
//qq的操作对象
static Tencent mTencent;
//点击登录的按钮
private Button login_btn;
private TextView mUserName;
private ImageView mUserHead;//头像
TextView mUserInformation = null;//用户信息
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTencent = Tencent.createInstance(app_id, this.getApplicationContext());
initViews();
}
private void initViews() {
mUserInformation = (TextView) findViewById(R.id.user_inf);//用户信息
mUserName = (TextView) findViewById(R.id.user_nickname);//姓名
mUserHead = (ImageView) findViewById(R.id.user_logo);//头像
login_btn = (Button) findViewById(R.id.new_login_btn);
}
/**
* 登录按钮点击监听
*/
public void login(View view) {
//如果没登录
if (!mTencent.isSessionValid()) {
loginQQ();
} else {
//如果已经登录了,点击按钮就调用logout()方法来退出qq
mTencent.logout(this);
Toast.makeText(this, "退出登录成功", Toast.LENGTH_SHORT).show();
login_btn.setText("点击登录");
}
}
/**
* 创建一个登录qq的方法
*/
private void loginQQ() {
/*
mTencent.login(Activity activity,String s,IUiListener IuIListener)
调用login()方法登录qq,
1,传入一个上下文,
2,一个获取用户信息的权限,我这里传入的是所有权限all,
3,回调监听,监听是否授权成功
*/
mTencent.login(this, "all", new IUiListener() {
//授权成功,
@Override
public void onComplete(Object object) {
Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
login_btn.setText("已登录,点击退出");
//成功之后返回的数据object是一串json数据
/*{
"access_token": "B784CECD31D1C22578F4790FEECE9B3B",
"authority_cost": 0,
"expires_in": 7776000,
"login_cost": 17574,
"msg": "",
"openid": "2EE8A32F5E1FB9E131CED0538B679296",
"pay_token": "DFCC73C38AF022356383355719CBFBFA",
"pf": "desktop_m_qq-10000144-android-2002-",
"pfkey": "37ad0a9ed6c2280b38ac73dd781b70af",
"query_authority_cost": 321,
"ret": 0
}
*/
getToken(object);//解析
}
//授权失败
@Override
public void onError(UiError uiError) {
Toast.makeText(MainActivity.this, "登陆失败", Toast.LENGTH_SHORT).show();
}
//取消授权
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "取消登录", Toast.LENGTH_SHORT).show();
}
});
}
/**
* 解析数据拿到token,openID,expires的方法,
*因为只有拿到这3货才能进一步去拿用户的信息
* @param value
* @return token
*/
private void getToken(final Object value) {
new Thread(new Runnable() {
@Override
public void run() {
try {
//解析拿到的数据,得到token
JSONObject jo = (JSONObject) value;
int ret = jo.getInt("ret");
if (ret == 0) {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
//拿到token
String accessToken = jo.getString("access_token");
//在拿到这两货
String openID = jo.getString("openid");
String expires = jo.getString("expires_in");
//**下面这两步设置很重要,如果没有设置,返回为空**
mTencent.setOpenId(openID);
mTencent.setAccessToken(accessToken, expires);
//去拿图像和昵称
UserInfo userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken());
//调用api方法去拿信息,在传入一个监听回调,看是否拿到用户信息
userInfo.getUserInfo(getQQinfoListener);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 通过token和openId重新监听,去拿到图像和昵称
*/
private IUiListener getQQinfoListener = new IUiListener() {
@Override
public void onComplete(final Object response) {
//response包含的信息
/*{
"city": "",
"figureurl": "http://qzapp.qlogo.cn/qzapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/30",
"figureurl_1": "http://qzapp.qlogo.cn/qzapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/50",
"figureurl_2": "http://qzapp.qlogo.cn/qzapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/100",
"figureurl_qq_1": "http://q.qlogo.cn/qqapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/40",
"figureurl_qq_2": "http://q.qlogo.cn/qqapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/100",
"gender": "男",
"is_lost": 0,
"is_yellow_vip": "0",
"is_yellow_year_vip": "0",
"level": "0",
"msg": "",
"nickname": " 段炼",
"province": "北京",
"ret": 0,
"vip": "0",
"yellow_vip_level": "0"
}
* */
//成功拿到这个信息调用这个方法
//开线程去解析数据
new Thread(new Runnable() {
@Override
public void run() {
try {
if (response != null) {
JSONObject jsonObject = (JSONObject) response;
//拿到qq登录的昵称
final String nickname = jsonObject.getString("nickname");
if (((JSONObject) response).has("figureurl")) {
//小头像的网址
final String userHeard = jsonObject.getString("figureurl_qq_1");
//大分辨率的头像网址
final String userHeard1 = jsonObject.getString("figureurl_qq_2");
//性别
String sex = jsonObject.getString("gender");
//省 如果是直辖市的话city为空,province显示为市
String province = jsonObject.getString("province");
//市,如果是直辖市的话city为空
String city = jsonObject.getString("city");
//开启主线程来更新Ui
runOnUiThread(new Runnable() {
@Override
public void run() {
//用户信息
mUserInformation.setText(response+"");
//昵称
mUserName.setText(nickname.toString());
//设置头像
Glide.with(MainActivity.this).load(userHeard1).into(mUserHead);
}
});
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void onError(UiError uiError) {
// 获取信息失败
}
@Override
public void onCancel() {
//取消
}
};
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.qqqlogindemo">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:screenOrientation="portrait"
android:launchMode="singleTask" >
<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="tencent1105721156" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
</application>
</manifest>
demo下载地址:http://download.csdn.net/detail/dl10210950/9648528