package com.itap.voiceemoticon.weibo; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.WeakHashMap; import org.tadpoleframework.common.StringUtil; import org.tadpoleframework.thread.ForegroundThread; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Message; import android.util.Log; import android.webkit.CookieSyncManager; import android.widget.Toast; import com.itap.voiceemoticon.VEApplication; import com.itap.voiceemoticon.activity.LoginActivity; import com.itap.voiceemoticon.activity.MainActivity; import com.itap.voiceemoticon.activity.Notification; import com.itap.voiceemoticon.activity.NotificationCenter; import com.itap.voiceemoticon.activity.NotificationID; import com.sina.weibo.sdk.WeiboSDK; import com.sina.weibo.sdk.api.IWeiboAPI; import com.sina.weibo.sdk.api.MusicObject; import com.sina.weibo.sdk.api.SendMultiMessageToWeiboRequest; import com.sina.weibo.sdk.api.TextObject; import com.sina.weibo.sdk.api.WeiboMultiMessage; import com.weibo.sdk.android.Oauth2AccessToken; import com.weibo.sdk.android.Weibo; import com.weibo.sdk.android.WeiboAuthListener; import com.weibo.sdk.android.WeiboDialogError; import com.weibo.sdk.android.WeiboException; import com.weibo.sdk.android.WeiboParameters; import com.weibo.sdk.android.net.AsyncWeiboRunner; import com.weibo.sdk.android.net.RequestListener; import com.weibo.sdk.android.sso.SsoHandler; import com.weibo.sdk.android.util.Utility; public class TPAccountManager { private static final String TAG = "WeiboHelper"; public static final String APP_KEY = "1828437997"; public static final String APP_SECRET = "1828437997"; public static final String REDIRECT_URL = "http://www.sina.com"; public static final String KEY_TOKEN = "access_token"; public static final String KEY_EXPIRES = "expires_in"; public static final String KEY_REFRESHTOKEN = "refresh_token"; public IWeiboAPI sWeiboApi = null; public Weibo mWeibo; public WeiboLoginListener mListener; private Context mContext; private static TPAccountManager sInstance = null; public static void init(Context context) { sInstance = new TPAccountManager(context); } public static TPAccountManager getInstance() { return sInstance; } public static TPAccount getVEAccount() { WeiboLoginAccount loginAccount = WeiboLoginAcountManager.getInstance() .getLastLoginAccount(); if (null == loginAccount) { return null; } TPAccount account = new TPAccount(); account.uid = String.valueOf(loginAccount.uid); account.platform = TPAccount.PLATFORM_WEIBO; return account; } public boolean isLogin() { return WeiboLoginAcountManager.getInstance().isLogin(); } private TPAccountManager(Context context) { // 1 初始化SDK sWeiboApi = WeiboSDK.createWeiboAPI(context, TPAccountManager.APP_KEY); // 2 注册到新浪微博 sWeiboApi.registerApp(); mWeibo = Weibo.getInstance(APP_KEY, REDIRECT_URL, null); mListener = new WeiboLoginListener(context); mContext = context; } public WeiboLoginListener getListener() { return mListener; } public void sendMusic(Activity activity, String title, String description, String musicUrl) { MusicObject musicObject = new MusicObject(); musicObject.duration = 11; musicObject.description = description; musicObject.title = title; musicObject.identify = musicUrl; musicObject.dataUrl = musicUrl; musicObject.dataHdUrl = musicUrl; musicObject.h5Url = musicUrl; musicObject.actionUrl = musicUrl; musicObject.defaultText = title; musicObject.schema = musicUrl; musicObject.thumbData = new byte[] {}; TextObject textObject = new TextObject(); textObject.text = "分享语音表情:" + title + "(" + description + ")"; WeiboMultiMessage weiboMessage = new WeiboMultiMessage(); weiboMessage.mediaObject = musicObject; weiboMessage.textObject = textObject; SendMultiMessageToWeiboRequest req = new SendMultiMessageToWeiboRequest(); req.transaction = String.valueOf(System.currentTimeMillis()); req.multiMessage = weiboMessage; sWeiboApi.sendRequest(activity, req); } public boolean isSupportSSO(Activity activity) { return sWeiboApi.isWeiboAppInstalled(); } private WeakHashMap<Activity, SsoHandler> mSsoMap = new WeakHashMap<Activity, SsoHandler>(); public static Oauth2AccessToken getToken(Bundle values) { Oauth2AccessToken token = new Oauth2AccessToken(); token.setToken(values.getString(KEY_TOKEN)); token.setExpiresIn(values.getString(KEY_EXPIRES)); token.setRefreshToken(values.getString(KEY_REFRESHTOKEN)); System.out.println("getToken = " + token); return token; } public void login(final Activity activity, final Message msg) { if (isSupportSSO(activity)) { SsoHandler ssoHandler = new SsoHandler(activity, mWeibo); ssoHandler.authorize(new WeiboAuthListener() { @Override public void onWeiboException(WeiboException exception) { LoginActivity.start(activity, msg); } @Override public void onError(WeiboDialogError error) { LoginActivity.start(activity, msg); } @Override public void onComplete(Bundle values) { weiboLoginFinish(values, msg); } @Override public void onCancel() { } }); mSsoMap.put(activity, ssoHandler); } else { LoginActivity.start(activity, msg); } } private static String URL_OAUTH2_ACCESS_AUTHORIZE = "https://open.weibo.cn/oauth2"; private void FtchAccessToken(String authorization_code, final Message msg) { System.out.println("FtchAccessToken"); WeiboParameters params = new WeiboParameters(); params.add("client_id", TPAccountManager.APP_KEY); params.add("client_secret", TPAccountManager.APP_SECRET); params.add("grant_type", "authorization_code"); params.add("code", authorization_code); params.add("redirect_uri", TPAccountManager.REDIRECT_URL); AsyncWeiboRunner.request(URL_OAUTH2_ACCESS_AUTHORIZE + "/access_token", params, "POST", new RequestListener() { public void onComplete(String response) { System.out.println("FtchAccessToken"); final Oauth2AccessToken token = new Oauth2AccessToken(response); handleToken(token, msg); } public void onComplete4binary(ByteArrayOutputStream responseOS) { } public void onIOException(IOException e) { e.printStackTrace(); } public void onError(WeiboException e) { e.printStackTrace(); } }); } public void handleToken(final Oauth2AccessToken token, final Message msg) { System.out.println("handleToken"); if (token.isSessionValid()) { System.out.println("Login Success! access_token=" + token.getToken() + " expires=" + token.getExpiresTime() + " refresh_token=" + token.getRefreshToken()); ForegroundThread.sHandler.post(new Runnable() { @Override public void run() { saveAccount(token); Notification notification = NotificationCenter.obtain( NotificationID.N_LOGIN_FINISH, null); NotificationCenter.getInstance().notify(notification); MainActivity.start(mContext, msg); } }); } else { System.out.println("Failed to receive access token"); } } public void weiboLoginFinish(final Bundle values, final Object tag) { final Message msg = (Message)tag; String error = values.getString("error"); String error_code = values.getString("error_code"); String code = values.getString("code"); System.out.println("weiboLoginFinish error = " + error + ", error_code = " + error_code + ", code = " + code); if (error == null && error_code == null) { // 走非code流程 if(StringUtil.isEmpty(code)) { String accessToken = values.getString("access_token"); String refreshToken = values.getString("refresh_token"); String expiresIn = values.getString("expires_in"); Oauth2AccessToken token = new Oauth2AccessToken(); token.setToken(accessToken); token.setExpiresIn(expiresIn); token.setRefreshToken(refreshToken); handleToken(token, msg); } // 走code流程 else { CookieSyncManager.getInstance().sync(); FtchAccessToken(code, msg); } } else { VEApplication.toast("登录失败"); } } public void logout() { WeiboLoginAcountManager.getInstance().logout(); NotificationCenter.obtain(NotificationID.N_LOGOUT).notifyToTarget(); } private void saveAccount(Oauth2AccessToken token) { VEApplication.setSinaToken(token); User user; try { user = Account.getUserPreferCache(token); WeiboLoginAccount loginAccount = new WeiboLoginAccount(); loginAccount.uid = user.id; loginAccount.token = token.getToken(); loginAccount.expiresTime = token.getExpiresTime(); WeiboLoginAcountManager.getInstance().addOrUpdateLoginAcount(loginAccount); } catch (Exception e) { e.printStackTrace(); } } public void callback(Activity activity, int requestCode, int resultCode, Intent data) { final WeakHashMap<Activity, SsoHandler> map = mSsoMap; SsoHandler handler = map.get(activity); System.out.println("handler = " + handler); if (null == handler) { return; } handler.authorizeCallBack(requestCode, resultCode, data); } }