Android开发实现微博三方登录
http://m.2cto.com/kf/201608/534996.html
本文讲述三种实现微博三方登录的接口方法,其实说是三种,但他们只有一个微小的区别,就是进入授权页面前调用的方法名不同而已
1. SSO单点登录方式授权,调用这种方法只能在你手机安装了新浪微博APP的前提下才能实现
2. Web页面登录方式授权,这种方法会跳出一个微博登录的Web页面,从而实现登录
3. all in one方式授权,此种授权方式会根据手机是否安装微博客户端来决定使用sso授权还是网页授权,如果安装有微博客户端 则调用微博客户端授权,否则调用Web页面方式授权
下面是具体实现的流程:
一、授权部分(在代码中获取到一个Oauth2AccessToken对象)
1.上新浪微博开放平台申请APP key 和App secret ,具体步骤省略,无非就是填写一些应用程序的信息,还是非常容易的申请到的(未注册新浪的开发者账号可能需要先注册一个账号),下面是申请成功后的界面
http://open.weibo.com/

2.在上面的界面中“基本信息”目录下填写Android 包名(你项目的包名)、Android签名(需要下载签名工具生成项目对应的签名)等信息,然后点击保存

然后在“高级信息”下添加回调页(http://api.weibo.com/oauth2/default.html),然后点击提交

如果运行测试的时候,登录的账号不是注册应用的账号,那么还需要在“测试信息”下添加测试账号,然后点击保存

3.下载SDK 地址:http://open.weibo.com/wiki/SDK
4.在工程的main文件夹下新建一个jnilibs文件夹,将SDK中libs文件夹下的所有文件夹全部拷到工程中jnilib目录下。再将weiboSDKCore_3.1.4.jar包引入到工程中。
5.添加权限
6.新建一个Constants类。(其中的APP_KEY替换成自己的APP key,另外细心的人可能会发现,上面我们添加的授权回调页就是这里的REDIRECT_URL)
/** * 该类定义了微博授权时所需要的参数。 *  * @author SINA * @since 2013-09-29 */ public class Constants {  /** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */ public static final String APP_KEY = "78219253";  /**  * 当前 DEMO 应用的回调页,第三方应用可以使用自己的回调页。 *  *
* 注:关于授权回调页对移动客户端应用来说对用户是不可见的,所以定义为何种形式都将不影响, * 但是没有定义将无法使用 SDK 认证登录。 * 建议使用默认回调页:https://api.weibo.com/oauth2/default.html *
*/ public static final String REDIRECT_URL = "http://api.weibo.com/oauth2/default.html"; /** * Scope 是 OAuth2.0 授权机制中 authorize 接口的一个参数。通过 Scope,平台将开放更多的微博 * 核心功能给开发者,同时也加强用户隐私保护,提升了用户体验,用户在新 OAuth2.0 授权页中有权利 * 选择赋予应用的功能。 * * 我们通过新浪微博开放平台-->管理中心-->我的应用-->接口管理处,能看到我们目前已有哪些接口的 * 使用权限,高级权限需要进行申请。 * * 目前 Scope 支持传入多个 Scope 权限,用逗号分隔。 * * 有关哪些 OpenAPI 需要权限申请,请查看:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI * 关于 Scope 概念及注意事项,请查看:http://open.weibo.com/wiki/Scope */ public static final String SCOPE = "email,direct_messages_read,direct_messages_write," + "friendships_groups_read,friendships_groups_write,statuses_to_me_read," + "follow_app_official_microblog," + "invitation_write"; }
7.Java代码中需要三个对象
/** * 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */ private SsoHandler mSsoHandler; private AuthInfo mAuthInfo; /** * 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能,用于在回调方法中接收授权成功后返回的信息 */ private Oauth2AccessToken mAccessToken;
初始化对象
// 快速授权时,请不要传入 SCOPE,否则可能会授权不成功 mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE); mSsoHandler = new SsoHandler(this, mAuthInfo);
8.定义一个WeiBoAuthListener的实现类,不管是上面提到的哪一种授权方式,都会需要这个实现类
/** * 微博认证授权回调类。 * 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后, * 该回调才会被执行。 * 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。 * 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。 */ class AuthListener implements WeiboAuthListener {  @Override public void onComplete(Bundle bundle) { // System.out.println("onComplete(Bundle values) ------> " // + bundle.toString()); // onComplete(Bundle values) ------> // Bundle[ {_weibo_transaction = 1469413517894, // access_token = 2.00a64JBGyY87OCfa7707a82fzincGB, // refresh_token = 2.00a64JBGyY87OC11c02519480EWT1g, // expires_in = 2651682, // _weibo_appPackage = com.sina.weibo, // com.sina.weibo.intent.extra.NICK_NAME = 用户5513808278, // userName = 用户5513808278, // uid = 5513808278, // com.sina.weibo.intent.extra.USER_ICON = null} ]   //从Bundle中解析Token mAccessToken = Oauth2AccessToken.parseAccessToken(bundle); // System.out.println("onComplete mAccessToken ------> " // + mAccessToken.toString()); // onComplete mAccessToken ------> // uid: 5513808278, // access_token: 2.00a64JBGyY87OCfa7707a82fzincGB, // refresh_token: 2.00a64JBGyY87OC11c02519480EWT1g, // phone_num: , // expires_in: 1472065200534  if (mAccessToken.isSessionValid()) {//授权成功 Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show(); //显示Access_Token tvAccessToken.setText("Access_token:\n" + mAccessToken.getToken()); //获取用户具体信息 // getUserInfo(); } else { /** * 以下几种情况,您会收到 Code: * 1. 当您未在平台上注册应用程序的包名与签名时; * 2. 当您注册的应用程序包名与签名不正确时; * 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 */ String code = bundle.getString("code");//直接从bundle里边获取 if (!TextUtils.isEmpty(code)) { Toast.makeText(MainActivity.this, "签名不正确", Toast.LENGTH_SHORT).show(); } } // String phoneNum = mAccessToken.getPhoneNum();//通过手机短信授权登录时可以拿到,此demo未实现此种授权方式 }  @Override public void onWeiboException(WeiboException e) { Toast.makeText(MainActivity.this, "授权异常", Toast.LENGTH_SHORT).show(); }  @Override public void onCancel() { Toast.makeText(MainActivity.this, "授权取消", Toast.LENGTH_SHORT).show(); } }
9.下面是各种授权方式调用的方法(可以看到,三种登录方式主要的不同就表现在这——ssohandler对象调用方法不同)
/** * all in one 方式授权,自动检测 */ mSsoHandler.authorize(new AuthListener()); /** * Web授权 */ mSsoHandler.authorizeWeb(new AuthListener()); /** * SSO授权,仅客户端 */ mSsoHandler.authorizeClientSso(new AuthListener());
注意:如果是使用web授权,则需要在AndroidManifest.xml中申明以下Activity
windowsoftinputmode="adjustResize">
10.很容易落下的一步,重写onActivityResult方法,否则调不到回调方法
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);  //SSO 授权回调 //重要:发起sso登录的activity必须重写onActivtyResults if (mSsoHandler != null) { mSsoHandler.authorizeCallBack(requestCode, resultCode, data); } }
如此,授权部分便全部实现了
二、获取用户的基本信息(通过上面获取到的Oauth2AccessToken对象获取用户基本信息)
11.要获取信息,应该需要将SDK中的weibosdk作为库引入到工程中(我直接引了它的jar包,经验证可以实现)。
先声明一个变量
//获取用户信息的接口(需要先把官方提供的weibosdk库引入到工程当中来) private UsersAPI mUsersAPI;
然后在上面weiboAuthListener的onComplete回调方法中将getUserInfo();那句代码的注释去掉。getUserInfo()方法的实现如下。
/** * 获取用户个人信息 */ private void getUserInfo() { //获取用户信息接口 mUsersAPI = new UsersAPI(MainActivity.this, Constants.APP_KEY, mAccessToken); System.out.println("mUsersAPI -----> " + mUsersAPI.toString());  //调用接口 long uid = Long.parseLong(mAccessToken.getUid()); System.out.println("--------------uid--------------> " + uid); mUsersAPI.show(uid, mListener);//将uid传递到listener中,通过uid在listener回调中接收到该用户的json格式的个人信息 } /** * 实现异步请求接口回调,并在回调中直接解析User信息 */ private RequestListener mListener = new RequestListener() { @Override public void onComplete(String response) { if (!TextUtils.isEmpty(response)) { //调用User#parse将JSON串解析成User对象 User user = User.parse(response); String nickName = user.screen_name; tvNickName.setText("用户昵称: " + user.screen_name); tvGender.setText("用户性别: " + user.gender); tvLocation.setText("用户所在地: " + user.location); // Toast.makeText(LogInActivity.this, "用户的昵称: " + nickName, Toast.LENGTH_SHORT).show(); } }  /** *如果运行测试的时候,登录的账号不是注册应用的账号,那么需要去: *开放平台-》管理中心-》应用信息-》测试信息-》添加测试账号(填写用户昵称)! * 否则便会抛出以下异常 */ @Override public void onWeiboException(WeiboException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "获取用户个人信息 出现异常", Toast.LENGTH_SHORT).show(); } };
这样就可以获取到用户的基本信息了!
User类中的各项信息可参考:http://open.weibo.com/wiki/2/users/show
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号