Android第三方登陆之新浪微博Weibo篇(原生登陆授权)
前言
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篇(原生登陆授权)的更多相关文章
- 大叔也说Xamarin~Android篇~原生登陆与WebView的网站如何共享Session
回到目录 事情是这样的,我们最近开了一个APP,主要使用xamarin做了一个登陆,它与服务器API进行数据通讯,当用户名密码正确去,跳转到新的activity,并在webview控件中打开服务端的H ...
- Android第三方授权(新浪微博篇)
Android第三方认证新浪微博,相对微信,也比较简单,并且sina给了一个sdk和sdkdemo,这个demo封装了许多,但是自己不准备记录这个demo,而是直接使用sdk 同样去sina官方下载s ...
- android第三方登陆
实现QQ.微信.新浪微博和百度第三方登录(Android Studio) 前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第 ...
- Android 第三方开源库收集整理(转)
原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样, ...
- 45.Android 第三方开源库收集整理(转)
原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样, ...
- Android应用内使用新浪微博SDK发送微博(不调用微博客户端)
需求 手头的一个应用需要添加分享到新浪微博的功能,这个功能在现在的应用上是非常的普遍的了. 分享到新浪微博,其实就是发送一条特定内容的微博,所以需要用到新浪微博SDK了. 微博SDK SDK的下载地址 ...
- Android第三方微博、无线传输、动画特效、商城应用等源码
Android精选源码 Android汽车助手源码 一个酷炫的Android特效源码 新浪微博的第三方客户端.UI遵循Material Design. Android实现旋转木马布局多种效果 Andr ...
- Android 第三方应用接入微信平台(2)
微信平台开放后倒是挺火的,许多第三方应用都想试下,毕竟可以利用微信 建立起来的关系链来拓展自己的应用还是挺不错的,可以节约很多在社交方 面的开销,我最近由于实习需要也在研究这个东西,不过发现网上的相关 ...
- Android 第三方应用接入微信平台(1)
关键字:微信开放平台 Android第三方应用接入微信 微信平台开放后倒是挺火的,许多第三方应用都想试下接入微信这个平台, 毕竟可以利用微信建立起来的关系链来拓展自己的应用还是挺不错的,可 以节约 ...
随机推荐
- The meaning of the number displayed on the man page in Linux
0 Header files 0p Header files (POSIX) 1 Executable programs or shell commands 1p Executable program ...
- Linux - 用户管理与文件权限
目录 Linux - 用户管理与文件权限 创建普通用户 切换用户 userdel删除用户 sudo 命令 文件与目录权限 Linux权限的解读 目录权限 查看用户权限的命令 文件权限 修改权限的命令 ...
- 【codeforces 758D】Ability To Convert
[题目链接]:http://codeforces.com/contest/758/problem/D [题意] 给你一个n进制的数k; 问你它可能的最小的十进制数是多少; [题解] 从右往左; 获取数 ...
- JavaSE 学习笔记之多线程(十三)
多线程: 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺 ...
- kafka监控工具kafka-manager
1.几个kafka监控工具 Kafka Web Console:监控功能较为全面,可以预览消息,监控Offset.Lag等信息,但存在bug,不建议在生产环境中使用. Kafka Manager:偏向 ...
- SCU Censor
Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text p . Her j ...
- 创建序列化器,序列化管理器,closureSerializer
创建序列化器,序列化管理器,closureSerializer //通过反射创建序列化对象 // Create an instance of the class with the given name ...
- 如何拿CSDN博客上的原图
比如带水印的地址: http://img.blog.csdn.net/20140408122234546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdT ...
- Swift: 一句话获取虚拟机上APP所在的目录
在XCode6上,虚拟机的App的存放位置发生了变化,通过下面语句,我们可以立即获得其所在的位置: println(NSTemporaryDirectory())
- HDOJ 4857 逃生
BestHack.....真乱..... 逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...