Android开发实现QQ三方登录 标签: android开发qq三方登录

本文分为两个部分:一是QQ的授权部分;二是获取用户的基本信息部分

一、授权部分

1.首先,先去腾讯开放平台获取APP ID和APP KEY(未注册腾讯开发者账号的可能需要先注册账号),获取的过程还是还是非常容易的(不用填写任何的应用程序信息)。

http://open.qq.com/

2.下载SDK(http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD

3.下载好SDK后,将其中的两个jar包(mta-sdk-1.6.2.jar、open_sdk_r5276.jar)引入到工程当中。

4.在AndroidManifest.xml的application标签中添加一下两个activity。

<activity
   android:name="com.tencent.tauth.AuthActivity"
   android:noHistory="true"
   android:launchMode="singleTask" >
    <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="tencent*********" />
    </intent-filter>
</activity>  

<activity android:name="com.tencent.connect.common.AssistActivity"
      android:theme="@android:style/Theme.Translucent.NoTitleBar"
      android:configChanges="orientation|keyboardHidden|screenSize"
/>  

注意:上面<data android:scheme="tencent*********" />中的*****要替换成自己一开始获取到的APP ID(假设APP ID是123456,则替换后为:scheme="tencent123456")。

5.添加访问网络的权限。

<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" />  

6.Java实现:接下来需要两个对象(布局文件和控件的初始化自行另外解决)

         //需要腾讯提供的一个Tencent类
         private Tencent mTencent;
        //还需要一个IUiListener 的实现类(LogInListener implements IUiListener)
         private LogInListener mListener;  

        //首先需要用APP ID 获取到一个Tencent实例
        mTencent = Tencent.createInstance(QQ_APP_ID, this.getApplicationContext());
        //初始化一个IUiListener对象,在IUiListener接口的回调方法中获取到有关授权的某些信息
        // (千万别忘了覆写onActivityResult方法,否则接收不到回调)
        mListener = new LogInListener();  

其中,LogInListener是IUiListener的实现类,其中的回调方法用来接收授权后的相关信息:

private class LogInListener implements IUiListener {  

        @Override
        public void onComplete(Object o) {
            Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_LONG).show();
            System.out.println("o.toString() ------------------------->        " + o.toString());
        }  

        @Override
        public void onError(UiError uiError) {  

            Toast.makeText(MainActivity.this, "授权出错!", Toast.LENGTH_LONG).show();
        }  

        @Override
        public void onCancel() {
            Toast.makeText(MainActivity.this, "授权取消!", Toast.LENGTH_LONG).show();
        }
    }  

注意:别忘了覆写onActivityResult方法,否则接收不到回调

    //确保能接收到回调
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);  

        Tencent.onActivityResultData(requestCode, resultCode, data, mListener);
    }  

7.登录与登出

                  //调用QQ登录,用IUiListener对象作参数(点击登录按钮时执行以下语句)
                    if (!mTencent.isSessionValid()) {
                        mTencent.login(MainActivity.this, "all", mListener);
                    }  

                   //登出比较简单
                    mTencent.logout(MainActivity.this);  

如此整个授权的流程就ok了,我们可以在onComplete回调方法中获取到授权的信息。

顺便提一下,上面IUiListener的onComplete回调方法参数Object对象的格式为:

{
    "ret": 0,
    "openid": "19E8D43EB75ED256CAC70C02953F188A",
    "access_token": "65A5A933F116085E051F39CAD65084EF",
    "pay_token": "BA387A1679483A4C8585BE268C7C4128",
    "expires_in": 7776000,
    "pf": "desktop_m_qq-10000144-android-2002-",
    "pfkey": "2c7171fb052154f89e9d439e17e18c11",
    "msg": "",
    "login_cost": 442,
    "query_authority_cost": 322,
    "authority_cost": 0
}  

二、获取用户的基本信息部分。(有用到上一部分onComplete回调方法中传回来的Object对象)

上面只是实现了授权,并未拿到用户的基本信息,下面是这部分的实现

8.在第6步中的onComplete回调方法中添加以下语句

       @Override
        public void onComplete(Object o) {
            Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_LONG).show();
            System.out.println("o.toString() ------------------------->        " + o.toString());  

            JSONObject jsonObject = (JSONObject) o;  

            //设置openid和token,否则获取不到下面的信息
            initOpenidAndToken(jsonObject);
            //获取QQ用户的各信息
            getUserInfo();
        }  

