本文分为两个部分:一是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": ,
"openid": "19E8D43EB75ED256CAC70C02953F188A",
"access_token": "65A5A933F116085E051F39CAD65084EF",
"pay_token": "BA387A1679483A4C8585BE268C7C4128",
"expires_in": ,
"pf": "desktop_m_qq-10000144-android-2002-",
"pfkey": "2c7171fb052154f89e9d439e17e18c11",
"msg": "",
"login_cost": ,
"query_authority_cost": ,
"authority_cost":
}

二、获取用户的基本信息部分。(有用到上一部分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 = ;//昵称
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 = ;
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": ,
"msg": "",
"is_lost": ,
"nickname": "",
"gender": "",
"province": "",
"city": "",
"figureurl": "",
"figureurl_1": "",
"figureurl_2": "",
"figureurl_qq_1": "",
"figureurl_qq_2": "",
"is_yellow_vip": "",
"vip": "",
"yellow_vip_level": "",
"level": "",
"is_yellow_year_vip": ""
}

也可参照官方文档: 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 == ) {//获取昵称
tvNickName.setText((CharSequence) msg.obj);
} else if (msg.what == ) {//获取头像
headerLogo.setImageBitmap((Bitmap) msg.obj);
}
}
};

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

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

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

    前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第三方登录的实现,并拿出来与大家一同分享: 各大开放平台注册账户获取AppK ...

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

    前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第三方登录的实现,并拿出来与大家一同分享: 各大开放平台注册账户获取AppK ...

  3. Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy

    原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...

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

    为什么要写这篇博客呢?由于.我在做这个第三方登录的时候,找了非常多资料,发现要么就是过时了.要么就是说的非常不清楚.非常罗嗦.并且非常多都是一些小demo,不是什么实例.甚至连腾讯官方的文档都有这个问 ...

  5. 社会化登录分享-Android SDK的二次封装和使用

    本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...

  6. Android深度探索(卷1)HAL与驱动开发

    第一章 介绍Android驱动开发和移植技术 主要对android和linux做了总体的介绍,让我们有了个感性的认识. 一.Android的四层系统架构: a) Linux内核:Android是基于L ...

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

      在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭 ...

  8. 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速

    作者:唐老师,华清远见嵌入式学院讲师. Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速度越来越快,但是随着新 版本的出现,其启动速度一直都比较慢,当然,作为程序员,我们 ...

  9. 【转】unity开发android游戏(一)搭建Unity安卓开发环境

    http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...

随机推荐

  1. javaEE_maven_struts2_tomcat_first

    1 .eclipse中新建项目

  2. print输出带颜色的方法详解

    书写格式:     开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m      注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个:另外由于 ...

  3. pycharm一些快捷键

    1.鼠标方法在内建函数上,Ctrl+B,看内建函数的定义 2.pycharm单行和多行注释快捷键   单多行注释就一个组合键:选中+Ctrl+/ 3.Python代码块批量添加Tab缩进    按Ta ...

  4. 洛谷P1120 小木棍 [数据加强版]搜索

    玄学剪支,正好复习一下搜索 感觉搜索题的套路就是先把整体框架打出来,然后再一步一步优化剪枝 1.从maxv到sumv/2枚举长度(想一想,为什么) 2. 开一个桶,从大到小开始枚举 3. 在搜索中,枚 ...

  5. Ajax技术实战操练课堂学习笔记

    ajax是什么 ? ajax(asynchronouse javascript and xml) 异步的javascript 和 xml 是7种技术的综合,它包含了七个技术( javascript x ...

  6. 使用maven创建web项目时后面多出来Maven Webapp如何删除

    类似这样: 解决办法:

  7. Swagger在 NETcore 中的使用

    请参考 https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view=asp ...

  8. FreeMarker hello

    一.什么是 FreeMarker FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道  ...

  9. LaTeX 加粗

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50997822 LaTeX中文本加粗的方 ...

  10. 面试题(JVM加载机制)

    JVM加载class文件的原理机制? JVM中类的装载是classLoader 和它的子类来实现的,Java classLoader是个重要的java运行时的系统组件.它在运行时查找和装入类文件的类. ...