文档章节

【Android】第三方QQ账号登录的实现

今日竹石
 今日竹石
发布于 2015/02/10 22:31
字数 1332
阅读 157
收藏 0

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

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

申请APPID

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

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



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



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


导入Jar包

将下载得到的Jar包导入工程,并在AndroidManifest.xml文件中进行注册。

        <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="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() {
            	/** 授权失败的回调*/
				@Override
				public void onError(UiError arg0) {
					// TODO Auto-generated method stub
					Toast.makeText(LoginActivity.this, "授权失败", 1000).show();
					Message msg = new Message();
					msg.arg1 = 2;
					handler.sendMessage(msg);	
				}
				/** 授权成功的回调*/
				@Override
				public void onComplete(JSONObject arg0) {
					// TODO Auto-generated method stub
					Toast.makeText(LoginActivity.this, "授权成功", 1000).show();
					Message msg = new Message();
					msg.what = 2;
					msg.arg1 = 1;
					msg.obj = arg0;
					handler.sendMessage(msg);
				}
				/** 取消授权的回调*/
				@Override
				public void onCancel() {
					// TODO Auto-generated method stub
					Toast.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的处理操作。

@Override
	public boolean handleMessage(Message msg) {
		// TODO Auto-generated method stub
		switch (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 block
					e.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接口时,使能成功接收到回调
	@Override
	protected 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 block
					e.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 block
					e.printStackTrace();
				}
				nickname.setText(sBuilder);
			}
		};
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.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);
		
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
        switch (v.getId()) {
	        case R.id.login_qq:
	            onClickLogin();
	            break;
        }
	}
	//应用调用Andriod_SDK接口时,使能成功接收到回调
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		 mTencent.onActivityResult(requestCode, resultCode, data);
	}
    private void onClickLogin() {
        if (!mTencent.isSessionValid()) {
            IUiListener listener = new IUiListener() {
            	/** 授权失败的回调*/
				@Override
				public void onError(UiError arg0) {
					// TODO Auto-generated method stub
					Toast.makeText(LoginActivity.this, "授权失败", 1000).show();
					Message msg = new Message();
					msg.arg1 = 2;
					handler.sendMessage(msg);	
				}
				/** 授权成功的回调*/
				@Override
				public void onComplete(JSONObject arg0) {
					// TODO Auto-generated method stub
					Toast.makeText(LoginActivity.this, "授权成功", 1000).show();
					Message msg = new Message();
					msg.what = 2;
					msg.arg1 = 1;
					msg.obj = arg0;
					handler.sendMessage(msg);
				}
				/** 取消授权的回调*/
				@Override
				public void onCancel() {
					// TODO Auto-generated method stub
					Toast.makeText(LoginActivity.this, "取消授权", 1000).show();
					Message msg = new Message();
					msg.arg1 = 3;
					handler.sendMessage(msg);	
				}
			};
            mTencent.login(this, SCOPE, listener);
        } else {
            mTencent.logout(this);
        }
    }
    
	@Override
	public boolean handleMessage(Message msg) {
		// TODO Auto-generated method stub
		switch (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 block
					e.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;
	}
}


© 著作权归作者所有

今日竹石
粉丝 41
博文 227
码字总数 181312
作品 0
朝阳
程序员
私信 提问
实现QQ登录第三方APP(Android)

首先你需要到腾讯开放平台注册开发者账号,并创建一个APP,填写包名,获取APP ID: http://open.qq.com/ 完成上面的工作后,可以继续了。 下载Android SDK,SDK提供了使用QQ众多功能的接口。...

crazymus
2015/11/02
7.6K
0
Android使用友盟集成QQ、微信、微博等第三方登录

前言 最近项目需要加入第三方分享和登录功能,之前其他项目的第三方分享和登录一直都使用ShareSDK实现的。为了统一使用友盟的全家桶,所以三方分享和登录也就选择了友盟。这里记录一下完整的...

慕前端7069444
2018/05/21
0
0
基于Google Flutter的开源中国客户端,支持Android与iOS

FlutterOSC 基于Google Flutter的开源中国客户端,支持Android和iOS。 码云戳这里 GitHub戳这里 关于Google Flutter Android扫码下载APK 请使用手机浏览器扫码下载,不要使用微信或者qq扫码 ...

我遇见谁_会有怎样的对白
2018/05/09
0
0
Android-友盟第三方登录与分享

前言 最近项目中又一次需要集成友盟的三方登录与分享,之前没有记录过,所以这次来写一下... 准备工作 1.注册友盟账号创建应用,获取key:申请地址http://www.umeng.com2.对对应的平台(腾讯、...

秦子帅
09/07
42
0
如何实现客户端定期验证用户账号?

我是个菜鸟 我在做一个客户端,需要用户账号登录,账号登录验证在服务器端。 我希望能够实现类似手机qq的账号验证功能。主要是,如果用户在PC端或者其他方式修改了他的账号密码之后,手机端能...

tuhuiyan
2014/12/02
89
1

没有更多内容

加载失败,请刷新页面

加载更多

linux负载均衡总结性说明 四层负载和七层负载有什么区别

这篇文章主要为大家详细介绍了linux负载均衡的相关资料,什么是负载均衡?四层负载和七层负载有什么区别?具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在常规运维工作中,经常会运用到...

天子剑毅
17分钟前
2
0
mysql in与or效率比较

在网上一直看到的是or和in的效率没啥区别,一直也感觉是这样,前几天刚好在看《mysql数据库开发的36条军规》的文章,里面提到了or和in的效率问题,文中提到or的效率为O(n),而in的效率为O(l...

whatwhowhy
17分钟前
2
0
使用docker 基于pxc镜像搭建mysql高可用集群

前置条件 docker已安装: 第一步:拉取镜像 docker pull percona/percona-xtradb-cluster:5.7.21 第二步:复制重命名镜像(可选) docker tag percona/percona-xtradb-cluster:5.7.21 pxc 第...

小海bug
22分钟前
4
0
windows安装nginx负载均衡

第一步:下载安装nginx 地址:http://nginx.org/en/docs/windows.html 下载完成,比如放在C盘根目录下: cd c:\ unzip nginx-1.15.3.zip //解压文件 cd nginx-1.15.3 //进入目录 start ngin...

你好夜故事
25分钟前
3
0
Jenkins CLI,助你轻松管理 Jenkins

本文首发于:Jenkins 中文社区 作者:Donghui Wang Jenkins CLI,简称 jcli,一个使用 Golang 开发的开源的 Jenkins 命令行工具。 它可以帮忙你轻松地管理 Jenkins。 无论你是 Jenkins 插件开...

Jenkins中文社区
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部