其中,initOpenidAndToken 与 getUserInfo的实现如下

private void initOpenidAndToken(JSONObject jsonObject) {
        try {
            String openid = jsonObject.getString("openid");
            String token = jsonObject.getString("access_token");
            String expires = jsonObject.getString("expires_in");  

            mTencent.setAccessToken(token, expires);
            mTencent.setOpenId(openid);  

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }  

    private void getUserInfo() {  

        //sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息
        QQToken mQQToken = mTencent.getQQToken();
        UserInfo userInfo = new UserInfo(MainActivity.this, mQQToken);
        userInfo.getUserInfo(new IUiListener() {
                                 @Override
                                 public void onComplete(final Object o) {
                                     JSONObject userInfoJson = (JSONObject) o;
                                     Message msgNick = new Message();
                                     msgNick.what = 0;//昵称
                                     try {
                                         msgNick.obj = userInfoJson.getString("nickname");//直接传递一个昵称的内容过去
                                     } catch (JSONException e) {
                                         e.printStackTrace();
                                     }
                                     mHandler.sendMessage(msgNick);
                                     //子线程 获取并传递头像图片,由Handler更新
                                     new Thread(new Runnable() {
                                         @Override
                                         public void run() {
                                             Bitmap bitmapHead = null;
                                             if (((JSONObject) o).has("figureurl")) {
                                                 try {
                                                     String headUrl = ((JSONObject) o).getString("figureurl_qq_2");
                                                     bitmapHead = Util.getbitmap(headUrl);
                                                 } catch (JSONException e) {
                                                     e.printStackTrace();
                                                 }
                                                 Message msgHead = new Message();
                                                 msgHead.what = 1;
                                                 msgHead.obj = bitmapHead;
                                                 mHandler.sendMessage(msgHead);
                                             }
                                         }
                                     }).start();  

                                 }  

                                 @Override
                                 public void onError(UiError uiError) {
                                     Log.e("GET_QQ_INFO_ERROR", "获取qq用户信息错误");
                                     Toast.makeText(MainActivity.this, "获取qq用户信息错误", Toast.LENGTH_SHORT).show();
                                 }  

                                 @Override
                                 public void onCancel() {
                                     Log.e("GET_QQ_INFO_CANCEL", "获取qq用户信息取消");
                                     Toast.makeText(MainActivity.this, "获取qq用户信息取消", Toast.LENGTH_SHORT).show();
                                 }
                             }
        );
    }  

其中,自定义的Util类如下

public class Util {
    public static String TAG="UTIL";
    public static Bitmap getbitmap(String imageUri) {
        Log.v(TAG, "getbitmap:" + imageUri);
        // 显示网络上的图片
        Bitmap bitmap = null;
        try {
            URL myFileUrl = new URL(imageUri);
            HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();  

            Log.v(TAG, "image download finished." + imageUri);
        } catch (IOException e) {
            e.printStackTrace();
            Log.v(TAG, "getbitmap bmp fail---");
            return null;
        }
        return bitmap;
    }
}  

顺便提一下,虽然这里也是一个IUiListener的回调,但是onComplete的参数o的json数据内容与获取权限时的那个不一样,如下:

{
    "ret": 0,
    "msg": "",
    "is_lost": 0,
    "nickname": "",
    "gender": "",
    "province": "",
    "city": "",
    "figureurl": "",
    "figureurl_1": "",
    "figureurl_2": "",
    "figureurl_qq_1": "",
    "figureurl_qq_2": "",
    "is_yellow_vip": "0",
    "vip": "0",
    "yellow_vip_level": "0",
    "level": "0",
    "is_yellow_year_vip": "0"
}  

也可参照官方文档: http://wiki.open.qq.com/wiki/v3/user/get_info

9.Handler部分(这里我只拿了头像和昵称,若要获得其他信息,对照上面这个json数据取相应的值就可以了)

     //显示获取到的头像和昵称
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {//获取昵称
                tvNickName.setText((CharSequence) msg.obj);
            } else if (msg.what == 1) {//获取头像
                headerLogo.setImageBitmap((Bitmap) msg.obj);
            }
        }
    };  

