android 实现QQ第三方登录,分享功能

转载请注明出处


配置项目

上一篇文章已经讲过如何注册QQ互联的开发者了。如果你还没有注册成为开发者请移步至

QQ互联开发者注册

1. 下载SDK。

android 实现QQ第三方登录,分享功能_第1张图片

点击SDK for 移动应用接入

android 实现QQ第三方登录,分享功能_第2张图片

直接点击Android_SDK_V3.1.0 就可以下载

2. 导入jar包

下载完成后是个压缩包,解压后的结果就是下面这个样子,我下载的版本是3.1.0,如果你下载的版本不是这个版本或许有所不同。

android 实现QQ第三方登录,分享功能_第3张图片

将jar文件夹下的两个jar包导入到android studio中,

android 实现QQ第三方登录,分享功能_第4张图片

然后右击jar包,在菜单的下面会有个"Add as Library..."点击它,将这两个jar包加入到lib库。

3. 配置AndroidManifest.xml文件

    刚刚导入的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代码

实现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”

详细权限见下图:

android 实现QQ第三方登录,分享功能_第5张图片

然后我们实现一个方法,用来初始化这些属性。
 //初始化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登录不仅仅是判断下登录成功与否,还需要获得用户信息。

1. 改写loginListener的登录成功的方法。

我们需要在登录成功后,将返回的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数据。

2. 添加userInfoiuiListener回调接口

与登录功能一样,要获取用户信息依然需要实现一个回调函数,我们在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。

android 实现QQ第三方登录,分享功能_第6张图片

3.改写onActivityResult方法

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问题

如果你还不能运行,且提示的错误是appid的问题的话,那么在清单文件中修改scheme节点为 data android:scheme="tencent222222" 。同样将222222替换为你自己的appid,保留tencent字段。

你可能感兴趣的:(学习笔记)