package net.oschina.app.common;
import net.oschina.app.AppContext;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import com.tencent.weibo.api.TAPI;
import com.tencent.weibo.constants.OAuthConstants;
import com.tencent.weibo.oauthv1.OAuthV1;
import com.tencent.weibo.oauthv1.OAuthV1Client;
import com.tencent.weibo.utils.QHttpClient;
import com.tencent.weibo.webview.OAuthV1AuthorizeWebView;
/**
* 注意:务必要在所在的Activity中的onActivityResult中回调调用onAuthorizeWebViewReturn
*
* 支持本地分享
*
* @author yeguozhong@yeah.net
*
*/
@SuppressLint("Instantiatable")
public class QQWeiboHelper2 {
private final static String APP_KEY = "96f54f97c4de46e393c4835a266207f4";
private final static String APP_SECRET = "d10f1da05b2b17db1ac18471b6cb5de6";
private final static int AUTH_VIEW_REQUEST_CODE = 1;
//
private final static String OAUTH_CACHE_FILE = "OAuthV1_CACHE";
private String oauthCallback = "null";
private OAuthV1 oAuth;
private static OAuthV1 OAuthV1Cache;
private TAPI tAPI;
private String mContent;
private String mPicPath;
private AppContext ac;
public final static int REQUEST = 0;
public final static int ACCESS = 1;
public final static int SEND = 2;
private Activity context;
// 标识是否回调了onAuthorizeWebViewReturn
private boolean isCallBack = false;
public QQWeiboHelper2(Activity context, String content, String mPic) {
this.context = context;
this.mContent = content;
this.mPicPath = mPic;
}
/**
* 主线程和网络线程交互处理
*/
private Handler mHandler = new Handler() {
@SuppressLint("Instantiatable")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REQUEST:
oAuth = (OAuthV1) msg.obj;
if (oAuth.getStatus() == 1) {
UIHelper.ToastMessage(context, "Request Token 授权不通过");
} else {
Intent intent = new Intent(context,
OAuthV1AuthorizeWebView.class);
intent.putExtra("oauth", oAuth);
context.startActivityForResult(intent,
AUTH_VIEW_REQUEST_CODE);
}
break;
case ACCESS:
oAuth = (OAuthV1) msg.obj;
if (oAuth.getStatus() == 3) {
UIHelper.ToastMessage(context, "Access失败");
} else {
OAuthV1Cache = oAuth;
ac.saveObject(oAuth, OAUTH_CACHE_FILE);
QQWeiboHelper2.this.sendMessage();
}
break;
case SEND:
String data = (String) msg.obj;
if (getReturnMsg(data, "ret").equals("0")) {
UIHelper.ToastMessage(context, "分享成功");
} else if (getReturnMsg(data, "ret").equals("3") // access_token超时
&& getReturnMsg(data, "errcode").equals("4")) {
authenticate(); // 重新认证
} else {
UIHelper.ToastMessage(context, getReturnMsg(data, "msg"));
}
break;
}
};
};
/**
* 发送
* @throws NotCallBackException
*/
public void send() {
ac = (AppContext) context.getApplication();
// 获取凭证流程优先级: 内存 ->外存 ->网络
if (OAuthV1Cache == null) {
OAuthV1 oa = (OAuthV1) ac.readObject(OAUTH_CACHE_FILE);
if (oa == null) {
authenticate();
} else {
oAuth = OAuthV1Cache = oa;
sendMessage();
}
} else {
oAuth = OAuthV1Cache;
sendMessage();
}
}
/**
* 认证
*
* @throws Exception
*/
private void authenticate() {
oAuth = new OAuthV1(oauthCallback);
oAuth.setOauthConsumerKey(APP_KEY);
oAuth.setOauthConsumerSecret(APP_SECRET);
OAuthV1Client.getQHttpClient().shutdownConnection();
OAuthV1Client.setQHttpClient(new QHttpClient());
new Thread() {
@Override
public void run() {
Message msg = mHandler.obtainMessage(REQUEST);
try {
msg.obj = OAuthV1Client.requestToken(oAuth);
mHandler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
/**
*
* 必须在所在的Activity中的onActivityResult中调用该方法....
*
*/
public void onAuthorizeWebViewReturn(int requestCode, int resultCode,
Intent data) {
isCallBack = true;
if (requestCode == AUTH_VIEW_REQUEST_CODE) {
if (resultCode == OAuthV1AuthorizeWebView.RESULT_CODE) {
oAuth = (OAuthV1) data.getExtras().getSerializable("oauth");
if (oAuth.getStatus() == 2) {
UIHelper.ToastMessage(context, "获取验证码失败");
} else {
new Thread() {
@Override
public void run() {
Message msg = mHandler.obtainMessage(ACCESS);
try {
msg.obj = OAuthV1Client.accessToken(oAuth);
mHandler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}
}
}
/**
* 发送信息
*
* @throws Exception
*/
private void sendMessage() {
new Thread() {
public void run() {
Message msg = mHandler.obtainMessage(SEND);
tAPI = new TAPI(OAuthConstants.OAUTH_VERSION_1);
try {
msg.obj = tAPI.addPic(oAuth, "json", mContent, "127.1.1.1",
mPicPath);
} catch (Exception e) {
e.printStackTrace();
}
tAPI.shutdownConnection();
mHandler.sendMessage(msg);
};
}.start();
}
/**
*
* 截取返回的信息
*/
private String getReturnMsg(String data, String key) {
int start = data.indexOf("\"" + key + "\":");
if (start == -1)
return "";
int end = data.indexOf(",", start);
String rs = data.substring(start + 6, end);
return rs.replaceAll("\"", "");
}
}