本文档来自 安卓巴士(www.apkbus.com)整理总结
《手把手教你用Android开发新浪微博客户端》
作者:水的右边
作者博客:http://www.cnblogs.com/hll2008/
(注:本文档用于学习开发使用,勿作为任何商业活动使用,如作者有版权问题,请联系安
卓巴士网友:巴士小白)
本文档来自 安卓巴士(www.apkbus.com)整理总结
目录:
第一、 android 开发我的新浪微博客户端‐开篇
第二、 android 开发我的新浪微博客户端‐载入页面 UI篇(1.1)
第三、 android 开发我的新浪微博客户端-载入页面 sqlite 篇(1.2)
第四、 android 开发我的新浪微博客户端-OAuth 篇(2.1)
本文档来自 安卓巴士(www.apkbus.com)整理总结
第一、android 开发我的新浪微博客户端‐开篇
开始接触学习 android 已经有 3 个礼拜了,一直都是对着 android 的 sdk 文档写
Tutorials 从 Hello World 到 Notepad Tutorial 算是初步入门了吧,刚好最近对微博感兴趣就打
算开发个 android 版本的新浪微博客户端作为练手项目,并且以随笔的方式详细的记录开发
的全过程。本人对 java 语言以及 eclipse Ide都是初次应用基本上属于边学边用,做移动设备
上的东西也是第一次,总的来说属于无基础、无经验、无天赋的纯三无人员,还请广大同学
们多多给予指点。
开发第一件事情,那就是开发工具以及环境,我的配置是 Eclipse Helios (3.6.1) + Adroid2.2,
具体的环境搭建我就不罗嗦了,google一下一大堆,光博客园里都能搜到很多篇了。
开发第二件事情,既然是开发新浪的微博客户端,那就先去新浪
申请
关于撤销行政处分的申请关于工程延期监理费的申请报告关于减免管理费的申请关于减租申请书的范文关于解除警告处分的申请
微博账号然后登陆
最后在说一下,我准备分为 UI 和功能两部分分别进行说明讲解,据我自己的情况大部
最后还要在说一下,很抱歉上面内容基本上属于废话没有什么实质内容了但是既然是第
一篇
后到新浪的开放平台,新浪的开放平台提供的新浪微博对外的 api接口,在我的应用中创建
一个新的应用获取 App Key和 App Secret,这 2 个值后面会有用到先记录下来。在新浪的开
放平台中提供了开发文档、SDK、接口测试工具等,本人决定直接通过新浪的 Rest Api进行
开发并不打算使用新浪提供的 SDK,据说新浪提供的 java 版的 SDK 并不能直接用来进行
android 的开发需要进行一定的修改才能使用,只是听说我没有试过不一定准确。
分的时间都花在的 UI的设计和实现上了,编码倒反而工作量小多了,所以特别把 UI部分分
出来讲。
还是得象征性的交代一下,从下篇开始讲具体的内容。
第二
所以
两种
用 B
转向
简易
信息
源的
密码
个 a
发的
效的
序写
二、andro
本篇说
以有必要专门
种认证方式,
Base OAuth 认
向 OAuth认证
OAuth
易的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
。与
息(如用户名
的
授权
个人房产授权委托书公司各类授权委托书模版医师授权办法餐饮分店授权书产品代理授权书范本
,因此
码的安全,在
ndroid 客户端
的这个 androi
的保护了用户
写微博看微博
本文档来
oid 开发我
说说关于OAu
门来讲讲,前面
并且本项目
认证原因很简
证方式,而新
的基本概念
与以往的授权
名与密码),即
此 OAUTH是安
在这里通过 O
端程序)、新
id 客户端程序
户账号的安全
博目的。这个
来自 安卓巴士
我的新浪微
th授权认证
面的文章中已
采用 OAuth
简单,自从 Tw
新浪微博的开
,OAUTH 协
权方式不同之
即第三方无需
安全的。同样
Auth建立普
新浪微博三者
序)不需要知
全性不需要把
个是 OAuth 的
士(www.ap
微博客户端
的事情,新浪
已经提到过关
认证方式,
witter只支持
开放平台也将
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
为用户资源
处是 OAUTH
需使用用户的
样新浪微博提
普通新浪微博
者之间的相互
知道用户的账
账号密码透露
的作用。
pkbus.com)整
端‐载入页
浪开放 api都必
关于新浪微博
至于为什么采
持 OAuth 认证
在近日停止
源的授权提供
的授权不会
的用户名与密
提供 OAuth 认
用户、客户端
信任关系,让
账号和密码也
露给客户端程
整理总结
页面 UI 篇
(1.1)
必须在这个基基础上才能调调用,
博提供了 OAu
采用这个 OA
证方式以来,
Base OAuth
uth和 Base O
Auth 认证而不
各大应用都
的认证方式。
OAuth
不采
都纷纷
。
供了一个安全全的、开放而而又
会使第三方触
密码就可以申
认证也是为了
端程序(我们
让客户端程序
也能浏览、发
程序又达到了
触及到用户的
请获得该用
了保证用户账
们正在开发的
序(我们正在
发布微博,这
了通过客户端
帐号
户资
号和
的这
在开
这样有
端程
结合新浪微博的 OAuth 认证来说说具体的功能实现,首先罗列一下关键字组,下
面四
第一组:(App Key和 App Secret),这组参数就是本系列文本第一篇提到的建一个
新的
第二组:(Request Token 和 Request Secret)
第三组:(oauth_verifier)
第四组:(user_id、Access Token和 Access Secret)
新浪微博的 OAuth认证过程,当用户第一次使用本客户端软件时,客户端程序用
第一
本项目用为了方便开发采用了 oauth‐signpost 开源项目进行 OAuth 认证开发,新建
OAu
过程中用
uthConsumer httpOauthConsumer;
;
blic OAuth()
第一组:(App Key和 App Secret)
个新的应用获取 App Key和
3315495489","e2731e7grf592c0fd7fea32406f86e1b");
lic OAuth(String consumerKey,String consumerSecret)
组关键字跟我们接下来 OAuth认证有非常大的关系。
应用获取 App Key和 App Secret。
组作为参数向新浪微博发起请求,然后新浪微博经过验证后返回第二组参数给客户端软
件同时表示新浪微博信任本客户端软件,当客户端软件获取第二组参数时作为参数引导用户
浏览器跳至新浪微博的授权页面,然后用户在新浪的这个授权页面里输入自己的微博账号和
密码进行授权,完成授权后根据客户端设定的回调地址把第三组参数返回给客户端软件并表
示用户也信任本客户端软件,接下客户端软件把第二组参数和第三组参数作为参数再次向新
浪微博发起请求,然后新浪微博返回第四组参数给客户端软件,第四组参数需要好好的保存
起来这个就是用来代替用户的新浪账号和密码用的,在后面调用 api时都需要。从这个过程
来看用户只是在新浪微博的认证网页输入过账户和密码并没有在客户端软件里输入过账户
和密码,客户端软件只保存了第四组数据并没有保存用户的账户和密码,这样有效的避免了
账户和密码透露给新浪微博之外的第三方应用程序,保证 了安全性。
th.java 类文件对 OA进行简单的封装,OAuth类主要有 RequestAccessToken、
GetAccessToken、SignRequest 三个
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,第一个方法 RequestAccessToken就是上面
来获取第三组参数用的,GetAccessToken 方法是用来获取第四组参数用,SignRequest 方法是
用来调用 api用。由于采用了 oauth‐signpost 开源项目简单了很多。具体代码如下:
public class OAuth {
private CommonsHttpOA
private OAuthProvider httpOauthprovider;
public String consumerKey;
public String consumerSecret
pu
{
//
// 这组参数就是本系列文本第一篇提到的建一
App Secret。
this("
}
pub
{
this.consumerSecret=consumerSec
}
pu
ckUrl){
B
try{
ht
Key,consumerSecret);
httpOauthp
t.sina.com.cn/oauth/request_token","http://api.t.sina.com.cn/oauth/ac
cess_token","http://api.t.sina.com.cn/oauth/authorize");
String authUrl = httpOauthprovider.retrieveReq
ttpOauthConsumer, callBackUrl);
activity.startActivit
.parse(authUrl)));
ret=true
}catch(Exceptio
}
ret
}
pu
UserInfo user=null;
Uri uri = intent.getD
String verifier = uri.getQuer
OAUTH_VERIFIER);
try {
htt
httpOauthprovider.retrieveAccessToken(h
erifier);
} catch
ex.printStackTrace();
} catch (OAuthNotAuthorized
ex.printStackTrace();
} catch (OAuthExpectationFa
ex.printStackTrace();
} catch (OAuthCommunication
ex.printStackTrace();
}
Sor
eters().get("user_id");
String userId=use
this.consumerKey=consumerKey;
ret;
blic Boolean RequestAccessToken(Activity activity,String callBa
oolean ret=false;
tpOauthConsumer = new CommonsHttpOAuthConsumer(consumer
rovider = new DefaultOAuthProvider("http://api.
uestToken(h
y(new Intent(Intent.ACTION_VIEW, Uri
;
n e){
urn ret;
blic UserInfo GetAccessToken(Intent intent){
ata();
yParameter(oauth.signpost.OAuth.
pOauthprovider.setOAuth10a(true);
ttpOauthConsumer,v
(OAuthMessageSignerException ex) {
Exception ex) {
iledException ex) {
Exception ex) {
tedSet
user_id= httpOauthprovider.getResponseParam
r_id.first();
String userKey = httpOauthConsum
String userSecret = httpOauthConsumer.getTokenSe
user=new UserInfo();
user.setUserId(userId)
user.setToken(userKey);
user.setTokenSecret(userS
return user;
}
pu
tring url,List params)
{
//HttpClient httpClient = null;
try{
po
));
e.printStackTrace();
}
//关闭
//100-Continue握手需谨慎使用,因为
代理时会引起问题
post.ge
XPECT_CONTINUE, false);
return SignReques
}
pu
ttpPost post){
httpOaut
consumerSecret);
httpOauthC
HttpResponse response = null;
try {
htt
} catch (OAuthMessageSignerExceptio
e.printStackTrace();
} catch (OAuthExpectationF
e.printStackTrace();
} catch (OAuthCommunicatio
e.printStackTrace();
}
//取得
er.getToken();
cret();
;
ecret);
blic HttpResponse SignRequest(String token,String tokenSecret,S
HttpPost post = new HttpPost(url);
st.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8
} catch (UnsupportedEncodingException e) {
Expect:100-Continue握手
遇到不支持 HTTP/1.1协议的服务器或者
tParams().setBooleanParameter(CoreProtocolPNames.USE_E
t(token,tokenSecret,post);
blic HttpResponse SignRequest(String token,String tokenSecret,H
hConsumer = new CommonsHttpOAuthConsumer(consumerKey,
onsumer.setTokenWithSecret(token,tokenSecret);
pOauthConsumer.sign(post);
n e) {
ailedException e) {
nException e) {
HTTP response
try {
res
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
ret
}
}
ponse = new DefaultHttpClient().execute(post);
urn response;
这样就完成了 OAuth 功能类的开发,后面都会用到这个类相关的方法。本篇到这里就
算是
本文档来自 安卓巴士(www.apkbus.com
完结请继续关注后面的文章。
)整理总结
了载
么是
行详
的新
本项
sqlit
出来
始检
的记
授权
库中
值然
息。
第三、an
通过上
载入页面的 U
首先说
是 OAuth和 B
详细的说明以
新浪UserID、A
项目是这样做
te库中以便用
来即可,由于
检查 sqlite 库
记录,如果一条
权认证操作(
中,如果已经
然后根据这 3
本文档来
ndroid 开
上一篇文章(a
I部分的实现
说明一下新浪
Base OAuth 请
以及具体实现
Access Token、
做的当用户第
用户下次使用
这样的需求载
中是否已经保
条记录都没有
(认证授权功
经包括了记录
个值调用新
来自 安卓巴士
开发我的新
android 开发
现,效果如上图
浪微博提供了
请自己 google
现),本项目是
、Access Secre
第一次使用软
用时不需要重
载入页面的功
保存有用户的
有那就说明用
功能在接下来
录,那么读取
浪的 api接口
士(www.ap
新浪微博客
发我的新浪微
图,接下来在上
OAuth 和 Ba
e一下恶补,
是采用 OAuth
et这3样东西
件时进行授权
重新进行繁琐
功能设定是这
的新浪微博的
用户是第一次
的两篇中进行
这些记录的
口获取这些记
pkbus.com)整
客户端-载
博客户端‐载
上面的基础上
ase OAuth 两
同时接下来
h 认证方式,
西才能自由便
权认证获取这
琐的授权认证
这样:当用户
的 UserID 号、
次使用本软件
行实现讲解)
UserID 号、A
记录对应的用
整理总结
载入页面 sq
qlite 篇(1.2)
入页面 UI (1.1))已载 篇篇 经经完成
上完成载入页页面的功能代代码。
两种认证方式(如果不知道道什
来的 2 篇随笔
采用这种方
便利的调用新
这 3 样东西的
证操作直接从
户打开软件显
、Access Toke
件那么跳到认
)获取这 3 个
Access Token
用户昵称和用
笔也会对这方
方式就需要有
新浪的开放接
的时候存储到
从 sqlite 库中读
显示载入页面
en、Access S
认证授权页面
个值保存到 s
n、Access Sec
用户头像图标
方面进
用户
接口,
到
读取
面时开
ecret
面进行
sqlite
cret
标等信
上面功能设定中涉及到 sqlite 数据库的创建、数据表的创建、数据记录的添加、数
据记
SqliteHelper extends SQLiteOpenHelper{
录的读取等操作,这里新建名为 SqliteHelper.java 类文件提供 sqlite 数据表的创建、更新
等,代码如下:
public class
//用来保存
UserID、Access Token、Access Secret
static final String TB_NAME="users";
ame, CursorFactory f
ame, factory, version);
onCreate(SQLiteDatabase db) {
"+
integer primary key,"+
r,"+
ase","onCreate");
onUpgrade(SQLiteDatabase db, int oldVersion, int newV
execSQL("DROP TABLE IF EXISTS " + TB_NAME);
","onUpgrade");
id updateColumn(SQLiteDatabase db, String oldColumn, Str
.execSQL("ALTER TABLE " +
+
mn +
的表名
public
public SqliteHelper(Context context, String n
actory, int version) {
super(context, n
}
//创建表
@Override
public void
db.execSQL("CREATE TABLE IF NOT EXISTS
TB_NAME+"("+
UserInfo.ID+"
UserInfo.USERID+" varchar,"+
UserInfo.TOKEN+" varchar,"+
UserInfo.TOKENSECRET+" varcha
UserInfo.USERNAME+" varchar,"+
UserInfo.USERICON+" blob"+
")"
);
Log.e("Datab
}
//更新表
@Override
public void
ersion) {
db.
onCreate(db);
Log.e("Database
}
//更新列
public vo
ing newColumn, String typeColumn){
try{
db
TB_NAME + " CHANGE "
oldColumn + " "+ newColu
" " + typeColumn
);
}catch(E
e.printStackTrace(
}
}
}
xception e){
);
接下来新建名为 DataHelper.java 类文件实现用户记录的创建、更新、删除等,代码
如下
lic class DataHelper {
ic String DB_NAME = "mysinaweibo.db";
ic int DB_VERSION = 2;
r;
blic DataHelper(Context context){
,DB_NAME, null, DB_VERSION);
blic void Close()
db.close();
e();
users表中的 UserID、Access Token、Access Secret的记录
List userList = new ArrayList();
l, null
st()&& (cursor.getString(1)!=null)){
;
);
3));
(cursor.getString(4));
rayInputStream(cu
icon= Drawable.createFromStream(stream, "image");
:
pub
//数据库名称
private stat
//数据库版本
private stat
private SQLiteDatabase db;
private SqliteHelper dbHelpe
pu
dbHelper=new SqliteHelper(context
db= dbHelper.getWritableDatabase();
}
pu
{
dbHelper.clos
}
//获取
public List GetUserList(Boolean isSimple)
{
Cursor cursor=db.query(SqliteHelper.TB_NAME, null, nul
, null, null, UserInfo.ID+" DESC");
cursor.moveToFirst();
while(!cursor.isAfterLa
UserInfo user=new UserInfo();
user.setId(cursor.getString(0))
user.setUserId(cursor.getString(1)
user.setToken(cursor.getString(2));
user.setTokenSecret(cursor.getString(
if(!isSimple){
user.setUserName
ByteArrayInputStream stream = new ByteAr
rsor.getBlob(5));
Drawable
user.setUserIcon(icon);
}
use
cursor.moveToNext();
}
cur
return userList;
}
//
public Boolean HaveUserInfo(String UserI
{
Cursor cursor=db.q
SERID + "=" + UserId, null, null, null,null);
b=cursor.moveToFirst();
Log.e("HaveUserInfo",b.to
cursor.close();
return b;
}
//
public int UpdateUserInfo(String userName,Bitmap u
UserId)
{
values.put(UserInfo.USERNAME, userName);
// BLOB类型
final ByteArray
userIcon.compress(Bitmap.CompressFormat.PNG, 100,
// 构造 SQLite的 Content对象,这里也可以使用 raw
values.put(UserInfo.USERICON, os.toByteArray())
int id= db.update(SqliteHelper.TB_NAME, values, Us
ID + "=" + UserId, null);
Log.e("UpdateUserIn
return id;
}
//
public int UpdateUse
{
rList.add(user);
sor.close();
判断 users表中的是否包含某个 UserID的记录
d)
Boolean b=false;
uery(SqliteHelper.TB_NAME, null, UserInfo.U
String());
更新 users表的记录,根据 UserId更新用户昵称和用户图标
serIcon,String
ContentValues values = new ContentValues();
OutputStream os = new ByteArrayOutputStream();
// 将 Bitmap压缩成 PNG编码,质量为 100%存储
os);
;
erInfo.USER
fo2",id+"");
更新 users表的记录
rInfo(UserInfo user)
ContentValues values = new ContentValues();
values.put(UserInfo.USERID, user.getUserId())
values.put(UserInfo.TOKEN, user.getToken());
values.put(UserInfo.TOKENSECRET, user.getToken
int id= db.update(SqliteHelper.TB_NAME, values, UserInfo.U
ID + "=" + user.getUserId(), null);
Log.e("UpdateUserInfo",id+"")
return id;
}
//
public Long SaveUser
{
values.put(UserInfo.USERID, user.getUserId())
values.put(UserInfo.TOKEN, user.getToken());
values.put(UserInfo.TOKENSECRET, user.getToken
Long uid = db.insert(SqliteHelper.TB_NAME, UserInfo.ID, va
s);
return uid;
}
//
public int DelUserIn
int id= db.delete(SqliteHelper.TB_N
+UserId, null);
Log.e("De
return id;
}
}
;
Secret());
SER
;
添加 users表的记录
Info(UserInfo user)
ContentValues values = new ContentValues();
;
Secret());
lue
Log.e("SaveUserInfo",uid+"");
删除 users表的记录
fo(String UserId){
AME, UserInfo.USERID +"="
lUserInfo",id+"");
完成上面的代码后,我们需要在载入页面中调用上面的方法实现 sqlite 库中是否已
经保
savedInstanceState) {
......
//获取账号列表
ataHelper(this);
r.GetUserList(true);
存有用户的新浪微博的 UserID号、Access Token、Access Secret 的记录的功能在
MainActivity的 onCreate方法添加代码:
public void onCreate(Bundle
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dbHelper=new D
List userList= dbHelpe
if(userList.isEmpty())//如果为空说明第一次使用跳到
AuthorizeActivity页面进行 OAuth认证
{
intent.setClass(MainActivity.th
lass);
}
els
值
头像图标等信息。
{
......
}
}
}
Intent intent = new Intent();
is, AuthorizeActivity.c
startActivity(intent);
e//如果不为空读取这些记录的 UserID号、Access Token、Access Secret
//然后根据这3个值调用新浪的 api接口获取这些记录对应的用户昵称和用户
for(UserInfo user:userList){
关于载入页面的 sqlite就说到这里了,下一篇说说 OAuth认证实现。
本文档来自 安卓巴士(www.apkbus.com
)整理总结
第四
以有
两种
用 B
转向
的标
(如
授权
码的
andr
这个
保护
微博
四、andro
本篇说说关
有必要专门来
种认证方式,
Base OAuth 认
向 OAuth 认证
OAuth 的基
标准。与以往的
如用户名与密
权,因此 OAU
的安全,在这
roid 客户端程
个 android 客户
护了用户账号
博看微博目的
结合新浪微
本文档来
oid 开发我
关于 OAuth 授
来讲讲,前面
并且本项目
认证原因很简
证方式,而新
基本概念,OA
的授权方式不
密码),即第三
UTH 是安全
这里通过 OAu
程序)、新浪微
户端程序)不
号的安全性不
的。这个是 O
微博的 OAuth
来自 安卓巴士
我的新浪微
授权认证的事
面的文章中已
采用 OAuth
简单,自从 Tw
新浪微博的开
AUTH 协议为
不同之处是 O
三方无需使用
全的。同样新
uth 建立普通
微博三者之间
不需要知道用
不需要把账号
OAuth 的作用
h 认证来说说
士(www.ap
微博客户
事情,新浪开放
经提到过关于
认证方式,
Twitter 只支持
开放平台也将
为用户资源的
OAUTH 的授
用用户的用户
浪微博提供
通新浪微博用
间的相互信任
用户的账号和
密码透露给客
用。
说具体的功能
pkbus.com)整
端-OAuth
放 api 都必须
于新浪微博提
至于为什么采
持 OAuth 认证
将在近日停止
的授权提供了
授权不会使第
户名与密码就
OAuth 认证
户、客户端程
任关系,让客
和密码也能浏
客户端程序又
能实现,首先
整理总结
h 篇(2.1)
须在这个基础础上才能调用用,所
提供了 OAut
采用这个 OA
证方式以来,
Base OAuth
th 和 Base OA
Auth 认证而不
各大应用都
h 的认证方式
Auth
不采
都纷纷
式。
了一个安全的
第三方触及到
就可以申请获
也是为了保证
程序(我们正
客户端程序(
浏览、发布微
又达到了通过
罗列一下关键
的、开放而又简易
到用户的帐号
获得该用户资
证用户账号和
正在开发的这
(我们正在开
微博,这样有
过客户端程序
信息
源的
和密
这个
发的
有效的
序写
键字组,下面面四
组关键字跟我们接下来 OAuth 认证有非常大的关系。
第一组:(App Key 和 App Secret),这组参数就是本系列文本第一篇提到的建一个新的
第二组:(Request Token 和 Request Secret)
第三组:(oauth_verifier)
第四组:(user_id、Access Token 和 Access Secret)
新浪微博的 OAuth 认证过程,当用户第一次使用本客户端软件时,客户端程序用第一
本项目用为了方便开发采用了 oauth-signpost 开源项目进行 OAuth 认证开发,新建
过程中
AuthConsumer httpOauthConsumer;
;
blic OAuth()
第一组:(App Key和 App Secret)
个新的应用获取 App Key和
3315495489","e2731e7grf592c0fd7fea32406f86e1b");
lic OAuth(String consumerKey,String consumerSecret)
this.consumerKey=consumerKey;
应用获取 App Key 和 App Secret。
组作为参数向新浪微博发起请求,然后新浪微博经过验证后返回第二组参数给客户端软件同
时表示新浪微博信任本客户端软件,当客户端软件获取第二组参数时作为参数引导用户浏览
器跳至新浪微博的授权页面,然后用户在新浪的这个授权页面里输入自己的微博账号和密码
进行授权,完成授权后根据客户端设定的回调地址把第三组参数返回给客户端软件并表示用
户也信任本客户端软件,接下客户端软件把第二组参数和第三组参数作为参数再次向新浪微
博发起请求,然后新浪微博返回第四组参数给客户端软件,第四组参数需要好好的保存起来
这个就是用来代替用户的新浪账号和密码用的,在后面调用 api 时都需要。从这个过程来看
用户只是在新浪微博的认证网页输入过账户和密码并没有在客户端软件里输入过账户和密
码,客户端软件只保存了第四组数据并没有保存用户的账户和密码,这样有效的避免了账户
和密码透露给新浪微博之外的第三方应用程序,保证 了安全性。
OAuth.java 类文件对 OA 进行简单的封装,OAuth 类主要有 RequestAccessToken、
GetAccessToken、SignRequest 三个方法,第一个方法 RequestAccessToken 就是上面
用来获取第三组参数用的,GetAccessToken 方法是用来获取第四组参数用,SignRequest 方
法是用来调用 api 用。由于采用了 oauth-signpost 开源项目简单了很多。具体代码如下:
public class OAuth {
private CommonsHttpO
private OAuthProvider httpOauthprovider;
public String consumerKey;
public String consumerSecret
pu
{
//
// 这组参数就是本系列文本第一篇提到的建一
App Secret。
this("
}
pub
{
this.consumerSecret=consumerSec
}
pu
ckUrl){
B
try{
ht
Key,consumerSecret);
httpOauthp
t.sina.com.cn/oauth/request_token","http://api.t.sina.com.cn/oauth/ac
cess_token","http://api.t.sina.com.cn/oauth/authorize");
String authUrl = httpOauthprovider.retrieveReq
ttpOauthConsumer, callBackUrl);
activity.startActivit
.parse(authUrl)));
ret=true
}catch(Exceptio
}
ret
}
pu
UserInfo user=null;
Uri uri = intent.getD
String verifier = uri.getQuer
OAUTH_VERIFIER);
try {
htt
httpOauthprovider.retrieveAccessToken(h
erifier);
} catch
ex.printStackTrace();
} catch (OAuthNotAuthorized
ex.printStackTrace();
} catch (OAuthExpectationFa
ex.printStackTrace();
} catch (OAuthCommunication
ex.printStackTrace();
}
Sor
eters().get("user_id");
String userId=use
String userKey = httpOauthConsum
ret;
blic Boolean RequestAccessToken(Activity activity,String callBa
oolean ret=false;
tpOauthConsumer = new CommonsHttpOAuthConsumer(consumer
rovider = new DefaultOAuthProvider("http://api.
uestToken(h
y(new Intent(Intent.ACTION_VIEW, Uri
;
n e){
urn ret;
blic UserInfo GetAccessToken(Intent intent){
ata();
yParameter(oauth.signpost.OAuth.
pOauthprovider.setOAuth10a(true);
ttpOauthConsumer,v
(OAuthMessageSignerException ex) {
Exception ex) {
iledException ex) {
Exception ex) {
tedSet user_id= httpOauthprovider.getResponseParam
r_id.first();
er.getToken();
String userSecret = httpOauthConsumer.getTokenSe
user=new UserInfo();
user.setUserId(userId)
user.setToken(userKey);
user.setTokenSecret(userS
return user;
}
pu
tring url,List params)
{
//HttpClient httpClient = null;
try{
po
));
e.printStackTrace();
}
//关