Android开发实现QQ三方登录 标签: android开发qq三方登录
本文分为两个部分:一是QQ的授权部分;二是获取用户的基本信息部分
一、授权部分
1.首先,先去腾讯开放平台获取APP ID和APP KEY(未注册腾讯开发者账号的可能需要先注册账号),获取的过程还是还是非常容易的(不用填写任何的应用程序信息)。
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三方登录的更多相关文章
- 实现QQ、微信、新浪微博和百度第三方登录(Android Studio)
前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第三方登录的实现,并拿出来与大家一同分享: 各大开放平台注册账户获取AppK ...
- Android 实现QQ、微信、新浪微博和百度第三方登录
前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第三方登录的实现,并拿出来与大家一同分享: 各大开放平台注册账户获取AppK ...
- Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy
原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...
- Android应用之——最新版本号SDK V2.4实现QQ第三方登录
为什么要写这篇博客呢?由于.我在做这个第三方登录的时候,找了非常多资料,发现要么就是过时了.要么就是说的非常不清楚.非常罗嗦.并且非常多都是一些小demo,不是什么实例.甚至连腾讯官方的文档都有这个问 ...
- 社会化登录分享-Android SDK的二次封装和使用
本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...
- Android深度探索(卷1)HAL与驱动开发
第一章 介绍Android驱动开发和移植技术 主要对android和linux做了总体的介绍,让我们有了个感性的认识. 一.Android的四层系统架构: a) Linux内核:Android是基于L ...
- 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭 ...
- 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速
作者:唐老师,华清远见嵌入式学院讲师. Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速度越来越快,但是随着新 版本的出现,其启动速度一直都比较慢,当然,作为程序员,我们 ...
- 【转】unity开发android游戏(一)搭建Unity安卓开发环境
http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...
随机推荐
- Mac使用ssh登录远程linux系统查看jetty日志及同时使用github工具
转载请注明出处:http://www.houxiurong.com/?post=27 Mac默认是安装了ssh工具软件的. 先用mac的 终端工具生成 id_rsa 和id_rsa.pub 秘钥,生成 ...
- C51端口结构和工作原理(转)
一.P0端口的结构及工作原理 P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器.输入缓冲器.切换开关.一个与非门.一个与门及场效应管驱动电路构成.再看图的右边,标号为P0.X引脚的 ...
- 使用jquery获取css的top和left属性
使用jquery获取css的top和left属性 因为left和top也都是普通的css属性所以可以使用如下代码来获取 var left = $('#test').css('left'); var t ...
- Laravel5.6安裝:Warning: require(../vendor/autoload.php): failed to open stream: No such file or directory
在phpstudy下使用composer+laravel安装器的方式安装了Laravel,但是访问的时候报错: Warning: require(D:\phpstudy\WWW\public\mybl ...
- Corn Fields 状压动归入门题
#include<cstdio> using namespace std; const int N=15; int dp[N][1<<N],v[1<<N],M[N] ...
- 网络是通的 yum用不了
Loaded plugins: fastestmirror, langpacks One of the configured repositories failed (Unknown),and yum ...
- linux部署.net core api并且实现上传图片
为了体验.net在linux上运行,所以使用HttpClient东借西抄做了一个简单的api上传功能. 第一步,简单的上传功能: public class UploadHelper { private ...
- [LUOGU]P4098[HEOI2013]ALO
BZOJ上的权限题,流下了贫穷的泪水... 可持久化trie的题. 一开始zz了,看错了题,以为是要把所有的宝石缩起来,后来仔细一看好像只缩一次...昨天刷了一晚上的语文病句题白做了... 这样的话就 ...
- 汇编-理解call,ret
; 有意思的东西,主函数调用子函数用汇编来理解 assume cs:codeseg codeseg segment start: main: call sub1 ; 调用子函数1, push IP1 ...
- Anaconda安装tensorflow遇到的问题(转)
tensorflow安装教程 1.找不到Anaconda Prompt 其他教程中说AnacondaPrompt在安装的Anaconda文件夹下面(如D:/Anaconda),但是我在安装中没有找到, ...