Android应用接入第三方登陆之新浪微博

众所周知,移动互联网在这几年经历了蓬勃发展,到目前为止,移动互联网发展仍然很强劲。其中移动设备系统以android占据主导地位,之前是加拿大的黑莓系统占据主导,但后来随着android系统的问世,黑莓手机操作系统逐渐被android蚕食,目前,全球最为流行的移动操作系统有Google公司的android、苹果(Apple)公司的ios、微软(Microsoft)公司的windows Phone,以上三者形成手机操作系统三足鼎立之势,其中Google的android占据市场的百分之六十几的份额,苹果(Apple)占据百分之十八点几的份额,而微软(Microsoft)的Windows Phone占据全球仅仅只有百分之三点几的份额,好了,我们开始进入正题吧。

    随着3G手机的广泛普及,移动应用开始了井喷式的发展,这些移动应用公司如雨后春笋越来越多,一些刚刚起来的小公司开发的应用(大部分一些电商、社交等之类的)为了提高其知名度,不得不依附大公司的庞大的用户群来进行推广,比如像腾讯(Tencent),新浪(sina),人人网,脸谱网(Facebook)等,这些公司提供接口API供开发者调用。今天呢,我要说的就是新浪登录,至于我为什么要说新浪,是因为新浪写的接口文档太可恶了,走了不少弯路,为了大家少走弯路,我决定写这篇博文,如果写的不好,请批评指正

    要想在移动应用上使用sina登录,第一步需要注册成为开发者,说白了,就是一个新浪微博帐号,如果有了的话,就不要注册了,直接登录即可,那么在那里去注册成为开发者呢?下面的图会告诉你:在地址栏中输入 t.sina.com.cn --> 它会要求你登录(如果没登录)

Android应用接入第三方登陆之新浪微博_第1张图片

经过以上第一步,我们进入了新浪的开放平台,如图:

             

第三步,创建应用,获得授权资格,这里需要你去填写一些重要的信息,这些东西在以后会用到,如图(创建应用):


第四步,当我们点击了创建应用,你需要填写以下信息,如图:


好了,现在剩下最后一步了,填写完以上信息之后,提交信息,完了,此时还还会有些信息需要你填写,例如,回调地址,其实就是网站地址,可填新浪默认的,如果你自己有的话,也可以填写你自己的网站地址,如图:


记住,以上画红线部分,千万不要泄露出去,因为会对公司造成安全隐患,特别是Android签名、App Secret,如果App Secret不小心泄露出去的话,你可以点击该条目,进入编辑页,进行重置,其中android签名是根据新浪提供的一个app_signatures.apk生成的一串MD5加密字符串,然后填上去,就哦了!下面是一个示例,还要记住的是,要想使用此工具生成一串MD5加密字符串,那你就必须将该应用安装到你的手机上,因为该MD5加密字符串是根据包名及xx.keystore生成的,Eclipse集成开发工具Run as 所使用的是debug.keystore 所以当你在发布你的APP的时候,一定要根据你自己公司的 .keystore 生成MD5加密字符串填到android签名哪一项上去,如果你填的是你通过Eclipse集成开发工具中的Run as 安装到手机上去的debug.keystore生成的MD5加密字符串的话,那么会导致无法授权登录问题产生。所以,一旦你要发布APP时,一定要更正回来,一般来说,一个公司keystore只有一份,根据报名产生的MD5加密字符串效果图如下:

Android应用接入第三方登陆之新浪微博_第2张图片

哦,对了,在最后一步我们提到了回调地址,那么该回调地址有什么用呢?该回调地址相对用户来说是不可见的,这个回调地址是用来生成accessToken的,通过这个accessToken可以去请求接口,获得相关用户的信息。带回一张图就可以让你明白,我上面所提到字段的意思。如图:


完了,这就是新浪登录的过程,下面贴上一段代码,第三方登录的代码,这里有一个请求接口的类,我觉得吧他写成内部类更好一点,因为这样可以更好的传数据。特别提一点,我使用的SSO登录,我相信,Oauth2.0 认证应该是一样的吧。

新浪微博SDK下载:http://open.weibo.com/wiki/SDK

代码:

