雷袭-----qq第三方登录,让你闪电进入app

现在很多应用都已经涉及到  第三方登录了,他的使用能更方便大家进入app,不用繁琐的输入密码,那么今天就来探索下  QQ 的三方登录。


首先,大家在白度上 搜  “腾讯开放平台”,进入以下界面:



在 ‘’联系我们‘ 的旁边有登录的,将你的qq开发者账号登上,然后进入 资料库 标签,api文档,下面有 sdk 下载,然后下载最新的官方文档,我是下的 sdk_V_3.1.0,当然,你的

app也是要创建的,在开发者应用管理里面会有你的 app_id  和 app_key


这一切搞定之后就是配置了,我觉得 qq的官方文档真是够烂啊,官方文档,下的demo以及demo中的文档介绍,都不配套。搞起来甚是郁闷啊。好吧,接下来讲配置

解压 sdk 解压后是这样的:


里面有两个jar 包,mta-sdk-1.6.2.jar 和 open_sdk_r5756.jar,都导入到你的工程中。


接下来配置 MainActivityfast.xml

MainActivityfast 中需要原封不动的加入两个 activity,com.tencent.tauth.AuthActivity  和  com.tencent.connect.common.AssistActivity,代码如下:

    <application
        android:name="com.example.androidtexta.BaseApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden|screenSize|navigation"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true" >
            <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="tencent2222222" />
            </intent-filter>
        </activity>
         <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|keyboardHidden"
            android:screenOrientation="behind"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        
        
    </application>

注意:首先com.tencent.tauth.AuthActivity  和  com.tencent.connect.common.AssistActivity的添加包路径是固定的,在 AuthActivity 下面有一个 

<data android:scheme="tencent2222222" />
不能忘掉,其中 scheme="xxxxxxx" 中 tencent 是固定的,22222 为你的 app_id,记住是 app_id  不是app_key !上面两个 类只需要按我那样复制进去,改改 app_id就行


当然,不能忘了网络权限,由于我只做登陆,暂时只用到了两个权限,大家这个可以参考官方文档,根据需要添加  我的权限是

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />


一切就绪,现在我们要开始进入正题了,此处只做一个简单的点击 登陆 button,获得 个人信息的昵称和 图像,以及登陆成功后获得的登陆基本信息

Ok,下面接着说


首先当然是  qq 登陆的注册,代码如下


	private Tencent mTencent;
	private String mAppId;
	private UserInfo mUserInfo;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Log.i("","=====create====");
		
		setConfig();

		initView();
		initData();
		setListener();
	}
	
	private void setConfig() {
		mAppId ="2222222";
		// 注册QQ
		mTencent=Tencent.createInstance(mAppId, MainActivity.this);
		
	}
我们在 oncreate 中 对  mTencent 进行初始化,此时需要用到 app_id。

然后是 button 点击时的 登陆方法:

	private void setListener() {
		mButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//登陆
				mTencent.login(MainActivity.this, "all", new QQListener());
			}
		});
		
	}

登陆方法 是 mTencent.login(MainActivity.this, "all", new QQListener()); 其中三个参数:第一个是  上下文,第二个是 权限,此处是 “all”,表示所有权限,第三个参数是 登陆的回调,我们登陆的结果是在这个类中处理的,QQListener 是自己写的实现 IUiListener 的 一个类


ok,再看看   QQListener  类的实现 

	/**获得登陆的基本信息**/
	class QQListener implements IUiListener{
		
        //登陆成功
		@Override
		public void onComplete(Object obj) {
			Log.i("","======登陆成功======="+obj.toString());
			
			
			QQLoadInfo qQLoadInfo=JsonParserUtil.getQQLoadInfo(obj.toString());

			//设置openid和token,否则获取不到下面的信息
			String openId=qQLoadInfo.getOpenid();
			String token = qQLoadInfo.getAccess_token();
			String expires = qQLoadInfo.getExpires_in();
			
			mTencent.setAccessToken(token, expires);
                        mTencent.setOpenId(openId);
			
			mUserInfo=new UserInfo(MainActivity.this, mTencent.getQQToken());
			mUserInfo.getUserInfo(new UserInfoListener());
		}
		
		//登陆取消
		@Override
		public void onCancel() {
			// TODO Auto-generated method stub
			
		}
		
        //登陆失败
		@Override
		public void onError(UiError arg0) {
			// TODO Auto-generated method stub
			
		}
	}

QQListener 实现 IUiListener 时有三个方法,如上,故名思议,分别是 登陆成功,取消和失败。现在主要来看看 成功后的处理,即 onComplete(Object obj) 方法

Log.i("","======登陆成功======="+obj.toString()); 返回的数据大概是这样的:

{
  "ret": 0,
  "pay_token": "xxxxxxxxx",
  "pf": "xxxxxxxxxxxxx",
  "query_authority_cost": xxx,
  "authority_cost": x,
  "openid": "xxxxxxxxxxxx",
  "expires_in": xxxxxxxxxx,
  "pfkey": "xxxxxxxxxxxx",
  "msg": "",
  "access_token": "xxxxxxxxx",
  "login_cost": xxx
}


