对于入手开发基于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】
基本流程
1.调用
返回值 { "access_token":"SlAV32hkKG", "expires_in":3600 }
2. 使用获得的OAuth2.0 Access Token调用API
注:客户端的验证授权需要申请
【备注2】:不过无论怎么试,结果还是失败,不是Auth Fail,就是 400 Bad required,所以放弃
第二种方法:下面摘自Sina【备注3】
(接口已接受线上申请)
【备注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
写这篇文章多大意思,警示自己最后验证一次的问题,怎知道写的多了 .. -。-