因爲項目需要,所以學習了下微博的第三方授權登錄,在此記錄,以便查閱。
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();
}
}