package com.partynetwork.iparty.app.common; import java.util.List; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import com.lidroid.xutils.util.LogUtils; import com.partynetwork.dataprovider.util.T; import com.partynetwork.iparty.app.AppContext; import com.partynetwork.iparty.app.AppException; import com.partynetwork.iparty.app.util.StringUtils; import com.partynetwork.iparty.login.Login.LoginAuthListener; 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.exception.WeiboException; import com.sina.weibo.sdk.net.AsyncWeiboRunner; import com.sina.weibo.sdk.net.RequestListener; import com.sina.weibo.sdk.net.WeiboParameters; /** * 新浪微博帮助类 */ public class SinaWeiboHelper { private static final String APPKEY = "263313277"; private static final String REDIRECTURL = "https://api.weibo.com/oauth2/default.html"; 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"; /** 访问微博服务接口的地址 */ protected static final String API_SERVER = "https://api.weibo.com/2"; /** POST 请求方式 */ protected static final String HTTPMETHOD_POST = "POST"; /** GET 请求方式 */ protected static final String HTTPMETHOD_GET = "GET"; /** HTTP 参数 */ protected static final String KEY_ACCESS_TOKEN = "access_token"; /** * 是否授权 * * @return */ public static boolean isAuth(Context context) { // 获取当前已保存过的 Token Oauth2AccessToken mAccessToken = AccessTokenKeeper .readSinaAccessToken(context); if (mAccessToken != null && mAccessToken.isSessionValid()) { return true; } return false; } public static void loginAuth(final Context context, final LoginAuthListener listener) { WeiboAuth mWeiboAuth = new WeiboAuth(context, APPKEY, REDIRECTURL, SCOPE); mWeiboAuth.anthorize(new WeiboAuthListener() { @Override public void onWeiboException(WeiboException arg0) { LogUtils.i("微博授权异常1:" + arg0.getMessage()); System.out.println("微博授权异常1:" + arg0.getMessage()); } @Override public void onComplete(Bundle arg0) { // 从 Bundle 中解析 Token Oauth2AccessToken mAccessToken = Oauth2AccessToken .parseAccessToken(arg0); if (mAccessToken.isSessionValid()) { // 保存 Token 到 SharedPreferences AccessTokenKeeper.writeSinaAccessToken(context, mAccessToken); final String token = mAccessToken.getToken(); final long time = mAccessToken.getExpiresTime(); showMyInfo(context, new RequestListener() { @Override public void onWeiboException(WeiboException arg0) { T.showShort(context, arg0.getMessage()); LogUtils.i("微博授权异常2:" + arg0.getMessage()); } @Override public void onComplete(String arg0) { LogUtils.i("myInfo:" + arg0); try { JSONObject treeObject = new JSONObject(arg0); String uid = treeObject.getString("idstr"); String name = treeObject .getString("screen_name"); String head = treeObject.getString("avatar_hd"); if (null != listener) { listener.getUserInfo(2, "", uid, name, head, token, time); } else { LogUtils.i("快捷登陆回调不能为空!"); T.showShort(context, "快捷登陆回调不能为空!"); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } else { // 以下几种情况,您会收到 Code: // 1. 当您未在平台上注册的应用程序的包名与签名时; // 2. 当您注册的应用程序包名与签名不正确时; // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 String code = arg0.getString("code"); T.showShort(context, "新浪微博授权异常code:" + code); LogUtils.i("新浪微博授权异常code:" + code); } } @Override public void onCancel() { LogUtils.i("新浪微博授权取消"); } }); } /** * 认证 * * @param listener */ public static void auth(final Context context) { WeiboAuth mWeiboAuth = new WeiboAuth(context, APPKEY, REDIRECTURL, SCOPE); if (!isAuth(context)) { mWeiboAuth.anthorize(new WeiboAuthListener() { @Override public void onWeiboException(WeiboException arg0) { } @Override public void onComplete(Bundle arg0) { // 从 Bundle 中解析 Token Oauth2AccessToken mAccessToken = Oauth2AccessToken .parseAccessToken(arg0); if (mAccessToken.isSessionValid()) { // 保存 Token 到 SharedPreferences AccessTokenKeeper.writeSinaAccessToken(context, mAccessToken); AppContext appContext = (AppContext) context .getApplicationContext(); try { appContext.bind(mAccessToken.getUid(), mAccessToken.getToken(), mAccessToken.getExpiresTime(), 0); } catch (AppException e) { e.makeToast(context); } } else { // 以下几种情况,您会收到 Code: // 1. 当您未在平台上注册的应用程序的包名与签名时; // 2. 当您注册的应用程序包名与签名不正确时; // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 String code = arg0.getString("code"); T.showShort(context, "新浪微博授权异常code:" + code); } } @Override public void onCancel() { // TODO Auto-generated method stub } }); } } /** * 退出登录 * * @param context * @param listener */ public static void logout(Context context, RequestListener listener) { requestAsync(context, "https://api.weibo.com/oauth2/revokeoauth2", new WeiboParameters(), HTTPMETHOD_POST, listener); } /** * 授权并且分享 * * @param status * @param imageUrl * @param listener */ public static void authAndShare(final Context context, final String status, final List<String> imageUrl, final RequestListener listener) { WeiboAuth mWeiboAuth = new WeiboAuth(context, APPKEY, REDIRECTURL, SCOPE); if (!isAuth(context)) { mWeiboAuth.anthorize(new WeiboAuthListener() { @Override public void onWeiboException(WeiboException arg0) { T.showShort(context, "授权错误" + arg0.getMessage()); } @Override public void onComplete(Bundle arg0) { // 从 Bundle 中解析 Token Oauth2AccessToken mAccessToken = Oauth2AccessToken .parseAccessToken(arg0); if (mAccessToken.isSessionValid()) { // 保存 Token 到 SharedPreferences AccessTokenKeeper.writeSinaAccessToken(context, mAccessToken); shareMessage(context, status, imageUrl, listener); } else { // 以下几种情况,您会收到 Code: // 1. 当您未在平台上注册的应用程序的包名与签名时; // 2. 当您注册的应用程序包名与签名不正确时; // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。 String code = arg0.getString("code"); T.showShort(context, "新浪微博授权异常code:" + code); } } @Override public void onCancel() { T.showShort(context, "用户取消授权"); } }); } else { shareMessage(context, status, imageUrl, listener); } } /** * 发布分享 * * @param status * @param imageUrl * @param listener */ public static void shareMessage(final Context context, String status, List<String> imageUrl, RequestListener listener) { // 判断是否授权 if (StringUtils.isEmpty(status)) { status += "你们觉得怎么样?"; } if (!isAuth(context)) { authAndShare(context, status, imageUrl, listener); } else { if (imageUrl == null || imageUrl.size() < 1) { // 调用纯文本 LogUtils.i("调用纯文本"); WeiboParameters params = new WeiboParameters(); params.put("status", status); requestAsync(context, API_SERVER + "/statuses/update.json", params, HTTPMETHOD_POST, listener); } else { LogUtils.i("调用带图片链接的分享--只能分享第一张图片"); // mStatusesAPI.update(status + imageUrl, null, null, listener); String urls = ""; for (int i = 0; i < imageUrl.size(); i++) { if (i != imageUrl.size() - 1) { urls += imageUrl.get(i) + ","; } else { urls += imageUrl.get(i); } } LogUtils.i("urls:" + urls); WeiboParameters params = new WeiboParameters(); params.put("status", status); params.put("url", imageUrl); params.put("pic_id", imageUrl.get(0)); requestAsync(context, API_SERVER + "/statuses//upload_url_text.json", params, HTTPMETHOD_POST, listener); } } } /** * 获取用户关注列表 * * @param context * @param listener */ public static void getFriends(final Context context, RequestListener listener) { Oauth2AccessToken mAccessToken = AccessTokenKeeper .readSinaAccessToken(context); WeiboParameters params = new WeiboParameters(); params.put("count", 30); params.put("uid", mAccessToken.getUid()); requestAsync(context, API_SERVER + "/friendships/friends.json", params, HTTPMETHOD_GET, listener); } /** * 显示自己的资料 * * @param context * @param listener */ public static void showMyInfo(final Context context, RequestListener listener) { Oauth2AccessToken mAccessToken = AccessTokenKeeper .readSinaAccessToken(context); WeiboParameters params = new WeiboParameters(); params.put("uid", mAccessToken.getUid()); requestAsync(context, API_SERVER + "/users/show.json", params, HTTPMETHOD_GET, listener); } /** * HTTP 异步请求。 * * @param url * 请求的地址 * @param params * 请求的参数 * @param httpMethod * 请求方法 * @param listener * 请求后的回调接口 */ private static void requestAsync(Context context, String url, WeiboParameters params, String httpMethod, RequestListener listener) { // 获取当前已保存过的 Token Oauth2AccessToken mAccessToken = AccessTokenKeeper .readSinaAccessToken(context); if (null == mAccessToken || TextUtils.isEmpty(url) || null == params || TextUtils.isEmpty(httpMethod) || null == listener) { LogUtils.i("Argument error!"); return; } params.put(KEY_ACCESS_TOKEN, mAccessToken.getToken()); AsyncWeiboRunner.requestAsync(url, params, httpMethod, listener); } /** * HTTP 同步请求。 * * @param url * 请求的地址 * @param params * 请求的参数 * @param httpMethod * 请求方法 * * @return 同步请求后,服务器返回的字符串。 */ private static String requestSync(Context context, String url, WeiboParameters params, String httpMethod) { // 获取当前已保存过的 Token Oauth2AccessToken mAccessToken = AccessTokenKeeper .readSinaAccessToken(context); if (null == mAccessToken || TextUtils.isEmpty(url) || null == params || TextUtils.isEmpty(httpMethod)) { LogUtils.i("Argument error!"); return ""; } params.put(KEY_ACCESS_TOKEN, mAccessToken.getToken()); return AsyncWeiboRunner.request(url, params, httpMethod); } }