在APP开发过程中,时常会用到第三方账号登录体系。

下面,简要说明QQ的第三方登录体系在Android平台上的运用。

申请APPID

进入QQ互联的官网,http://connect.qq.com/

在管理中心中创建移动应用。

创建完成后,可以得到APPID。

并在下方的协作者测试号中,填写控应用测试用的QQ号码。

导入Jar包

将下载得到的Jar包导入工程,并在AndroidManifest.xml文件中进行注册。
        <activityandroid: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="tencent100546930" /></intent-filter></activity>

其中,<data android:scheme="tencent100546930" />中的数字需要替换成自己申请得到的APPID。

创建登录接口

所有的SDK接口调用,都会传入一个回调,用以接收SDK返回的调用结果。回调的主要接口有两种:

(1) IUiListener:调用SDK已经封装好的接口时,例如:登录、快速支付登录、应用分享、应用邀请等接口。

(2) IRequestListener:使用requestAsync、request等通用方法调用sdk未封装的接口时,例如上传图片、查看相册等。

在这里创建IUiListener接口实现相应的登录授权操作:

    private void onClickLogin() {if (!mTencent.isSessionValid()) {IUiListener listener = new IUiListener() {/** 授权失败的回调*/@Overridepublic void onError(UiError arg0) {// TODO Auto-generated method stubToast.makeText(LoginActivity.this, "授权失败", 1000).show();Message msg = new Message();msg.arg1 = 2;handler.sendMessage(msg);    }/** 授权成功的回调*/@Overridepublic void onComplete(JSONObject arg0) {// TODO Auto-generated method stubToast.makeText(LoginActivity.this, "授权成功", 1000).show();Message msg = new Message();msg.what = 2;msg.arg1 = 1;msg.obj = arg0;handler.sendMessage(msg);}/** 取消授权的回调*/@Overridepublic void onCancel() {// TODO Auto-generated method stubToast.makeText(LoginActivity.this, "取消授权", 1000).show();Message msg = new Message();msg.arg1 = 3;handler.sendMessage(msg); }};mTencent.login(this, SCOPE, listener);} else {mTencent.logout(this);}}

其中,mTencent为QQSDK主要实现类Tencent类的实例。

       // Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。// 其中APP_ID是分配给第三方应用的appid,类型为String。mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());

将handler进行实例化

       handler = new Handler(this);

并将类实现Callback接口,即可对上述类进行Handler的处理操作。

   @Overridepublic boolean handleMessage(Message msg) {// TODO Auto-generated method stubswitch (msg.arg1) {case 1: { // 成功JSONObject object = (JSONObject) msg.obj;try {openid = object.getString("openid").toString();sBuilder.append("openid为:"+openid+"\n");access_token = object.getString("access_token").toString();url = url + "?access_token="+access_token+"&oauth_consumer_key="+APP_ID+"&openid="+openid+"&format=json";new MyUrlThread(url.toString(), 2,sHandler).start();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 2: { // 失败Toast.makeText(this, "", Toast.LENGTH_SHORT).show();return false;}case 3: { // 取消Toast.makeText(this, "", Toast.LENGTH_SHORT).show();return false;}}return false;}

如果授权成功,即可得到返回的Openid。

从而,可以根据Openid调用腾讯所提供的官方接口,实现需要的操作。

接收回调

   //应用调用Andriod_SDK接口时,使能成功接收到回调@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stub

应用实例代码

package com.test.wotao;import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;import org.json.JSONException;
import org.json.JSONObject;import com.tencent.plus.TouchView;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;
import com.test.util.MyApplication;
import com.test.util.MyThread;
import com.test.util.MyUrlThread;import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.os.StrictMode;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.BaseInputConnection;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
/*** 创建时间:2013-10-30
APP ID:100546930
APP KEY:6ff068cfbae8fa0b53f9a3c27f1af321* @author 402-9**/public class LoginActivity extends Activity implements OnClickListener,Callback{private Button login_qq;private TextView nickname;private ImageView image;private Tencent mTencent;private String imageurl;String url_qqlogin;private String openid;private String access_token;private String SCOPE = "get_simple_userinfo,add_topic";private static final String APP_ID = "100546930";private String url = "https://graph.qq.com/user/get_user_info";private Handler handler;private StringBuilder sBuilder = new StringBuilder();private Handler sHandler = new Handler(){public void handleMessage(Message msg) {if (msg.what == 2) {String result = msg.obj.toString();JSONObject data;try {data = new JSONObject(result);String ret = data.getString("ret");String messsage = data.getString("msg");if (Integer.valueOf(ret) == 0) {String name = data.getString("nickname");sBuilder.append("nickname为:"+name+"\n");String gender = data.getString("gender");sBuilder.append("gender为:"+gender+"\n");imageurl = data.getString("figureurl_1");sBuilder.append("imageurl为:"+imageurl+"\n");
//                      image.setImageDrawable(Drawable.createFromStream(new URL(imageurl).openConnection()
//                      .getInputStream(), "src"));url_qqlogin = "jiekou.php?code=qq_user&nickname="+name+"&email="+name+"@qq.com&figureurl="+imageurl+"&sex="+gender+"&openid="+openid+"&accesstoken="+access_token;System.out.println("url_qqlogin----"+url_qqlogin);new MyThread(url_qqlogin.toString(), 1,qqHandler).start();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("sBuilder---"+sBuilder);nickname.setText(sBuilder);}};};private Handler qqHandler = new Handler(){public void handleMessage(Message msg) {if (msg.what==1) {String result = msg.obj.toString();JSONObject data;try {data = new JSONObject(result);String nickname = data.getString("nickname");String message = data.getString("msg");sBuilder.append("QQ的nickname为:"+nickname+"\n");sBuilder.append("QQ的message为:"+message+"\n");System.out.println("333==="+sBuilder);Toast.makeText(LoginActivity.this, message, 1000).show();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}nickname.setText(sBuilder);}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.login_qq);handler = new Handler(this);// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。// 其中APP_ID是分配给第三方应用的appid,类型为String。mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());login_qq = (Button) findViewById(R.id.login_qq);login_qq.setOnClickListener(this);nickname = (TextView) findViewById(R.id.nickname);image = (ImageView) findViewById(R.id.image);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.login_qq:onClickLogin();break;}}//应用调用Andriod_SDK接口时,使能成功接收到回调@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubmTencent.onActivityResult(requestCode, resultCode, data);}private void onClickLogin() {if (!mTencent.isSessionValid()) {IUiListener listener = new IUiListener() {/** 授权失败的回调*/@Overridepublic void onError(UiError arg0) {// TODO Auto-generated method stubToast.makeText(LoginActivity.this, "授权失败", 1000).show();Message msg = new Message();msg.arg1 = 2;handler.sendMessage(msg); }/** 授权成功的回调*/@Overridepublic void onComplete(JSONObject arg0) {// TODO Auto-generated method stubToast.makeText(LoginActivity.this, "授权成功", 1000).show();Message msg = new Message();msg.what = 2;msg.arg1 = 1;msg.obj = arg0;handler.sendMessage(msg);}/** 取消授权的回调*/@Overridepublic void onCancel() {// TODO Auto-generated method stubToast.makeText(LoginActivity.this, "取消授权", 1000).show();Message msg = new Message();msg.arg1 = 3;handler.sendMessage(msg); }};mTencent.login(this, SCOPE, listener);} else {mTencent.logout(this);}}@Overridepublic boolean handleMessage(Message msg) {// TODO Auto-generated method stubswitch (msg.arg1) {case 1: { // 成功JSONObject object = (JSONObject) msg.obj;try {openid = object.getString("openid").toString();sBuilder.append("openid为:"+openid+"\n");access_token = object.getString("access_token").toString();url = url + "?access_token="+access_token+"&oauth_consumer_key="+APP_ID+"&openid="+openid+"&format=json";new MyUrlThread(url.toString(), 2,sHandler).start();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 2: { // 失败Toast.makeText(this, "", Toast.LENGTH_SHORT).show();return false;}case 3: { // 取消Toast.makeText(this, "", Toast.LENGTH_SHORT).show();return false;}}return false;}
}

【Android】第三方QQ账号登录的实现相关推荐

  1. Java 实现第三方 QQ 账号登录

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | uidaima.com/blog/472561 ...

  2. Java实现了第三方qq账号登录...

    文章目录 实现思路 QQ登录 总结 实现思路 创业初期 归结为创业初期是因为这个时候用户量比较少,甚至还没有接入上面所说的其他第三方的账户系统,只是自建的体系就可以满足,自建体系的话,目前常用的有 用 ...

  3. java string转jsonobject_超赞!终于有网友用Java实现了第三方qq账号登录

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 整理 | Java面试那些事儿 来源 | http://www.zuidaima.com/ 网站地址:https://conn ...

  4. python的flask实现第三方登录怎么写_Python语言的Flask框架应用程序实现使用QQ账号登录的方法...

    本文主要向大家介绍了Python语言的Flask框架应用程序实现使用QQ账号登录的方法,希望对大家学习Python语言有所帮助. Flask-OAuthlib是OAuthlib的Flask扩展实现, ...

  5. Python学习笔记7:实操案例四(支付密码的验证,模拟QQ账号登录,商品价格竞猜,星座看运势)

    Python学习笔记7:实操案例四(支付密码的验证,模拟QQ账号登录,商品价格竞猜,星座看运势) 1.支付密码的验证: 这个主要就是调用isdigit()函数判断字符串是不是全是数字组成. pwd=i ...

  6. tp框架实现第三方QQ快捷登录

    最近公司更新商城网站平台,原来基础上新增许多功能,接到任务实现第三方QQ快捷登录,功能已实现,今天特梳理一下.大致流程首先在开发者开放平台QQ互联注册应用,把你的域名空间注册,一般域名空间备过案的比较 ...

  7. Android第三方QQ登录,实用教程

    1.登录账号,创建应用,生成APPID与APPKEY 2.下载相关SDK SDK下载地址:https://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD ...

  8. Android第三方QQ登录、获取个人信息、分享实现

    昨天调试了一下午终于成功 第三方QQ登录.获取个人信息,分享 QQ官方API文档写的太乱 并且很多地方没有更新 这里总结一下 方便记录和回看 实现结果图 首先进入腾讯开放平台 下载QQ的SDK 地址 ...

  9. android第三方QQ登录授权

    项目中经常用到第三方登录,今天分享下如何用QQ登录 前面的准备工作就不说了,首先下载QQ登录的jar包,这个是腾讯开放平台可以去下载http://wiki.open.qq.com/wiki/mobil ...

最新文章

  1. 篝火怎么做_上世纪的“Dyatlov事件”到底是怎么一回事儿,真是未知力量吗?...
  2. IDC干货:5个维度!全面综合分析我国城市数据中心发展情况
  3. RecyclerView点击事件监听
  4. NLP之CRF分词训练(六)
  5. Python3 字符串format使用代码示例
  6. 360浏览器图片放大镜如何关闭
  7. 动态获取textarea后面的p标签_HTML简单标签连起实现的小玩意:
  8. Enter passphrase for key '/home/mha/.ssh/id_rsa解决方法
  9. abcdefg顺序Java打印,全国2012年10月自考JAVA语言程序设计(一)试题及答案
  10. javaSE学习 访问控制
  11. spark共享变量(广播变量Broadcast Variable,累加器Accumulators)
  12. EF 保证线程内唯一 上下文的创建
  13. cesium 圆形波纹
  14. stm32驱动ssd1306配置_STM32实验-SSD1306 OLED显示实验
  15. 函数连续,区间连续,一致连续,绝对连续,Lipschitz连续
  16. JVM参数解析 Xmx、Xms、Xmn、NewRatio、SurvivorRatio、PermSize、PrintGC
  17. 如何做拉新活动?拉新裂变的12种玩法,你学废了没?
  18. 电路matlab搭建,MATLAB电路仿真搭建教程
  19. Edge被恶意篡改主页
  20. Android TV系列 TV APP分析(一)

热门文章

  1. 微软 CTO 韦青:“程序员 35 岁就被淘汰”是个伪概念
  2. iba测评题目_靠谱测评丨6国12款大牌纯牛奶盲测,谁最好喝?结果万万没想到
  3. DEJA_VU3D - Cesium功能集 之 076-缓冲区分析
  4. 表单验证使用注解@Valid
  5. 计算机基础知识 基本概念,计算机基本概念与基础知识.ppt
  6. APP推广—区分推广渠道解决方案
  7. Linux运维工程师学习目标
  8. 鸿蒙os系统支持oppo手机吗,华为霸气官宣!毫无保留的开放鸿蒙OS系统:所有国产手机都能使用...
  9. 初步接触核心网之5G核心网系统安装
  10. MySQL同步到hadoop工具_数据同步工具Applier:MySQL数据库实时同步数据到Hadoop