前言 
Android第三方登录可以说是非常的常见,今天主要先说一下新浪微博第三方登陆授权。

  • SDK版本支持

SDK v3.0已经发布了支持iPhone和Android的版本。 
须将你的应用的包名签名信息在平台进行填写注册。 
SDK3.0不区分Phone和Pad。Windows Phone请下载SDK v2.0。 
SDK下载地址:http://open.weibo.com/wiki/SDK 
SDK接入流程 
新应用

1、注册成为开发者,创建移动应用

如果你还不是一名开发者,请先注册成为开发者,具体参考新手指南 : http://open.weibo.com/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97

创建应用时,开发者需要谨慎选择应用对应平台,不同的平台建议使用不同APPKEY开发。 

2、创建应用完成后,可以在“我的应用 - 应用信息”中查看您所创建应用的APPKEY及APPSECRET,请妥善保管您的这些信息,这将 成为您调用微博开放平台各API的身份标志,如下图所示: 

3、请在“我的应用 - 应用信息 - 高级信息”中填写您的应用回调页,这样才能使OAuth2.0授权正常进行。如果您的APPSECRET发生泄露,您也可以通过该页面中的重置按钮对其重置,如下图所示:

注:通常Mobile Native App没有服务器回调地址,您可以在应用控制台授权回调页处填写平台提供的默认回调页,该页面用户不可见,仅用于获取access token。 OAuth2.0客户端默认回调页:https://api.weibo.com/oauth2/default.html

4、在“我的应用 - 应用信息”填写应用的平台信息 
 
这里iPhone应用填写Apple ID和Buddle ID,Android应用填写包名,签名及下载地址。 
关于各字段含义在控制台中均有说明。

5、下载并集成对应平台SDK到你的应用中,当您开发完您的应用后,您就可以通过“我的应用”页面提交审核了。只有当您的应用通过审核后,才能在微博中正确显示您的来源地址等。

6、您可以通过“我的应用 – 数据统计”页面查看您的应用的相关统计数据,包括应用统计、接口统计、用户特征统计等信息。

 
已上线应用

请直接编辑“我的应用 – 应用信息”补充应用平台信息,改字段修改后立即生效,无需二次审核。


  • Android 代码实现

git下来weibo_sdk_demo,感受了下他的代码,又是库文件,又是依赖包,真的是非常的麻烦,但是,我们可以从依赖module中取出我们所需要的java文件即可,我们先看一下他的demo架构图,如下所示:

 
,我们把jar包导入到libs中,还有so库文件,官方说的也很明确,一定要导入进去。 
我们先看一下官方demo,是如何授权的,有好多种授权方式,这里我们看看sso,以及web授权