[java]  view plain copy
  1. public class LoginActivity extends BaseActivity implements OnClickListener {  
  2.   
  3.     public static final int END_SINA = 2;  
  4.     private RelativeLayout third_party_login_xinlang;  
  5.     public String TAG = "LoginActivity---->";  
  6.     public static Oauth2AccessToken accessToken;  
  7.     private Weibo mWeibo;  
  8.     private SsoHandler mSsoHandler;  
  9.     private Handler handler = new Handler() {  
  10.         @Override  
  11.         public void handleMessage(Message msg) {  
  12.             case END_SINA:  
  13.                 Log.v(TAG, "sina data loded!!");  
  14.                 isAlreadExist(LoginActivity.loginType);  
  15.                 break;  
  16.             default:  
  17.                 break;  
  18.             }  
  19.         }  
  20.     };  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.login);  
  26.         initViews();  
  27.         initData();  
  28.     }  
  29.   
  30.     private void initData() {// 新浪微博实例  
  31.   
  32.         mWeibo = Weibo.getInstance(ConstantS.APP_KEY, ConstantS.REDIRECT_URL,  
  33.                 TAG);  
  34.     }  
  35.   
  36.     private void initViews() {  
  37.         third_party_login_xinlang.setOnClickListener(this);  
  38.   
  39.     }  
  40.   
  41.     @Override  
  42.     public void onClick(View v) {  
  43.         switch (v.getId()) {  
  44.         case R.id.third_party_login_xinlang:  
  45.             isThreeLogin("1");  
  46.             isSinaLogin();  
  47.             break;  
  48.         }  
  49.   
  50.     }  
  51.     /** 
  52.      * 新浪登录 
  53.      */  
  54.     private void isSinaLogin() {  
  55.         mSsoHandler = new SsoHandler(this, mWeibo);  
  56.         mSsoHandler.authorize(new AuthDialogListener(), null);  
  57.     }  
  58.     /** 
  59.      * 新浪回调 
  60.      *  
  61.      * @author Administrator 
  62.      *  
  63.      */  
  64.     private class AuthDialogListener implements WeiboAuthListener {  
  65.   
  66.         @Override  
  67.         public void onCancel() {  
  68.   
  69.         }  
  70.   
  71.         @Override  
  72.         public void onComplete(Bundle values) {  
  73.             String token = values.getString("access_token");  
  74.             String expires_in = values.getString("expires_in");  
  75.             final String idstr = values.getString("uid");  
  76.             LoginActivity.accessToken = new Oauth2AccessToken(token, expires_in);  
  77.             if (LoginActivity.accessToken.isSessionValid()) {  
  78.                 String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")  
  79.                         .format(new java.util.Date(accessToken.getExpiresTime()));  
  80.                 AccessTokenKeeper.keepAccessToken(LoginActivity.this,  
  81.                         accessToken);  
  82.             }  
  83.             new Thread(new Runnable() {  
  84.                 @Override  
  85.                 public void run() {  
  86.                     UserApi userApi = new UserApi(accessToken);  
  87.                     userApi.show(idstr, new SinaRequestListener());  
  88.                 }  
  89.             }).start();  
  90.         }  
  91.   
  92.         @Override  
  93.         public void onError(WeiboDialogError arg0) {  
  94.   
  95.         }  
  96.   
  97.         @Override  
  98.         public void onWeiboException(WeiboException arg0) {  
  99.   
  100.         }  
  101.   
  102.     }  
  103.   
  104.     /** 
  105.      * 新浪请求接口 
  106.      *  
  107.      * @author Administrator 
  108.      *  
  109.      */  
  110.     private class SinaRequestListener implements RequestListener {  
  111.   
  112.         @Override  
  113.         public void onComplete(String response) {  
  114.             JsonUtil jsonUtil = new JsonUtil();  
  115.             JSONObject jsonObject = jsonUtil.getJsonObject(response);  
  116.             try {  
  117.                 Message msg = Message.obtain();  
  118.                 String idstr = jsonObject.getString("idstr");// 唯一标识符(uid)  
  119.                 String name = jsonObject.getString("name");// 姓名  
  120.                 String avatar_hd = jsonObject.getString("avatar_hd");// 头像  
  121.   
  122.                 userModel.setUid(idstr);  
  123.                 userModel.setNickname(name);  
  124.                 userModel.setAvatar(avatar_hd);  
  125.                   
  126.                 msg.what = END_SINA;  
  127.                 handler.sendMessage(msg);  
  128.             } catch (Exception e) {  
  129.                 e.printStackTrace();  
  130.             }  
  131.         }  
  132.   
  133.         @Override  
  134.         public void onComplete4binary(ByteArrayOutputStream arg0) {  
  135.   
  136.         }  
  137.   
  138.         @Override  
  139.         public void onError(WeiboException arg0) {  
  140.   
  141.         }  
  142.   
  143.         @Override  
  144.         public void onIOException(IOException arg0) {  
  145.   
  146.         }  
  147.   
  148.     }  
  149.   
  150.     @Override  
  151.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  152.         super.onActivityResult(requestCode, resultCode, data);  
  153.   
  154.         if (mSsoHandler != null) {  
  155.             mSsoHandler.authorizeCallBack(requestCode, resultCode, data);  
  156.         }  
  157.     }  
  158.   
  159. }  

你可能感兴趣的:(Android应用接入第三方登陆之新浪微博)