目录

QQ登陆实现+本地存储

 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 加载头像