// 创建微博实例
//mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
// 快速授权时,请不要传入 SCOPE,否则可能会授权不成功
mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mSsoHandler = new SsoHandler(WBAuthActivity.this, mAuthInfo); // **SSO 授权, 仅客户端**
findViewById(R.id.obtain_token_via_sso).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//看清楚是mSsoHandler.authorizeClientSso
mSsoHandler.authorizeClientSso(new AuthListener());
}
}); // 手机短信授权
// title 短信注册页面title,可选,不传时默认为""验证码登录""。此处WeiboAuthListener 对象 listener
//可以是和sso 同一个 listener 回调对象 也可以是不同的。开发者根据需要选择
findViewById(R.id.obtain_token_via_mobile).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mSsoHandler.registerOrLoginByMobile("验证码登录",new AuthListener());
}
}); // SSO 授权, 仅Web
findViewById(R.id.obtain_token_via_web).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//看清楚是mSsoHandler.authorizeWeb
mSsoHandler.authorizeWeb(new AuthListener());
}
}); // SSO 授权, ALL IN ONE 如果手机安装了微博客户端则使用客户端授权,没有则进行网页授权
findViewById(R.id.obtain_token_via_signature).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//看清楚是mSsoHandler.authorize
mSsoHandler.authorize(new AuthListener());
}
}); /**
* 当 SSO 授权 Activity 退出时,该函数被调用。
*
* @see {@link Activity#onActivityResult}
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); // SSO 授权回调
// 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResults
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
} } /**
* 微博认证授权回调类。
* 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
* 该回调才会被执行。
* 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
* 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener { @Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
//从这里获取用户输入的 电话号码信息
String phoneNum = mAccessToken.getPhoneNum();
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView(false); // 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);
Toast.makeText(WBAuthActivity.this,
R.string.weibosdk_demo_toast_auth_success, Toast.LENGTH_SHORT).show();
} else {
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
String code = values.getString("code");
String message = getString(R.string.weibosdk_demo_toast_auth_failed);
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(WBAuthActivity.this, message, Toast.LENGTH_LONG).show();
}
} @Override
public void onCancel() {
Toast.makeText(WBAuthActivity.this,
R.string.weibosdk_demo_toast_auth_canceled, Toast.LENGTH_LONG).show();
} @Override
public void onWeiboException(WeiboException e) {
Toast.makeText(WBAuthActivity.this,
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}

其实官方建议我们用sso跟web一起,更加的安全有效,就是加上判断而已,授权前检测是否有没有安装客户端

放出检测是否有没有客户端code

 public static boolean isWeiboInstalled(@NonNull Context context) {
PackageManager pm;
if ((pm = context.getApplicationContext().getPackageManager()) == null) {
return false;
}
List<PackageInfo> packages = pm.getInstalledPackages();
for (PackageInfo info : packages) {
String name = info.packageName.toLowerCase(Locale.ENGLISH);
if ("com.sina.weibo".equals(name)) {
return true;
}
}
return false;
}

-接下来我们自己的实现代码

完整代码如下,有授权和注销代码,需要注意几个地方,我们所需要的api(官方demo里面(WeiboSDK里面有,跟WeiboSDKDemo同级)): 

自己封装的工具类:

public class WeiboLogin {

    private AuthInfo mAuthInfo;
public SsoHandler mSsoHandler;
private Activity mActivity;
private Oauth2AccessToken mAccessToken; private static WeiboLogin instance = new WeiboLogin();
private static String TAG = "weibo";
/**
* 注销回调
*/ private AuthListener mAuthListener; private WeiboLogin() {
} public static WeiboLogin getInstance() { return WeiboLogin.instance;
} public void Weibologin(Activity activity) {
this.mActivity = activity; if (mAuthInfo == null) {
mAuthInfo = new AuthInfo(Application.getContext(), Constants.WBAPP_KEY, Constants.REDIRECT_URL, "");
}
if (mSsoHandler == null) {
mSsoHandler = new SsoHandler(mActivity, mAuthInfo);
}
mAuthListener = new AuthListener(mActivity); // if (isWeiboInstalled(mActivity)) {
//
// mSsoHandler.authorizeClientSso(mAuthListener);
// } else {
//
// mSsoHandler.authorizeWeb(mAuthListener);
// }
mSsoHandler.authorize(mAuthListener);
} /**
* 微博认证授权回调类。
* 1. SSO 授权时,需要在 {@link "onActivityResult"} 中调用 {@link SsoHandler#authorizeCallBack} 后,
* 该回调才会被执行。
* 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
* 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener { private Activity activity; public AuthListener(Activity activity) {
this.activity = activity;
} @Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
//从这里获取用户输入的 电话号码信息
String phoneNum = mAccessToken.getPhoneNum();
String uid = mAccessToken.getUid(); if (mAccessToken.isSessionValid()) { //这个地方的UsersAPI ,是官方的demo的依赖库module里面的,
UsersAPI usersAPI = new UsersAPI(Application.getContext(), Constants.WBAPP_KEY, mAccessToken);
usersAPI.show(Long.parseLong(uid), new SinaRequestListener(activity));
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(Application.getContext(), mAccessToken);
Toast.makeText(Application.getContext(),
R.string.weibosdk_demo_toast_auth_success, Toast.LENGTH_SHORT).show();
} else {
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
String code = values.getString("code");
String message = Application.getContext().getString(R.string.weibosdk_demo_toast_auth_failed);
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(Application.getContext(), message, Toast.LENGTH_LONG).show();
}
} @Override
public void onCancel() {
Toast.makeText(Application.getContext(),
R.string.weibosdk_demo_toast_auth_canceled, Toast.LENGTH_LONG).show();
} @Override
public void onWeiboException(WeiboException e) {
Toast.makeText(Application.getContext(),
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
} class SinaRequestListener implements RequestListener { private Activity mActivity; public SinaRequestListener(Activity activity) {
this.mActivity = activity;
} @Override
public void onComplete(String response) {
Log.e("xxxx", "微博==" + response);
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(response);
try {
String idstr = jsonObject.getString("idstr");// 唯一标识符(uid)
String name = jsonObject.getString("name");// 姓名
String avatar_hd = jsonObject.getString("avatar_hd"); //通过获取到的用户数据,你可以进行自己的业务逻辑操作
//do something
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public void onWeiboException(WeiboException e) { Log.e("xxxx", e.toString()); }
} /**
* 调用 {@link LogoutAPI#logout(RequestListener)} 来注销。
*/
public void logout(Activity activity) {
this.mActivity = activity;
new LogoutAPI(mActivity, Constants.WBAPP_KEY, AccessTokenKeeper.readAccessToken(mActivity)).logout(new RequestListener() {
@Override
public void onComplete(String response) {
if (!TextUtils.isEmpty(response)) {
try {
JSONObject obj = new JSONObject(response);
if (obj.isNull("error")) {
String value = obj.getString("result"); // 注销成功
if ("true".equalsIgnoreCase(value)) {
// XXX: 考虑是否需要将 AccessTokenKeeper 放到 SDK 中??
//AccessTokenKeeper.clear(getContext());
// 清空当前 Token
Log.e("xxxx", "注销成功");
mAccessToken = null; }
} else {
String error_code = obj.getString("error_code");
if (error_code.equals("")) {
mAccessToken = null;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
} } @Override
public void onWeiboException(WeiboException e) {
LogUtil.e(TAG, "WeiboException: " + e.getMessage());
// 注销失败
}
});
} public static boolean isWeiboInstalled(@NonNull Context context) {
PackageManager pm;
if ((pm = context.getApplicationContext().getPackageManager()) == null) {
return false;
}
List<PackageInfo> packages = pm.getInstalledPackages();
for (PackageInfo info : packages) {
String name = info.packageName.toLowerCase(Locale.ENGLISH);
if ("com.sina.weibo".equals(name)) {
return true;
}
}
return false;
} }

授权的时候出现的一些问题:

有时候是因为debug版本的时候,授权不成功,出现错误码,网络异常(其实我们网络很好),主要是因为微博客户端不是最新的,更新即可

有时候库文件原因,新建jnilibs文件夹即可

有时候可以添加如下 
sourceSets { 
main.jniLibs.srcDirs = [‘libs’] 
test.jniLibs.srcDirs = [‘libs’] 

还有就是在mainfest文件中进行相关的配置,

<!-- 必须注册在微博授权,分享微博时候用到 -->
<activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="keyboardHidden|orientation"
android:windowSoftInputMode="adjustResize"
android:exported="false" >
</activity>

Android第三方登陆之新浪微博Weibo篇(原生登陆授权)的更多相关文章

  1. 大叔也说Xamarin~Android篇~原生登陆与WebView的网站如何共享Session

    回到目录 事情是这样的,我们最近开了一个APP,主要使用xamarin做了一个登陆,它与服务器API进行数据通讯,当用户名密码正确去,跳转到新的activity,并在webview控件中打开服务端的H ...

  2. Android第三方授权(新浪微博篇)

    Android第三方认证新浪微博,相对微信,也比较简单,并且sina给了一个sdk和sdkdemo,这个demo封装了许多,但是自己不准备记录这个demo,而是直接使用sdk 同样去sina官方下载s ...

  3. android第三方登陆

    实现QQ.微信.新浪微博和百度第三方登录(Android Studio) 前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第 ...

  4. Android 第三方开源库收集整理(转)

    原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样,  ...

  5. 45.Android 第三方开源库收集整理(转)

    原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样,  ...

  6. Android应用内使用新浪微博SDK发送微博(不调用微博客户端)

    需求 手头的一个应用需要添加分享到新浪微博的功能,这个功能在现在的应用上是非常的普遍的了. 分享到新浪微博,其实就是发送一条特定内容的微博,所以需要用到新浪微博SDK了. 微博SDK SDK的下载地址 ...

  7. Android第三方微博、无线传输、动画特效、商城应用等源码

    Android精选源码 Android汽车助手源码 一个酷炫的Android特效源码 新浪微博的第三方客户端.UI遵循Material Design. Android实现旋转木马布局多种效果 Andr ...

  8. Android 第三方应用接入微信平台(2)

    微信平台开放后倒是挺火的,许多第三方应用都想试下,毕竟可以利用微信 建立起来的关系链来拓展自己的应用还是挺不错的,可以节约很多在社交方 面的开销,我最近由于实习需要也在研究这个东西,不过发现网上的相关 ...

  9. Android 第三方应用接入微信平台(1)

    关键字:微信开放平台   Android第三方应用接入微信 微信平台开放后倒是挺火的,许多第三方应用都想试下接入微信这个平台, 毕竟可以利用微信建立起来的关系链来拓展自己的应用还是挺不错的,可 以节约 ...

随机推荐

  1. 洛谷 2387 NOI2014魔法森林 LCT

    [题解] 我们先把边按照$a$值从小到大排序,并按照这个顺序加边. 如果当前要加入的边连接的两点$u$与$v$已经是连通的,那么直接加入这条边就会出现环.这时我们需要删除这个环中$b$值最大的边.因此 ...

  2. Codeforces 912D - Fishes

    传送门:http://codeforces.com/contest/912/problem/D 本题是一个概率问题——求数学期望. 在一个n×m的方格中,有k个“*”.每个格子里可能有0~1个“*”. ...

  3. jquery 插件封装模板

    //插件编写模板 ;(function ($) { $.fn.plugIn = function ( opt ) { var def = { //这里填写自定义的参数例如: event : 'clic ...

  4. 【codeforces 758D】Ability To Convert

    [题目链接]:http://codeforces.com/contest/758/problem/D [题意] 给你一个n进制的数k; 问你它可能的最小的十进制数是多少; [题解] 从右往左; 获取数 ...

  5. Python之路【第一篇】:Python基础

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  6. hdu 3657最大点权独立集变形(方格取数变形)

    /* 分奇偶为二部图,s与奇建图,t与偶建图,权值为当前数的值,如果遇到必取的权值置为inf. 奇偶建边为相邻的权值为2*(x&y):所有数的值-最小点全覆盖. 置为inf意为不能割掉.奇偶边 ...

  7. LSB、MSB是什么单位

    最低有效位 (LSB: Least Significant Bit)   最低有效位(LSB)是给这些单元值的一个二进制整数位位置,就是,决定是否这个数字是偶数或奇数.LSB有时候是指最右边的位,因为 ...

  8. AngularJS:实现页面滚动到底自动加载数据的功能

    要实现这个功能,可以通过https://github.com/sroze/ngInfiniteScroll这个第三方控件来实现.步骤如下: 1. 下载ng-infinite-scroll.js程序ht ...

  9. 切换div位置

    通过数组来存放div的属性以及属性值,鼠标点击的时候,切换数组中的元素,然后赋值给div <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  10. poj 1635

    有根树同构.参考论文<hash在....> #include <iostream> #include <fstream> #include <algorith ...