转载请注明出处
上一篇文章已经讲过如何注册QQ互联的开发者了。如果你还没有注册成为开发者请移步至
QQ互联开发者注册
点击SDK for 移动应用接入
直接点击Android_SDK_V3.1.0 就可以下载
下载完成后是个压缩包,解压后的结果就是下面这个样子,我下载的版本是3.1.0,如果你下载的版本不是这个版本或许有所不同。
将jar文件夹下的两个jar包导入到android studio中,
然后右击jar包,在菜单的下面会有个"Add as Library..."点击它,将这两个jar包加入到lib库。
刚刚导入的jar包里有已经实现好的Activity(就是点击使用QQ登录后弹出的授权Activity),所以需要在清单文件中配置一下
在节点下添加两个节点,内容如下:
<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="222222" />
intent-filter>
activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
activity>
注意!其中的 data android:scheme=”222222” 你需要将这个值替换为你自己创建的应用的appid。222222是腾讯给的测试appid,仅能够测试使用。
当然了,使用qq登录少不了权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
好了,到此,清单文件基本上配置完成了。下面开始写java代码
如果你想要使用qq的登录分享功能,你需要下面几个属性
private Tencent mTencent;
private String APP_ID = "222222";
private IUiListener loginListener;
private String SCOPE = "all"
其中,mTencent是必须要用到的一个对象,qq的登录分享功能等大部分都封装在了这个类里边。
APP_ID,是你创建应用时的appid,这个id必须跟你的清单文件里的 data android:scheme="222222"节点的值是一样的。
loginListener,是一个回调接口,在你登录或分享成功后会执行该接口。
SCOPE,应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”
详细权限见下图:
然后我们实现一个方法,用来初始化这些属性。
//初始化QQ登录分享的需要的资源
private void initQqLogin(){
mTencent = Tencent.createInstance(APP_ID, this);
//创建QQ登录回调接口
loginListener = new IUiListener() {
@Override
public void onComplete(Object o) {
//登录成功后回调该方法
Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(UiError uiError) {
//登录失败后回调该方法
Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
Log.e("LoginError:", uiError.toString());
}
@Override
public void onCancel() {
//取消登录后回调该方法
Toast.makeText(MainActivity.this, "取消登录", Toast.LENGTH_SHORT).show();
}
};
}
这么详细的注释就不用解释了吧。
然后我们还需要重写Activity中的onActivityResult方法。因为这个登录功能会打开一个Activity,而且要返回登录是否成功的结果,所以要重写该方法。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 官方文档上面的是错误的
// if(requestCode == Constants.REQUEST_API) {
// if(resultCode == Constants.RESULT_LOGIN) {
// mTencent.handleLoginData(data, loginListener);
// }
// resultCode 是log出来的,官方文档里给的那个属性是没有的
if (requestCode == Constants.REQUEST_LOGIN) {
if (resultCode == -1) {
Tencent.onActivityResultData(requestCode, resultCode, data, loginListener);
Tencent.handleResultData(data, loginListener);
}
}
}
最后写一个button实现一个监听调用一下
public void qqLogin(View view) {
initQqLogin();
mTencent.login(this, SCOPE, loginListener);
}
好了,到此,你的登录功能就已经实现了,运行一下试试吧。
当然了,我们用QQ登录不仅仅是判断下登录成功与否,还需要获得用户信息。
我们需要在登录成功后,将返回的openId记录下来。改写后的代码如下
loginListener = new IUiListener() {
@Override
public void onComplete(Object o) {
//登录成功后调用的方法
JSONObject jo = (JSONObject) o;
Toast.makeText(NewsMainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
Log.e("COMPLETE:", jo.toString());
String openID;
try {
openID = jo.getString("openid");
String accessToken = jo.getString("access_token");
String expires = jo.getString("expires_in");
mTencent.setOpenId(openID);
mTencent.setAccessToken(accessToken, expires);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError uiError) {
//登录失败后调用的方法
Toast.makeText(NewsMainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
//取消登录后调用的方法
}
};
有兴趣的话可以log一下返回的json数据。
与登录功能一样,要获取用户信息依然需要实现一个回调函数,我们在Activity中添加一个属性
private IUiListener userInfoListener;
然后在initQqLogin()方法中将这个回调接口实现出来
userInfoListener = new IUiListener() {
@Override
public void onComplete(Object o) {
if(o == null){
return;
}
try {
JSONObject jo = (JSONObject) o;
Log.e("JO:",jo.toString());
int ret = jo.getInt("ret");
String nickName = jo.getString("nickname");
String gender = jo.getString("gender");
Toast.makeText(MainActivity.this, "你好," + nickName,Toast.LENGTH_LONG).show();
} catch (Exception e) {
}
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
};
这里说明一下返回的json数据。有兴趣的可以log一下。大致包含,昵称,性别,不同尺寸的qq头像url,不同尺寸的qq空间头像url。
if (requestCode == Constants.REQUEST_LOGIN) {
if (resultCode == -1) {
Tencent.onActivityResultData(requestCode, resultCode, data, loginListener);
Tencent.handleResultData(data, loginListener);
UserInfo info = new UserInfo(this, mTencent.getQQToken());
info.getUserInfo(userInfoListener);
}
}
好了,到此,你就可以拿到qq用户的信息了
实现分享功能也很简单,与获取用户信息一样,需要一个回调接口,我们在initQqLogin()方法中将这个回调接口实现出来
//qq分享的回调接口
shareListener = new IUiListener() {
@Override
public void onComplete(Object o) {
//分享成功后回调
Toast.makeText(MainActivity.this, "分享成功!", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(UiError uiError) {
//分享失败后回调
}
@Override
public void onCancel() {
//取消分享后回调
}
};
然后写一个按钮,写一个监听
public void qqShare(View view) {
Bundle params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
params.putString(QQShare.SHARE_TO_QQ_TITLE, "标题");
params.putString(QQShare.SHARE_TO_QQ_SUMMARY,"摘要");
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL,"http://blog.csdn.net/u013451048");
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://avatar.csdn.net/C/3/D/1_u013451048.jpg");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "CSDN");
mTencent.shareToQQ(this, params, shareListener);
}
从上到下依次是设置分享的类型,是图文,纯图片,纯文本等,分享的标题,摘要,分享的url链接,分享的图片,分享的来源
Demo在shareqqdemo目录下
如果你还不能运行,且提示的错误是appid的问题的话,那么在清单文件中修改scheme节点为 data android:scheme="tencent222222" 。同样将222222替换为你自己的appid,保留tencent字段。