[Android笔记] Sina API保存Oauth验证信息

感慨:

         对于入手开发基于Sina Weibo客户端的开发人员来说,最大感慨我想就是文档 + 代码 + API接口

         1、文档解释不全

         2、代码注释很少

         3、API 听说很多都遇到 API 封闭情况或者异常!(至少我没遇到)

         不过丝毫没有消灭开发者的热情,因为 --> 微博很火!


正文:

        基于 WeiBo API 开发一系列工作,流程:
        1、先到 Open Weibo 注册开发者帐号信息,获取 APP_KEY, APP_SECRET

        2、查看 Sina 提供的 API ,不过最好下 SDK 看,因为很快就能上手,如果有时间,要看一下他们的源代码 ^_^

        3、了解 Oauth、Basic OauthXauth .. 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;
}

下面是我 copy 改后代码:(精简后)
/**
 * 发表微博
 * @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.调用

https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=password&username=USER_NAME&password=PASSWORD

返回值 { "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


写这篇文章多大意思,警示自己最后验证一次的问题,怎知道写的多了 .. -。-

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值