本文章参考资料:
http://blog.csdn.net/highboys/article/details/52139268
http://blog.csdn.net/yypsober/article/details/51720355?locationNum=3&fps=1
如上面的图,总共用了三种实现方式
1.SSO单点登录:前提是你的手机上装了微博的app,否则报错
2.web页面登录:弹出一个web界面,然后实现账号密码登录
3.All in one方式授权登录:自动识别如果手机拥有微博app就通过SSO单点登录,没有的话就通过web页面登录,该功能比较人性化,这也是第三方登录常用的方式
首先,注册->注册成功->微连接->移动应用->立即接入->填写名字,应用创建->打开应用信息->基础信息按要求填写:如下
这里的报名就是你创建android工程时的包名,Android签名的话页面有提示使用他提示的android签名生成工具生成,你只需要将你创建的app运行在你手机上,然后再装上android签名生成,复制上去(所以第一步其实应该是先创建一个project的)其他一些基本按要求就行
另外还需要 应用信息->高级信息 填写回调页
我这里填写的是http://www.sina.com,一般都是填写微博的默认回调页http://api.weibo.com/oauth2/default.html,道理来说也可以用自己公司网站什么的
public class Constants {
//用户信息
public static String name = null;//名字
public static String gender = null;//性别
public static String location = null;//归属地
public static String token = null;
/** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */
public static final String APP_KEY = "490704571";
//填写自己创建时自己填的回调页url
public static final String REDIRECT_URL = "http://www.sina.com";
/*
* Scope 是 OAuth2.0 授权机制中 authorize 接口的一个参数。
* 目前 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";
}
第二个Activity如下
是的,就这么简陋(其实是拿了别人的代码懒得改)基本逻辑应该清楚了,那接下来应该是第三部了
public class OAuthActivity extends AppCompatActivity implements View.OnClickListener,WeiboAuthListener{
//登录按钮
private Button btnSsoLogIn;
private Button btnWebLogIn;
private Button btnAllInOneLogIn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
}
private void initView() {
btnSsoLogIn = (Button) findViewById(R.id.logIn_btn_SsoLogin);
btnSsoLogIn.setOnClickListener(this);
btnWebLogIn = (Button) findViewById(R.id.logIn_btn_WebLogin);
btnWebLogIn.setOnClickListener(this);
btnAllInOneLogIn = (Button) findViewById(R.id.logIn_btn_AllInOneLogin);
btnAllInOneLogIn.setOnClickListener(this);
}
/**
* 微博认证授权回调类。
* 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
* 该回调才会被执行。
* 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
* 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
*/
@Override
public void onComplete(Bundle bundle) {
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(OAuthActivity.this, "授权异常", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(OAuthActivity.this, "授权取消", Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
}
/**
* 注意:SsoHandler 仅当 SDK 支持 SSO 时有效
*/
private SsoHandler mSsoHandler;
private AuthInfo mAuthInfo;
/**
* 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能
*/
private Oauth2AccessToken mAccessToken;
//获取用户信息的接口(需要先把官方提供的weibosdk库引入到工程当中来)
UsersAPI mUsersAPI;
然后在onCreate中实现
// 快速授权时,请不要传入 SCOPE,否则可能会授权不成功
mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mSsoHandler = new SsoHandler(this, mAuthInfo);
为几个按钮实现监听
@Override
public void onClick(View v) {
switch (v.getId()) {
//sso授权,仅客户端
case R.id.logIn_btn_SsoLogin:
startSsoWeiBoLogIn();
break;
//web授权
case R.id.logIn_btn_WebLogin:
startWebWeiBoLogIn();
break;
//自动检测,若有客户端,则用sso授权,若没有客户端则用web授权
case R.id.logIn_btn_AllInOneLogin:
startAllInOneWeiBoLogIn();
break;
}
}
各按钮的动作
/**
* all in one 方式授权,自动检测
*/
private void startAllInOneWeiBoLogIn() {
mSsoHandler.authorize(this);
}
/**
* Web授权
*/
private void startWebWeiBoLogIn() {
mSsoHandler.authorizeWeb(this);
}
/**
* SSO授权,仅客户端
*/
private void startSsoWeiBoLogIn() {
mSsoHandler.authorizeClientSso(this);
//通过accessToken获取用户信息
}
@Override
public void onComplete(Bundle bundle) {
//从Bundle中解析Token
mAccessToken = Oauth2AccessToken.parseAccessToken(bundle);
if (mAccessToken.isSessionValid()) {//授权成功
Constants.token = mAccessToken.getToken();
Toast.makeText(OAuthActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();
//获取用户具体信息
getUserInfo();
//跳转页面
Intent intent = new Intent(OAuthActivity.this,MainActivity.class);
startActivity(intent);
finish();
} else {
/**
* 以下几种情况,您会收到 Code:
* 1. 当您未在平台上注册应用程序的包名与签名时;
* 2. 当您注册的应用程序包名与签名不正确时;
* 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
*/
String code = bundle.getString("code");//直接从bundle里边获取
if (!TextUtils.isEmpty(code)) {
Toast.makeText(OAuthActivity.this, "签名不正确", Toast.LENGTH_SHORT).show();
}
}
// String phoneNum = mAccessToken.getPhoneNum();//通过手机短信授权登录时可以拿到,此demo未实现此种授权方式
}
/**
* 1.仅sso授权时,当 SSO 授权 Activity 退出时,该函数被调用。
* 2.仅
*/
@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);
}
}
/**
* 获取用户个人信息
*/
private void getUserInfo() {
//获取用户信息接口
mUsersAPI = new UsersAPI(OAuthActivity.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;
Constants.name = user.screen_name;
Constants.gender = user.gender;
Constants.location = user.location;
// Toast.makeText(LogInActivity.this, "用户的昵称: " + nickName, Toast.LENGTH_SHORT).show();
}
}
/**
*如果运行测试的时候,登录的账号不是注册应用的账号,那么需要去:
*开放平台-》管理中心-》应用信息-》测试信息-》添加测试账号(填写用户昵称)!
* 否则便会抛出以下异常
*/
@Override
public void onWeiboException(WeiboException e) {
e.printStackTrace();
Toast.makeText(OAuthActivity.this, "获取用户个人信息 出现异常", Toast.LENGTH_SHORT).show();
}
};