1.准备工作
前往腾讯开放平台申请APPID;下载 QQ互联SDK 并导入工程的 libs 文件夹,在 AndroidManifest 配置登陆所需权限:
1
2
3
4
|
<!-- QQ登录授权所需权限 -->
<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" />
|
并注册SDK中集成的登陆Activity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<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="tencent1106181213" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
|
2.LoginActivity
新建一个LoginActivity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
public class LoginActivity extends BaseActivity {
private static final String APPID = "你的APPID";
private Tencent mTencent;
private QQLoginListener mListener;
private GetInfoListener mInfoListener;
@SuppressLint("CommitPrefEdits")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//关闭页面
Button button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
init();
}
private void init() {
Button qqlogin = findViewById(R.id.qq_login);
if (mTencent == null) {
mTencent = Tencent.createInstance(APPID, this);
}
//初始化登陆回调Listener
if (mListener == null) {
mListener = new QQLoginListener();
}
//登陆按钮点击事件
qqlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
QQLogin();
}
});
}
private void QQLogin() {
if (!mTencent.isSessionValid()) {
mTencent.login(this, "all", mListener);
}
}
private void QQLogout() {
mTencent.logout(this);
/* if (mTencent.isSessionValid()) {
mTencent.logout(this);
//修改UI
Toast.makeText(LoginActivity.this,"您已退出登陆", Toast.LENGTH_LONG).show();
}*/
}
private class QQLoginListener implements IUiListener {
@Override
public void onComplete(Object o) { //登录成功
parseResult(o);
setUserInfo();
}
@Override
public void onError(UiError uiError) { //登录失败
}
@Override
public void onCancel() { //取消登陆
}
}
private void parseResult(Object o) {
JSONObject jsonObject = (JSONObject) o;
try {
String qqOpenId = jsonObject.getString("openid"); //用户标识
String qqToken = jsonObject.getString("access_token"); //登录信息
String expires = jsonObject.getString("expires_in"); //token有效期
//配置token
mTencent.setOpenId(qqOpenId);
mTencent.setAccessToken(qqToken, expires);
} catch (JSONException e) {
e.printStackTrace();
}
}
private void setUserInfo() {
QQToken qqToken = mTencent.getQQToken();
UserInfo userInfo = new UserInfo(this, qqToken);
if (mInfoListener == null) {
mInfoListener = new GetInfoListener();
}
userInfo.getUserInfo(mInfoListener);
}
private class GetInfoListener implements IUiListener {
@Override
public void onComplete(Object o) { //获取成功,开始展示
JSONObject jsonObject = (JSONObject) o;
try {
String userName = jsonObject.getString("nickname");
String headPicUrl = jsonObject.getString("figureurl_qq_2");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError uiError) { //获取失败
}
@Override
public void onCancel() {
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Tencent.onActivityResultData(requestCode, resultCode, data, mListener);
Tencent.handleResultData(data, mListener);
}
}
|
分析:先实例化 init 函数里面的信息;绑定一个登陆 button 并设置监听事件,点击 button 执行 QQLogin 函数,用户授权登陆后即可获取QQ信息。
3.用户信息的本地存储
获取信息后我们需要将用户信息存储在本地(并不是每次打开app都执行登陆请求),由于使用 sqlite 过程过于繁琐,我采用 SharedPreferences 进行本地信息存储。
3.1声明变量
private SharedPreferences sp ;
SharedPreferences.Editor edit;
在 OnCreate 中实例化:
sp = getSharedPreferences("LoginInfo", Context.MODE_PRIVATE);
edit = sp.edit();
代码执行后将在手机里创建一个名为”LoginInfo”的xml文件
3.2信息存储
修改以下两种函数为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
private void parseResult(Object o) {
JSONObject jsonObject = (JSONObject) o;
try {
String qqOpenId = jsonObject.getString("openid"); //用户标识
String qqToken = jsonObject.getString("access_token"); //登录信息
String expires = jsonObject.getString("expires_in"); //token有效期
//通过editor对象写入数据
edit.putString("LoginState","qq");
edit.putString("qqOpenId",qqOpenId);
edit.putString("qqToken",qqToken);
edit.putString("expires",expires);
edit.apply();
//配置token
mTencent.setOpenId(qqOpenId);
mTencent.setAccessToken(qqToken, expires);
} catch (JSONException e) {
e.printStackTrace();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Override
public void onComplete(Object o) { //获取成功,开始展示
JSONObject jsonObject = (JSONObject) o;
try {
String userName = jsonObject.getString("nickname");
String headPicUrl = jsonObject.getString("figureurl_qq_2");
edit.putString("userName",userName);
edit.putString("headPicUrl",headPicUrl);
edit.apply();
Toast.makeText(LoginActivity.this,"登陆成功!", Toast.LENGTH_LONG).show();
finish();
} catch (Exception e) {
e.printStackTrace();
}
}
|
此时用户名、用户头像、openid等信息已经存储到xml文件里;
3.3数据调用
在你想要展示用户数据的Activity,相同的操作
private SharedPreferences sp;
实例化
sp = getSharedPreferences("LoginInfo", Context.MODE_PRIVATE);
获取用户名
String nickname = sp.getString("userName","null");
使用 Picasso 加载头像