感慨:
对于入手开发基于Sina Weibo客户端的开发人员来说,最大感慨我想就是文档 + 代码 + API接口
1、文档解释不全
2、代码注释很少
3、API 听说很多都遇到 API 封闭情况或者异常!(至少我没遇到)
不过丝毫没有消灭开发者的热情,因为 --> 微博很火!
正文:
2、查看 Sina 提供的 API ,不过最好下 SDK 看,因为很快就能上手,如果有时间,要看一下他们的源代码 ^_^
3、了解 Oauth、Basic Oauth, Xauth .. and so on!
下面是开始着手开发:我想实现微博登录然后发微博,@其他用户
SDK 的目录结构:
---- com_weibo_android (这是一个Liberary)
---- com_weibo_android_example(主要Activity)
在 com_weibo_android_example 中 AuthorizeActivity.java OnClick 方法中提供了3种授权方式:
OAuth2.0隐式授权认证方式, OAuth2.0认证方式, Xauth认证方式
写了一个 WeiboUtil.java 操作类,用 OAuth2.0隐式授权认证方式 来验证,很简单,依葫芦画瓢嘛
// consumer_key, consumer_secret, callback_url 自改
this.weibo.setupConsumerConfig(consumer_key, consumer_secret);
this.weibo.setRedirectUrl(callback_url);
weibo.authorize((Activity) this.context, new AuthDialogListener()); // 【备注1】
【备注1】:AuthDialogListener 继承 WeiboDialogListener 监听授权结果,包括 onComplete、 onError、onCancel、onWeiboException
显示一个授权窗口输入用户名密码
验证好了之后,其实他内部就已经帮你设置好了 AccessToken了,在 WeiBo 类为回收的时候,AccessToken 可以用来发微博等一系列操作
在有这样一段代码:
public void onComplete(Bundle values) {
String token = values.getString("access_token");
String expires_in = values.getString("expires_in");
AccessToken accessToken = new AccessToken(token, CONSUMER_SECRET);
Weibo.getInstance().setAccessToken(accessToken);
Intent intent = new Intent();
intent.setClass(AuthorizeActivity.this, TestActivity.class);// 进入TestActivity
startActivity(intent);
}
TestActivity.java 的 OnClick 中就是发表的处理了(只发表文字),代码中可以看到 ShareActivity (com_weibo_android) 就是处理的类啦
try {
Intent i = new Intent(TestActivity.this, ShareActivity.class);
TestActivity.this.startActivity(i);
} catch (WeiboException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
在 ShareActivity 中有一个 update 方法,这个就是发表文字和图片方法
private String update(Weibo weibo, String source, String status, String lon, String lat)
throws MalformedURLException, IOException, WeiboException {
WeiboParameters bundle = new WeiboParameters();
bundle.add("source", source);
bundle.add("status", status);
if (!TextUtils.isEmpty(lon)) {
bundle.add("lon", lon);
}
if (!TextUtils.isEmpty(lat)) {
bundle.add("lat", lat);
}
String rlt = "";
String url = Weibo.SERVER + "statuses/update.json";
AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo);
weiboRunner.request(this, url, bundle, Utility.HTTPMETHOD_POST, this);
return rlt;
}
/**
* 发表微博
* @param content 文字信息
*/
public void shareWeibo(String content) {
WeiboParameters bundle = new WeiboParameters();
bundle.add("source", Weibo.getAppKey());
bundle.add("status", content);
String url = Weibo.SERVER + "statuses/update.json";
AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo);
weiboRunner.request(this.context, url, bundle, Utility.HTTPMETHOD_POST, this);
}
基本上就ok了,我实现了发文字,不过还是有个问题。我想只登录,授权一次:
第一种方法:下面摘自Sina【备注2】
客户端的验证授权(Resource Owner Password Credentials)
1.调用
返回值 { "access_token":"SlAV32hkKG", "expires_in":3600 }
2. 使用获得的OAuth2.0 Access Token调用API
注:客户端的验证授权需要申请
【备注2】:不过无论怎么试,结果还是失败,不是Auth Fail,就是 400 Bad required,所以放弃
第二种方法:下面摘自Sina【备注3】
高级接口及特殊权限
(接口已接受线上申请)
- 1、OAuth认证时,要到授权网页获取授权码后才能获取AccessToken,请问是不是每次登录DIY客户端,都需要做这样一个认
- 证流程?
- 同一个的用户的话,可以直接存取对应的Accesstoken。直接调用接口即可。
【备注3】:亲手试了一下,用 SharePreferences,下面贴代码,在授期结果监听器中获取accessToken
class AuthDialogListener implements WeiboDialogListener {
public void onComplete(Bundle values) {
String token = values.getString(SF_TOKEN);
String expires_in = values.getString(EXPIRES_IN);
AccessToken accessToken = new AccessToken(token, consumer_secret);
accessToken.setExpiresIn(expires_in);
Weibo.getInstance().setAccessToken(accessToken);
// 保存OAuth授权
SharedPreferences preferences =
context.getSharedPreferences(WEIBO_OAUTH, 0);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(SF_TOKEN, token);
editor.putString(EXPIRES_IN, expires_in);
editor.commit();
// 通知授权成功
uihHandler.sendEmptyMessage(AUTHORIZE_FINISH);
}
public void onError(DialogError e) {
Toast.makeText(context, "网络连接错误 : " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
public void onCancel() {
Toast.makeText(context, "授权取消", Toast.LENGTH_LONG).show();
}
public void onWeiboException(WeiboException e) {
Toast.makeText(context,"出现异常 : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
登录的时候做了一下判断:(就是 SharePreferences 读写)
if(preferences.getString(SF_TOKEN, null) == null) {
this.weibo.setupConsumerConfig(this.consumer_key, this.consumer_secret);
this.weibo.setRedirectUrl(this.callback_url);
weibo.authorize((Activity) this.context, new AuthDialogListener());
} else {
this.weibo.setupConsumerConfig(this.consumer_key, this.consumer_secret);
this.weibo.setRedirectUrl(this.callback_url);
String token = preferences.getString(SF_TOKEN, null);
String expires_in = preferences.getString(EXPIRES_IN, null);
AccessToken accessToken = new AccessToken(token, consumer_secret);
accessToken.setExpiresIn(expires_in);
// 这一句很重要,因为会爆出WeiboException: auth faild! 21301 【备注4】
Utility.setAuthorization(new Oauth2AccessTokenHeader());
this.weibo.setAccessToken(accessToken);
Weibo.setSERVER("https://api.weibo.com/2/");
// 通知验证成功
uihHandler.sendEmptyMessage(AUTHORIZE_FINISH);
}
【备注4】:
这个很重要,之前一直都测试很多次,结果都是授权失败:Oauth Fail, 信息:WeiboException: auth faild! statuCode : 21301
写这篇文章多大意思,警示自己最后验证一次的问题,怎知道写的多了 .. -。-