Demo下载地址:http://download.csdn.net/detail/highboys/9597386

时间: 2024-08-27 01:11:45

Android开发实现QQ三方登录 标签: android开发qq三方登录的相关文章

实现QQ、微信、新浪微博和百度第三方登录(Android Studio)

前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第三方登录的实现,并拿出来与大家一同分享: 各大开放平台注册账户获取AppKey和AppSecret Mob开放平台地址:http://www.mob.com/#/index QQ开放平台地址:http://open.qq.com/ 新浪微博开放平台地址:http://open.weibo.com/ 微信开放平台地址:https://open.weixin.qq.com/ 

Android 实现QQ、微信、新浪微博和百度第三方登录

前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第三方登录的实现,并拿出来与大家一同分享: 各大开放平台注册账户获取AppKey和AppSecret Mob开放平台地址:http://www.mob.com/#/index QQ开放平台地址:http://open.qq.com/ 新浪微博开放平台地址:http://open.weibo.com/ 微信开放平台地址:https://open.weixin.qq.com/ 

MingQQ Android版发布了,可以在Android手机上登录你的QQ,收发消息哦...

最近为了学习Android开发,特意将原来写的MingQQ Windows版移植到了Android上面,以此练手.通过这次练习,学习到了不少Android开发的相关知识,特别是界面开发部分. MingQQ的界面模仿了Android QQ的基本功能,虽然体验性完全比不上QQ,但目前技术有限,只能做到现在这水平了,更好的界面用户体验留待以后再提升吧. 下拉刷新目前使用了第三方开源库Android-PullToRefresh,以后再考虑替换成自己写的下拉刷新组件,并增加消息列表的右滑删除功能. 发布的

Android应用之——最新版本SDK V2.4实现QQ第三方登录

为什么要写这篇博客呢?因为,我在做这个第三方登录的时候,找了很多资料,发现要么就是过时了,要么就是说的很不清楚,很罗嗦,而且很多都是一些小demo,不是什么实例,甚至连腾讯官方的文档都有这个问题,文档中很多地方用的不是最新的sdk写的示例,用最新版本的sdk发现根本没法达到预期的效果,很多api已经发生了变化,demo还是用的原来的api中的方法,最坑爹是demo下载下来还要一个支持的库文件,但是sdk中又没有提供.. 自己跌跌撞撞,查找资料,整合,弄了几个小时,终于把它给整出来了,用在了开发的

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

ym——android源码大放送(实战开发必备)

文件夹 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.com文件列表生成工具.bat │  使用说明.txt │  免费下载更多源码.url │  目录列表.txt │ ├─android web应用 │      jqmDemo_static.zip │      jqmMobileDemo-master.zip │      jqmMobileDemo1_1-master.zip │      Location1014.rar │ ├─anko │      

Android开发工程师应该知道的50个开发秘诀、技巧和资源分享

作者撰写本文的初衷,是为了罗列出Android Studio有用的提示.技巧.快捷方式和参考资源,将提高您的整体效率和操作性能. 显然,还有很多优化.快捷方式等,但作者为了保持这篇文章的简短,限制为50个,希望读者会喜欢这篇文章! InfoQ注:本文是以MacOS X操作Android Studio为例,与Windows / Linux不一致的地方已经标注,请读者注意这一点. 可视化 1.Android Logcat的材料颜色主题(Material Colors theme). 要更改Andro

五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程

在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭建,文章写的尽量详细,希望对准备进入Android开发的朋友有帮助. 本教程将分为五个步骤来完成Android开发环境的部署. 第一步:安装JDK. 第二步:配置Windows上JDK的变量环境 . 第三步: 下载安装Eclipse . 第四步:下载安装Android SDK . 第五步:为Eclips

转:移动平台前端开发总结(针对iphone,Android等手机)

原文连接: http://binghe19890918.blog.163.com/blog/static/117904124201311945714174/ 移动平台前端开发是指针对高端智能手机(如Iphone.Android)做站点适配也就是WebApp,并非是针对普通手机开发Wap 2.0,所以在阅读本篇文章以前,你需要对webkit内核的浏览器有一定的了解,需要对HTML5和CSS3有一定的了解. 1.首先我们来看看webkit内核中的一些私有的meta标签,这些meta标签在开发weba