package com.taobao.tae.Mshopping.demo.activity; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import com.sina.weibo.sdk.auth.Oauth2AccessToken; import com.sina.weibo.sdk.auth.WeiboAuth; import com.sina.weibo.sdk.auth.WeiboAuthListener; import com.sina.weibo.sdk.auth.sso.SsoHandler; import com.sina.weibo.sdk.exception.WeiboException; import com.taobao.tae.Mshopping.demo.MshoppingApplication; import com.taobao.tae.Mshopping.demo.R; import com.taobao.tae.Mshopping.demo.constant.Constants; import com.taobao.tae.Mshopping.demo.constant.UmengAnalysis; import com.taobao.tae.Mshopping.demo.login.LoginType; import com.taobao.tae.Mshopping.demo.login.weibo.AccessTokenKeeper; import com.taobao.tae.Mshopping.demo.login.weibo.WeiboUser; import com.taobao.tae.Mshopping.demo.util.Helper; import com.umeng.analytics.MobclickAgent; import org.json.JSONObject; import java.io.IOException; /** * 新浪微博授权登录Activity * Created by xinyuan on 14/7/29. */ public class WeiboOAuthLoginActivity extends BaseActivity { private static final String TAG = WeiboOAuthLoginActivity.class.getName(); /** * 微博 Web 授权类,提供登陆等功能 */ private WeiboAuth mWeiboAuth; /** * 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */ private Oauth2AccessToken mAccessToken; /** * 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */ private SsoHandler mSsoHandler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weibo_login_activity); // 创建微博实例 mWeiboAuth = new WeiboAuth(this, Constants.WEIBO_APP_KEY, Constants.WEIBO_REDIRECT_URL, Constants.WEIBO_SCOPE); // 通过单点登录 (SSO) 获取 Token mSsoHandler = new SsoHandler(WeiboOAuthLoginActivity.this, mWeiboAuth); mSsoHandler.authorize(new AuthListener()); // 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息, // 第一次启动本应用,AccessToken 不可用 mAccessToken = AccessTokenKeeper.readAccessToken(this); if (mAccessToken.isSessionValid()) { //TODO } MobclickAgent.setDebugMode(UmengAnalysis.isOpenAnalyticsDebug); } /** * 当 SSO 授权 Activity 退出时,该函数被调用。 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); 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); if (mAccessToken.isSessionValid()) { // 保存 Token 到 SharedPreferences AccessTokenKeeper.writeAccessToken(WeiboOAuthLoginActivity.this, mAccessToken); GetWeiboUserInfoTask getWeiboUserInfoTask = new GetWeiboUserInfoTask(); getWeiboUserInfoTask.execute(); finish(); } else { String code = values.getString("code"); finish(); toast("授权失败"); } } @Override public void onCancel() { finish(); toast("取消登陆"); } @Override public void onWeiboException(WeiboException e) { e.printStackTrace(); finish(); toast("授权失败"); } } public class GetWeiboUserInfoTask extends AsyncTask<String, Integer, Boolean> { private Context context; @Override protected Boolean doInBackground(String... params) { try { String json = getWeiboUserInformation(); return parseJSON(json); } catch (IOException e) { e.printStackTrace(); } return false; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); } /** * 获取用户基本信息 */ private String getWeiboUserInformation() { try { Oauth2AccessToken accessToken = AccessTokenKeeper.readAccessToken(WeiboOAuthLoginActivity.this); StringBuilder url = new StringBuilder("https://api.weibo.com/2/users/show.json"); url.append("?access_token="); url.append(accessToken.getToken()); url.append("&uid="); url.append(accessToken.getUid()); String json = Helper.getStringFromUrl(url.toString()); return json; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 解析 Json 结果 * * @param json * @return * @throws java.io.IOException */ public Boolean parseJSON(String json) throws IOException { Boolean result = false; try { WeiboUser weiboUser = new WeiboUser(); JSONObject jsonObject = new JSONObject(json); if(jsonObject.has("name")){ weiboUser.setNick(jsonObject.getString("name")); } if(jsonObject.has("profile_image_url")){ weiboUser.setAvatar(jsonObject.getString("profile_image_url")); } ((MshoppingApplication) getApplication()).setUser(weiboUser); ((MshoppingApplication) getApplication()).setLoginType(LoginType.WEIBO.getType()); Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putInt("ACTIVITY_NAME_KEY", R.string.title_activity_weibo_login); intent.putExtras(bundle); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setClass(WeiboOAuthLoginActivity.this, HomeActivity.class); startActivity(intent); toast("登录成功"); } catch (Exception e) { Log.e("IOException is : ", e.toString()); e.printStackTrace(); } return result; } } }