Android第三方登录的优点有很多,这里先简单略过,后续再补充。先写微博,其他的慢慢补充
新浪微博授权登录
主要流程如下:
这里只是写了一下程序的逻辑,前期的注册申请工作可以参考官网,或者直接点这里:新手指南
/** * 微博账号登录授权流程 * 1. 集成SDK,修改主目录和主模块下面的build.gradle文件,添加微博sdk的依赖 * 2. 创建Constants接口,定义新浪微博授权时所需要的参数(APP_KEY,REDIRECT_URL,SCOPE权限) * 3. 创建微博API接口类对象 初始化WbSdk对象(在应用的Application或者调用SDK功能代码前) * 4. 实现WbAuthListener接口 * 5. 调用方法,认证授权 * 6. 添加SSOhandler的回调,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} */
下面上代码,先是接口
/**
* 该接口定义了新浪微博授权时所需要的参数
*/
public interface Constants {
/**当前该 APP 使用的 APP_KEY ,其他应用使用需要替换*/
public static final String APP_KEY = "396518504";
/**
* 当前应用的回调页
*
* <p>
* 注:关于授权回调页对移动客户端应用来说对用户是不可见的,所以定义为何种形式都将不影响,
* 但是没有定义将无法使用 SDK 认证登录。
* 建议使用默认回调页:https://api.weibo.com/oauth2/default.html
* </p>
*/
public static final String REDIRECT_URL = "https://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";
// public static final String SCOPE = null; //为null时会出现没有点击确定就自动授权成功的情况
}
然后是Activity
public class WBAuthActivity extends Activity {
private SsoHandler ssoHandler;
private Oauth2AccessToken mAccessToken; // 封装了 "uid", "access_token","expires_in","refresh_token",并提供了他们的管理功能
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AuthInfo authInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
WbSdk.install(this, authInfo);
ssoHandler = new SsoHandler(WBAuthActivity.this); //创建微博实例,认证授权
// SSO认证授权 仅客户端
// ssoHandler.authorizeClientSso(new SelfWbAuthListener());
// Web授权 没有客户端,网页授权
// ssoHandler.authorizeWeb(new SelfWbAuthListener());
// SSO 授权+Web 授权 混合授权
ssoHandler.authorize(new SelfWbAuthListener());
// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,第一次启动本,AccessToken 不可用
mAccessToken = AccessTokenKeeper.readAccessToken(WBAuthActivity.this);
if (mAccessToken.isSessionValid()){
updateTokenView(true);
}
}
/** 微博认证授权回调类 */
public class SelfWbAuthListener implements WbAuthListener{
@Override
public void onSuccess(final Oauth2AccessToken oauth2AccessToken) {
WBAuthActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mAccessToken = oauth2AccessToken;
if (mAccessToken.isSessionValid()){
//显示 mAccessToken
updateTokenView(false);
//保存 mAccessToken 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);
Toast.makeText(WBAuthActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void cancel() {
Toast.makeText(WBAuthActivity.this, "取消授权", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(WbConnectErrorMessage wbConnectErrorMessage) {
Toast.makeText(WBAuthActivity.this, "授权失败:" + wbConnectErrorMessage.getErrorMessage(), Toast.LENGTH_SHORT).show();
}
}
/**
* 显示当前 Token 信息
* @param hasExisted 配置文件中是否存在 Token 信息并且合法
*/
public void updateTokenView(boolean hasExisted){
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date(mAccessToken.getExpiresTime()));
String format = "Token:%1$s \n有效期:%2$s \nUid:%3$s";
String message = String.format(format, mAccessToken.getToken(), date, mAccessToken.getUid());
if (hasExisted){
message = "Token 仍在有效期内,无需再次登录。" + "\n" + message;
}
Log.e("WBAuthActivity", message);
}
//用户登出
public void loginOut(){
AccessTokenKeeper.clear(getApplicationContext());
mAccessToken = new Oauth2AccessToken();
updateTokenView(false);
}
//更新Token
public void refreshToken(){
if (!TextUtils.isEmpty(mAccessToken.getRefreshToken())){
AccessTokenKeeper.refreshToken(Constants.APP_KEY, WBAuthActivity.this, new RequestListener() {
@Override
public void onComplete(String s) {
}
@Override
public void onWeiboException(WeiboException e) {
}
});
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (ssoHandler != null){
ssoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("WBAuthActivity", "======WBAuthActivity onDestroy=====");
}
}
最后,贴上第三方登录之支付宝登录,需要的朋友可以参考