因为项目需要,所以学习了下微博的第三方授权登录,在此记录,以便查阅。
1.开发者注册和完善app信息
1.1 进入http://open.weibo.com/,使用微博账号登录,完善开发者信息(选择个人或者公司)
1.2 进入http://open.weibo.com/development,点击创建应用,选择移动应用,完善信息(只是测试的话,一些信息可以先随便填,但android包名,和签名需要真实填写),拿到Appkey,在“应用信息”里填写授权回调页:https://api.weibo.com/oauth2/default.html 取消授权回调页:https://api.weibo.com/oauth2/default.html,在“接口管理”申请微博写入权限(如果需要分享到微博,但该App需要审核通过先)
获取Android签名可点击签名工具下载apk,填入包名便可生成签名
记得填写授权回调页
2.获取AccessToken 和 openId,用户信息,分享到微博
2.1 在 GitHub ( https://github.com/mobileresearch/weibo_android_sdk )下载整个示例工程以及对应的 APK 安装包,在 demo-src 找到 WeiboSDK 这个项目,导入到 Eclipse ,选中你的项目, Alt+Enter, 点击 Add, 将 WeiboSDK 引入到你的项目
在demo-src找到,WeiboSDKDemo项目下的AccessTolenKeeper.java和Constants.java这两个类,考到你想的要放的文件夹下,修改App_KEY(上面申请到的),REDIRECT_URL,配置AndroidManifest.xml,添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
接下来,开始我们的微博登录:
MainActivity.java
public class MainActivity extends Activity {
/** 微博 Web 授权类,提供登陆等功能 */
private WeiboAuth mWeiboAuth;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
/** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
private SsoHandler mSsoHandler;
/** 微博用户信息接口 */
private UsersAPI mUsersAPI;
/** 用于获取微博信息流等操作的API */
private StatusesAPI mStatusesAPI;
private TextView mShowInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1.4版本:此处需新增参数,传入应用程序的全局context,可通过activity的getApplicationContext方法获取
// 创建微博实例
mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY,
Constants.REDIRECT_URL, Constants.SCOPE);
initView();
}
public void initView() {
mShowInfo = (TextView) this.findViewById(R.id.show_info);
}
public void weiboAuth(View view) {
startSinaWeiboAuth();
}
public void shareToWeibo(View view) {
if (mAccessToken != null) {
// 对statusAPI实例化
mStatusesAPI = new StatusesAPI(mAccessToken);
String content = "";
// 请注意:该接口暂不支持发布多图,即参数pic_id不可用(只能通过BD合作接入,不对个人申请)
String photoURL = "";
mStatusesAPI.uploadUrlText(content, photoURL, null, null, null,
mListener);
} else {
Toast("Oauth2AccessToken is null ,Please authorize");
}
}
public void getUserInfo(View view) {
userinfo();
}
// SSO 授权
private void startSinaWeiboAuth() {
mSsoHandler = new SsoHandler(MainActivity.this, mWeiboAuth);
mSsoHandler.authorize(new AuthListener());
}
private void userinfo() {
if (mAccessToken != null) {
mUsersAPI = new UsersAPI(mAccessToken); // 获取用户信息接口
long uid = Long.parseLong(mAccessToken.getUid());
mUsersAPI.show(uid, mListener);
} else {
Toast("Oauth2AccessToken is null ,Please authorize");
}
}
/**
* 微博认证授权回调类。 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);
if (mAccessToken.isSessionValid()) {
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(MainActivity.this,
mAccessToken);
mShowInfo.setText(mAccessToken.toString());
} else {
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
String code = values.getString("code");
if (!TextUtils.isEmpty(code)) {
code = "auth_failed" + "\nObtained the code: " + code;
}
mShowInfo.setText(code);
}
}
@Override
public void onCancel() {
Toast("weibos_auth_canceled");
}
@Override
public void onWeiboException(WeiboException e) {
Toast("Auth exception : " + e.getMessage());
}
}
private RequestListener mListener = new RequestListener() {
@Override
public void onComplete(String response) {
if (!TextUtils.isEmpty(response)) {
// 调用 User#parse 将JSON串解析成User对象
User user = User.parse(response);
mShowInfo.setText("name=" + user.name + ",gender="
+ user.gender + ",avatar_large=" + user.avatar_large
+ "...");
}
}
@Override
public void onWeiboException(WeiboException arg0) {
// TODO Auto-generated method stub
mShowInfo.setText(arg0.toString());
}
};
/**
* 当 SSO 授权 Activity 退出时,该函数被调用。
*
* @see {@link Activity#onActivityResult}
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
;
}
private void Toast(String msg) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}