转载请标明原地址:[http://blog.csdn.net/gaolei1201/article/details/44680291](http://blog.csdn.net/gaolei1201/article/details/44680291)
最近项目需要做第三方登录,由于以前没做过,所以也是花了一周时间,走了好多弯路,总算是完成了。依据有福同享有难同当这句话,还有互相学习的原则,还有还有。现在把一些知识点总结一下,供需要者参考,有不足之处还望指点。有两种方式可实现:一种是用友盟的(它是把qq、微信、微博登陆集成一下),另一种是直接用官方sdk。
我开始想用友盟的,首先参考了这篇文章,还带着demo(veryimportant,例子能说明一切,你懂得),很不错,别的是在也找不到了,地址:[http://blog.csdn.net/wwj_748/article/details/41117173](http://blog.csdn.net/wwj_748/article/details/41117173) 。你首先需要申请友盟的账号,然后下载需要的SDK,参考文档,把应用的信息注册一下,如图

我在使用老是出现一些莫名其妙的问题,如qq登陆,明明用别人的demo还有自己写个demo,都能正常运行和获取到用户信息,但是集成到自己的项目就不行,获取不到信息,试了好久都不行,还有就是新浪微博登录时无法调用客户端如果把客户端卸掉网页版登陆是正常的,但是友盟没有提供选择客户端或是网页版登录的选择,所以新浪微博也是没办法正常登录。只有微信能正常运行,但也没那么简单,有一个大坑,例如我的apk,包名(也就是AndroidManifest.xml中的包名)是com.kingdowin.gosu,你项目中必须有一个包名是com.kingdowin.gosu.wxapi,下面有一个类是WXEntryActivity.java,里面写登录微信的代码,否则就获取不到用户信息,**记好是必须**。友盟登录做好之后,分享就简单了,可参考上面提供的例子如何实现分享功能。
**其实友盟也是吧官方的API封装了一下,我们完全没必要用友盟的SDK做登陆和分享功能,多此一举,且添加不少麻烦。终上所述,我选择官方SDK。**
首先普及一下准备工作:1、要说明的是qq登陆、微信登录、微博登录,都分别要在腾讯公众平台、微信公众平台、微浪微博公众平台申请账号,提交app信息审核通过才能调用,还有就是微信公众平台需要交纳每年300的费用才能使用它的登录分享功能,以及一些其它功能。在申请过程中会让你填写自己项目的Android包名和Android签名(项目包名必须和注册的包名一致),这是必须的否则登录不成功。台会给你APPKEY,APPID等有用信息。签名工具开放平台都能下载,我为大家提供一个新浪微博的签名工具,下载地址:[http://download.csdn.net/detail/gaolei1201/8576635](http://download.csdn.net/detail/gaolei1201/8576635)。平

2、项目必须是签过名项目也就是发布版,顺便给大家介绍一下项目签名步骤:1.右键项目选择AndroidTools 2.选择Export Signed Application Package...3.点击Next 4.补充说明KeyCreation过程中,如图2信息填写由一条灰线分为上下两部分,上部分Alias、Password、Confirm、Validity(years)必填,下部分必须至少选填一项,如填写First and Last Name这项即可,否则回报如图2错误,尽量把信息填完整些。这次创建后以后此项目可重复利用此 keystore,不必每次都创建,看图1,点击Useing exiting keystore,然后选择创建过的keystore即可,然后finish。



一、QQ开放平台,地址:[http://open.qq.com/](http://open.qq.com/),下载一个demo,把自己APPID替换一下就行,然后把代码和jar包集成到你的项目中,需要在manifest.xml中声明相应的权限和两个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="tencent222222" />
<!-- 100380359 100381104 222222 -->
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
~~~
qq登录还是比较简单的。每次qq的login之后需要logout,如果不logout就会出现异常,大家可以试试.微信和微博登露是不需要logout,可连续多次login。有时会出现非官方授权请到应用宝下载,是因为运行时需要签名包,然后就正常了,但是腾讯贴心的提供一个测试账号即使不签名打包也行,还可以调试,就是登录你注册基本信息时的Q号,如图

二、微信开放平台,地址:[https://open.weixin.qq.com/](https://open.weixin.qq.com/),下载一个demo运行一下,把自己的APPKEY替换一下,把代码和jar包集成到你的项目中,还需要在manifest.xml中声明相应的权限。但是官方demo,没有授权的界面,这是要闹哪样?需要自己加几行代码
~~~
<span style="font-size:14px;">SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);</span>
~~~
主要代码
~~~
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.flash_activity);
<span style="color:#3366ff;">api = WXAPIFactory.createWXAPI(this, Property.wxLoginInfo.getAppid(), false);
api.handleIntent(getIntent(), this);</span>
}
@Override
public void onReq(BaseReq arg0) {
// TODO Auto-generated method stub
}
@Override
public void onResp(BaseResp resp) {
Bundle bundle = new Bundle();
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
// 可用以下两种方法获得code
// resp.toBundle(bundle);
// Resp sp = new Resp(bundle);
// String code = sp.code;
// 或者
String code = ((SendAuth.Resp) resp).code;}}
~~~
下面还有关键的一步是如何通过code获取openId和accessToken。可访问此地址:"https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid="+Constant.WEIXIN_APP_ID(即自己的APPID)+"&secret="+Constant.WEIXIN_APP_SECRET(即自己的APPSECRET)+"&code="+code(即获取到的code)+"&grant_type=authorization_code"; 返回的json字符串包括openId和accessToken。
注意:上面是获取code。现在最新的官方jar包好像不支持获得code了。直接就能得到token,省略了获取code 这一步。所以方法不变,大家取的时候直接resp.token就行了。不用再去取code了。但是,但是,这样直接拿到token了好像按照官方文档上的方法就不能获得openid了。自己找不到办法也找不到相关资料,反正是jar包更新了但是文档还没更新,大家弄不成功的话可以先用旧的jar和上面获取code的方法。点击[下载旧版jar包](http://download.csdn.net/detail/qq247890212/8401389)
最需要需要注意,例如我的apk,包名(也就是AndroidManifest.xml中的包名)是com.kingdowin.gosu,你项目中必须有一个包名是com.kingdowin.gosu.wxapi,下面有一个类是WXEntryActivity.java,里面写登录微信的代码,否则就获取不到用户信息,**记好是必须**。如图

我就是没有在意才导致浪费了很长时间也没调试成功,和友盟的是一样的,是不是很变态啊,把我本来的包名和类名全都改了,没办法呀!
三、微博开放平台,地址:[http://open.weibo.com/](http://open.weibo.com/)。下载个demo替换成自己的APPKEY,然后替换一下自己的,把代码和jar包集成到你的项目中,在manifest.xml中加入相应的权限和这个activity
~~~
<activity
android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:windowSoftInputMode="adjustResize" >
</activity>
~~~
说起来也是一肚子苦水要倒啊。妈的,开始下载一个官方demo一切都配置好了,还是报 sso package or sign error,抱头苦死不得其解,后来经过网上查阅资料和分析,可能是下载了一个老版本,有许多人反映老版本会一直报此错误。后来经过自己一番研究和实验,发现了这个地址上的demo还是靠谱的,[https://github.com/sinaweibosdk/weibo_android_sdk](https://github.com/sinaweibosdk/weibo_android_sdk),立马生效,但是遗憾的是无论如何也不能调用微博客户端登录,到授权页面后直接闪退(和友盟的情况一样),获取不到用户信息,无奈呀,最后只是调用网页版登录可行放在了项目中,**有经验的朋友可以告知一下啊**,还有个经常报的错就是 redirect_uri_dismatch,那是因为你代码Constant中的回调地址和你在开放平台中注册的地址不一样,一般都写成REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";就行!
效果图:

[ **第三方登录做好之后,分享就简单了,可访问下篇文章:android 分享功能**](http://blog.csdn.net/gaolei1201/article/details/45873559)
[ 项目源码地址欢迎光临.............](http://download.csdn.net/detail/gaolei1201/8548121)