这里需要强调一点,在某些低端机上调用登录后,由于内存紧张导致 APP 被系统回收,登录成功后无法在 onComplete(Object obj) 方法中获得登陆信息,这时需要重写 activity的 onActivityResult 方法,如下:

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		//在某些低端机上调用登录后,由于内存紧张导致 APP 被系统回收,登录成功后无法成功回传数据,需要重写onActivityResult
		if (requestCode == Constants.REQUEST_LOGIN) {
			Tencent.onActivityResultData(requestCode,resultCode,data,new QQListener());
			}
		super.onActivityResult(requestCode, resultCode, data);
		
	}

这样处理以后,你的 QQListener 方法中就可以 获得 登陆后的信息了,OK,下面继续讲 QQListener 类。


QQListener 类返回成功的 obj后,我用 gson 解析,封装到  QQLoadInfo 对象中了,这只是 登陆后获得的基本数据, qq的 sdk 为我们 提供了一个 userInfo 类,当中会涉及到 用户的一些基本信息,

如 图像的 url ,性别,省份,昵称等。那么下边这段代码很关键:

QQLoadInfo qQLoadInfo=JsonParserUtil.getQQLoadInfo(obj.toString());

			//设置openid和token,否则获取不到下面的信息
			String openId=qQLoadInfo.getOpenid();
			String token = qQLoadInfo.getAccess_token();
			String expires = qQLoadInfo.getExpires_in();
			
			mTencent.setAccessToken(token, expires);
            mTencent.setOpenId(openId);
			
			mUserInfo=new UserInfo(MainActivity.this, mTencent.getQQToken());
			mUserInfo.getUserInfo(new UserInfoListener());

我们需要 获得 userInfo ,而  userInfo 初始化需要 mTencent 的帮助,所以 “设置openid和token,否则获取不到下面的信息” 非常重要,因为不设置的话,

mUserInfo=new UserInfo(MainActivity.this, mTencent.getQQToken());
执行获得的 mUserInfo会为空

ok,现在我们已经获得 不为空的  mUserInfo 了,那么get 到用户信息,我们还要用到 UserInfo 的另一个方法:

mUserInfo.getUserInfo(new UserInfoListener());

方法很简单,里面也是一个监听类 UserInfoListener

很遗憾,我们这个 UserInfoListener 类也 实现了 IUiListener 接口,其代码为:

	/**获得qq登陆用户信息**/
	class UserInfoListener implements IUiListener{
		
		@Override
		public void onComplete(Object obj) {
			// TODO Auto-generated method stub
			Log.i("","======用户信息======="+obj.toString());

			//figureurl_qq_2为用户图像的url
			QQUserInfo qQUserInfo=JsonParserUtil.getQQUserInfo(obj.toString());
			Log.i("","===用户信息===="+qQUserInfo.getFigureurl_qq_2());
			Log.i("","===用户信息===="+qQUserInfo.getNickname());
		}
		
		@Override
		public void onCancel() {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void onError(UiError arg0) {
			// TODO Auto-generated method stub
			
		}
		
	}

此处 返回的用户信息大概是这样的:

{
    "is_yellow_year_vip": "x",
    "ret": x,
    "figureurl_qq_1": "http://xxxxxxxxx",
    "figureurl_qq_2": "http://xxxxxxxxxxx",
    "nickname": "xxxxxxx",
    "yellow_vip_level": "x",
    "is_lost": x,
    "msg": "",
    "city": "xxx",
    "figureurl_1": "http://xxxxxxxxxx",
    "vip": "x",
    "level": "x",
    "figureurl_2": "http://xxxxxxxxxxxxxxxxxxx",
    "province": "xxxxxx",
    "is_yellow_vip": "xxxxx",
    "gender": "xxxxx",
    "figureurl": "http://xxxxxxxxxxx"
}

我也是将其解析后封装在 自己写的 QQUserInfo 类中,然后通过 

Log.i("","===用户图像 url===="+qQUserInfo.getFigureurl_qq_2());
Log.i("","===用户昵称===="+qQUserInfo.getNickname());
获得用户的 图像 url 和 昵称,当然,你也可以 根据上面的 json 数据获得更多个人信息


那么接下来的 通过 url 获取 bitmap 以及 昵称和 bitmap 的显示 我就不多讲了,需要注意的是 bitmap 通过 url 获取 图像,是要重开线程获取的,另外 昵称和 图像的显示要从线程中传到 handler  中显示


需要注意的是,全部做完以后,测试的时候开始都是测试的开发者自己的qq号,需要你将做好的app在腾讯开发者平台上发布经审核之后,才能正常使用


      OK,今天就说这么多,感觉腾讯 qq 的文档是 一团糟啊,各种坑,唉!







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值