前言:以前做登录时都是使用mob等第三方平台,后来看见腾讯自己的SDK实现起来也非常的简介,以此做记录。
1、效果图:
登录前:
登录后:
2、腾讯SDK下载链接:
http://wiki.open.qq.com/wiki/mobile/SDK下载
解压后依次打开opensdk_lite+demo>libs,找到open_sdk_r6008_lite.jar
并复制到如下图目录下,并右键Add As Library
腾讯QQ APP ID的获取 注册网址:https://open.tencent.com/
点开管理中心找到即可(应用不需要审核上架)
3、登录界面
public class TestActivity extends AppCompatActivity {
private static final String TAG = "TestActivity";
//QQ包名
private static final String PACKAGE_QQ = "com.tencent.mobileqq";
//微信包名
private static final String PACKAGE_WEIXIN = "com.tencent.mm";
//新浪微博包名
private static final String PACKAGE_WEIBO = "com.sina.weibo";
//展示个人信息
private TextView infoText, infoName;
private ImageView infoIcon;
//初始化腾讯服务
private Tencent mTencent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//腾讯AppId(替换你自己App Id)、上下文
mTencent = Tencent.createInstance("1107123456", this);
infoText = this.findViewById(R.id.text_info);
infoIcon = this.findViewById(R.id.info_icon);
infoName = this.findViewById(R.id.info_name);
//登录点击事件
findViewById(R.id.button_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//注意:此段非必要,如果手机未安装应用则会跳转网页进行授权
if (!hasApp(TestActivity.this, PACKAGE_QQ)) {
Toast.makeText(TestActivity.this, "未安装QQ应用",
Toast.LENGTH_SHORT).show();
return;
}
//如果session无效,就开始做登录操作
if (!mTencent.isSessionValid()) {
loginQQ();
}
}
});
}
/**
* QQ登录
*/
private IUiListener listener;
private void loginQQ() {
listener = new IUiListener() {
@Override
public void onComplete(Object object) {
Log.e(TAG, "登录成功: " + object.toString() );
JSONObject jsonObject = (JSONObject) object;
try {
//得到token、expires、openId等参数
String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);
mTencent.setAccessToken(token, expires);
mTencent.setOpenId(openId);
Log.e(TAG, "token: " + token);
Log.e(TAG, "expires: " + expires);
Log.e(TAG, "openId: " + openId);
//获取个人信息
getQQInfo();
} catch (Exception e) {
}
}
@Override
public void onError(UiError uiError) {
//登录失败
Log.e(TAG, "登录失败" + uiError.errorDetail);
Log.e(TAG, "登录失败" + uiError.errorMessage);
Log.e(TAG, "登录失败" + uiError.errorCode + "");
}
@Override
public void onCancel() {
//登录取消
Log.e(TAG, "登录取消");
}
};
//context上下文、第二个参数SCOPO 是一个String类型的字符串,表示一些权限
//应用需要获得权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”
//第三个参数事件监听器
mTencent.login(this, "all", listener);
//注销登录
//mTencent.logout(this);
}
/**
* 获取QQ个人信息
*/
private void getQQInfo() {
//获取基本信息
QQToken qqToken = mTencent.getQQToken();
UserInfo info = new UserInfo(this, qqToken);
info.getUserInfo(new IUiListener() {
@Override
public void onComplete(Object object) {
try {
Log.e(TAG, "个人信息:" + object.toString());
infoText.setText(object.toString());
//头像
String avatar = ((JSONObject) object).getString("figureurl_2");
GlideUtils.showGlide(TestActivity.this, avatar, infoIcon);
String nickName = ((JSONObject) object).getString("nickname");
infoName.setText(nickName);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
});
}
/**
* 回调必不可少,官方文档未说明
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//腾讯QQ回调
Tencent.onActivityResultData(requestCode, resultCode, data, listener);
if (requestCode == Constants.REQUEST_API) {
if (resultCode == Constants.REQUEST_LOGIN) {
Tencent.handleResultData(data, listener);
}
}
}
/**
* true 安装了相应包名的app
*/
private boolean hasApp(Context context, String packName) {
boolean is = false;
List<PackageInfo> packages = context.getPackageManager()
.getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
String packageName = packageInfo.packageName;
if (packageName.equals(packName)) {
is = true;
}
}
return is;
}
}
对应布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="10dp"
tools:context=".activity.TestActivity">
<ImageView
android:id="@+id/info_icon"
android:src="@mipmap/ic_launcher"
android:layout_width="150dp"
android:layout_height="150dp" />
<TextView
android:gravity="center"
android:id="@+id/info_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
<TextView
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:id="@+id/text_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp" />
<Button
android:id="@+id/button_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="QQ登录" />
</LinearLayout>
4、扩展:代码中图片加载框架
//图片加载
implementation 'com.github.bumptech.glide:glide:4.7.1'
格式化个人信息:网址:https://www.bejson.com/