QQ第三方登录
QQ第三方登录
在Android应用程序的开发过程中,很多时候需要加入用户登录/注册模块。除了自己动手设计登录界面并实现相应功能外,现在还可以借助百度、腾讯等开发者平台提供的第三方账号登录模块。最近研究了友盟的社会化分享组件,对其提供的SDK中第三方登录的QQ模块进行了测试。本篇文章先对友盟用户注册、SDK下载及案例的下载做一个简单的介绍,然后针对测试程序的过程及代码进行详细的描述。
顺便提一点,进入友盟的主页及SDK下载页面之后,会发现其支持Android、IOS等多个环境下的应用程序开发,感兴趣或有这方面需求的小伙伴可以关注下(不是打广告哦,觉得挺好用)。
一、友盟社会化分享组件集成
在进行自己的应用程序开发之前,需要集成用到的组件,由于本篇文章测试针对第三方QQ登陆,所以选择的是友盟社会化组件。
其实,友盟社会化分享组件支持绝大多数国内外主流社交平台的分享功能,其中包括:
国内平台:微信(微信好友及微信朋友圈)、QQ、Qzone、新浪微博、腾讯微博、人人网、豆瓣、短信、邮件、有道云笔记、来往、易信。
国外平台:Facebook、Twitter、Instagram、EverNote、Pocket、Pinterest、Linkedin、G+。
下面的图片是集成的大致流程:
1、注册友盟账号
各个开发者平台都一样,进行任何操作之前得先注册,友盟官网:http://www.umeng.com/。
注意,流程图中的申请第三方账号这一步骤不是每个应用的开发都需要的,先放着不管。官方解释是:进行分享、授权操作需要在第三方平台创建应用并提交审核,友盟默认提供了大多数平台的测试账号,但如果需要将分享、授权来源、分享到QQ、Qzone的icon更改为自己APP的应用,就需要自己申请第三方账号,并且由于微信平台需要验证签名,因此使用微信功能也必须要自行申请账号。
2、所以,注册之后,便可以下载SDK了。注意SDK下载时会让开发者选择需要的模块,用到什么就选什么,选择好后点击进行下载即可。最终内容为各模块对应的jar库文件,程序中加载后可直接调用API方法或接口进行开发。
3、在我的产品页面添加新应用,获取到AppKey,结果是一串字符,在以后的开发过程中会用到,可以说非常重要。
二、第三方登录概述
1、第三方登录定义
第三方登录主要用于简化用户登录流程,通过用户拥有的微博、QQ、微信等第三方账号进行登录并且构建APP自己的登录账号体系。
2、实现第三方登录的方法
实现第三方登录主要通过下面两步:
在第三方平台完成授权。
获取第三方平台的accesstoken信息及用户资料。
3、第三方登录支持的平台
目前友盟社会化组件支持的第三方登录平台为:新浪微博、腾讯微博、QQ、QQ空间、微信、人人网、豆瓣。所以,若要利用QQ实现第三方登陆,还需要到腾讯开发者平台(http://open.qq.com/)去登陆,过程同申请上述的AppKey类似,开发者需要创建一个应用,申请一对App ID和App Key,同样重要。
三、实现QQ登录
1、 添加相关文件
由于应用开发过程中要用到下载的SDK(*.jar),故第一步是添加对其的引用,以便导入与后续的调用或实现。添加的方式有三种:
A、将platforms/qq_zone/libs中SocialSDK_QQZone_1.jar,SocialSDK_QQZone_2.jar,SocialSDK_QQZone_3.jar拷贝到工程的libs(如果没有此目录,新建libs目录,鼠标右键-->Add to Build Path)目录中。将解压目录中platforms/qq_zone/res文件拷贝至你工程res目录。本文测试就是采用此种方式。
B、双击运行SDK根目录下的SDKIntegration.jar或者在命令行下输入java -jar SDKIntegration.jar运行集成工具; 2:选择Android工程的根目录,并且填写您的友盟App Key; 3:勾选所需平台和组件,点击"快速集成"; 4:检查AndroidManifest.xml、jar文件是否正确。如果集成了QQ或者QZone,请修改相应地appid。该种方法测试时没有成功,哪位成功了希望告知如何处理,谢谢。
C、将文件夹中的social_sdk_library_project文件夹导入Eclipse,并在您的工程中添加对此项目的引用即可。该方法便于以后的升级,目前没有进行测试,故不进行描述。
2、Android manifest.xml中添加配置代码
A、添加上面申请的友盟AppKey:
1 <meta-data 2 android:name="UMENG_APPKEY" 3 android:value=" 55bb0b7367e58ea05f000cf8" > 4 </meta-data>
B、腾讯SSO授权的Activity注册,有两个Activity:
1 <activity 2 android:name="com.tencent.tauth.AuthActivity" 3 android:launchMode="singleTask" 4 android:noHistory="true" > 5 <intent-filter> 6 <action android:name="android.intent.action.VIEW" /> 7 <category android:name="android.intent.category.DEFAULT" /> 8 <category android:name="android.intent.category.BROWSABLE" /> 9 <data android:scheme="tencent pqGGpnNOz74m8G6V" /> 10 </intent-filter> 11 </activity> 12 <activity 13 android:name="com.tencent.connect.common.AssistActivity" 14 android:screenOrientation="portrait"
15 android:theme="@android:style/Theme.Translucent.NoTitleBar" />
这里的tencent后面的字串pqGGpnNOz74m8G6V为之前申请的腾讯AppKey,每个开发者均不同。
C、QQ登陆与网络权限的添加:
1 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 2 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 3 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 4 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 5 <uses-permission android:name="android.permission.INTERNET" /> 6 <uses-permission android:name="android.permission.READ_LOGS" /> 7 <uses-permission android:name="android.permission.CALL_PHONE" /> 8 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 9 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 10 <uses-permission android:name="android.permission.GET_TASKS" /> 11 <uses-permission android:name="android.permission.SET_DEBUG_APP" /> 12 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 13 <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 14 <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 15 <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
3、实现授权及获取用户资料
A、添加成员变量mController
在AuthActivityDer类构造函数中添加下面的成员变量:
1 UMSocialService mController = UMServiceFactory.getUMSocialService("com.umeng.login");
B、添加QQ与QQ空间平台
1 private void addQZoneQQPlatform() { 2 String appId = " 1104719081 "; 3 String appKey = " pqGGpnNOz74m8G6V "; 4 UMQQSsoHandler qqSsoHandler = new UMQQSsoHandler(getActivity(), appId, appKey); 5 qqSsoHandler.setTargetUrl("http://www.umeng.com"); 6 qqSsoHandler.addToSocialSDK(); 7 QZoneSsoHandler qZoneSsoHandler = new QZoneSsoHandler(getActivity(), appId, appKey); 8 qZoneSsoHandler.addToSocialSDK(); 9 }
该函数可以在构造函数中添加,也可以在其他调用,只要在真正开始授权登陆之前。
C、授权接口
1 UMSocialService.doOauthVerify(Context context , SHARE_MEDIA platform , UMAuthListener listener);
接口说明:该接口调用将调出授权页进行授权操作。注意,目前该接口不支持Facebook,twitter,G+,易信,来往授权。是在登陆实现类AuthActivityDer中进行授权(注意,友盟SDK中的QQ登陆模块名为AuthActivity,尽量别相同,以免混淆)。
在界面上点击按钮采用QQ登陆功能后,授权接口的实现内容如下:
1 mController.doOauthVerify(mContext, SHARE_MEDIA.QQ, new UMAuthListener() { 2 @Override 3 public void onStart(SHARE_MEDIA platform) { 4 Toast.makeText(mContext, "授权开始", Toast.LENGTH_SHORT).show(); 5 } 6 @Override 7 public void onError(SocializeException e, SHARE_MEDIA platform) { 8 Toast.makeText(mContext, "授权错误", Toast.LENGTH_SHORT).show(); 9 } 10 @Override 11 public void onComplete(Bundle value, SHARE_MEDIA platform) { 12 Toast.makeText(mContext, "授权完成", Toast.LENGTH_SHORT).show(); 13 //获取用户信息 14 mController.getPlatformInfo(MainActivity.this, SHARE_MEDIA.QQ, new UMDataListener() { 15 @Override 16 public void onStart() { 17 Toast.makeText(MainActivity.this, "获取平台数据开始...", Toast.LENGTH_SHORT).show(); 18 } 19 @Override 20 public void onComplete(int status, Map<String, Object> info) { 21 if(status == 200 && info != null){ 22 StringBuilder sb = new StringBuilder(); 23 Set<String> keys = info.keySet(); 24 for(String key : keys){ 25 sb.append(key+"="+info.get(key).toString()+"\r\n"); 26 } 27 Log.d("TestData",sb.toString()); 28 }else{ 29 Log.d("TestData","发生错误:"+status); 30 } 31 } 32 }); 33 } 34 @Override 35 public void onCancel(SHARE_MEDIA platform) { 36 Toast.makeText(mContext, "授权取消", Toast.LENGTH_SHORT).show(); 37 } 38 } );
D、上面代码中调用了用户信息获取函数,实现方式如下:
1 private void getUserInfo(SHARE_MEDIA platform) { 2 mController.getPlatformInfo(getActivity(), platform, new UMDataListener() { 3 public void onStart() { 4 ; //此处没有做任何动作 5 } 6 public void onComplete(int status, Map<String, Object> info) { 7 if (info != null) { 8 Toast.makeText(getActivity(), info.toString(), Toast.LENGTH_SHORT).show(); 9 } 10 } 11 }); 12 }
四、登录授权图片
由于代码中在用户登录成功后,只是显示了用户的基本信息,所以跳转后会回到之前的界面。如果在项目中,就可以在该步骤后跳转到需要打开的界面,如正式的游戏界面等。