高手们勿喷,写此教程,只是因为在自己初涉腾讯微博API的时候,在理解上有很多问题,查资料也比较少,所以写这些,让后来的同学少走一些弯路。
我的新浪微博:http://weibo.com/boybeak?source=blog#1351772266183
我的腾讯微博:http://user.qzone.qq.com/915522070/infocenter#!app=216&via=QZ.HashRefresh
有兴趣的可以一起交流。
腾讯微博的API结构如下:
腾讯API可分为两个大部分,左边的是与OAUTH相关的API,右边是与微博相关的API。而与微博相关的API中,有一个基类是BasicAPI,其下有多个子类,最常用的有:StatusesAPI、TAPI、UserAPI、FriendsAPI、PrivateAPI等。
获得用户的头像,从UserAPI中的相关方法获取。
大致流程如下:
第一步,先获得UserAPI的实例化对象:
UserAPI userAPI=new UserAPI(OAuthConstants.OAUTH_VERSION_2_A);
其中,常量OAuthConstants.OAUTH_VERSION_2_A 实际上就是字符串”2.a”
第二步,用已经授权过的oAuth对象,获取用户信息:
response=userAPI.info(oAuth, "json");
response是事先声明的字符串对象,注意此时oAuth一定是已经经过授权的,字符串”json”指明了返回值的格式,由于json解析的高效与方便,所以这里用json格式,也可以用xml格式。
第三步,解析获得的response
获得的json格式的字符串,会包含以下信息,
{
errcode : 返回错误码,
msg : 错误信息,
ret : 返回值,0-成功,非0-失败,
data :
{
birth_day : 出生天,
birth_month : 出生月,
birth_year : 出生年,
city_code : 城市id,
comp :
{
begin_year : 开始年,
company_name : 公司名称,
department_name : 部门名称,
end_year : 结束年,
id : 公司id
},
country_code : 国家id,
edu : 教育信息
{
departmentid : 院系id,
id : 教育信息记录id,
level : 学历级别,
schoolid : 学校id,
year : 入学年
},
fansnum : 听众数,
favnum : 收藏数,
head : 头像url,
homecity_code : 家乡所在城市id,
homecountry_code : 家乡所在国家id,
homepage : 个人主页,
homeprovince_code : 家乡所在省id,
hometown_code : 家乡所在城镇id,
idolnum : 收听的人数,
industry_code : 行业id,
introduction : 个人介绍,
isent : 是否企业机构,
ismyblack : 是否在当前用户的黑名单中,0-不是,1-是,
ismyfans : 是否是当前用户的听众,0-不是,1-是,
ismyidol : 是否是当前用户的偶像,0-不是,1-是,
isrealname : 是否实名认证,0-未实名认证,1-已实名认证,
isvip : 是否认证用户,0-不是,1-是,
location : 所在地,
mutual_fans_num : 互听好友数,
name : 用户帐户名,
nick : 用户昵称,
openid : 用户唯一id,与name相对应,
province_code : 地区id,
regtime : 注册时间,
send_private_flag : 是否允许所有人给当前用户发私信,0-仅有偶像,1-名人+听众,2-所有人,
sex : 用户性别,1-男,2-女,0-未填写,
tag : 标签
{
id : 个人标签id,
name : 标签名
},
tweetinfo : 最近的一条原创微博信息
{
city_code : 城市码,
country_code : 国家码,
emotiontype : 心情类型,
emotionurl : 心情图片url,
from : 来源,
fromurl : 来源url,
geo : 地理位置信息,
id : 微博唯一id,
image : 图片url列表,
latitude : 纬度,
location : 发表者所在地,
longitude : 经度,
music : 音频信息
{
author : 演唱者,
url : 音频地址,
title : 音频名字,歌名
},
origtext : 原始内容,
province_code : 省份码,
self : 是否自已发的的微博,0-不是,1-是,
status : 微博状态,0-正常,1-系统删除,2-审核中,3-用户删除,4-根删除,
text : 微博内容,
timestamp : 服务器时间戳,不能用于翻页,
type : 微博类型,1-原创发表,2-转载,3-私信,4-回复,5-空回,6-提及,7-评论,
video : 视频信息
{
picurl : 缩略图,
player : 播放器地址,
realurl : 视频原地址,
shorturl : 视频的短url,
title : 视频标题
}
},
tweetnum : 发表的微博数,
verifyinfo : 认证信息,
exp : 经验值,
level : 微博等级
},
seqid : 序列号
}
我们要解析出head元素中的东西,我写了一个解析UserAPI返回值的类,UserAPIParser类,其中的解析方法getHeadURL如下,
public String getHeadUrl () throws JSONException {
return this.getData().getString(KEY_HEAD);
}
例如我得到我的头像返回值为:
http://app.qlogo.cn/mbloghead/6cdf2d85b2b8dd53cc4c
但是,其获得的返回值并不指向任何一个图片,实际上,这并不是一个完整的url地址。如果要访问图片,则必须在此返回值后加上一些代表图片尺寸的值:/40、/50或者/120
第四步,补充完全url,利用Http访问网络获取图片。
再写一个获取头像图片的方法,如下:
public final int HEAD_LARGE = 1,
HEAD_MIDDLE = 2,
HEAD_SMALL = 3;
public Bitmap getHeadBitmap (int size) throws JSONException, IOException {
Bitmap headMap = null;
String urlStr = this.getHeadUrl();
StringBuilder urlSb = new StringBuilder (urlStr);
URL url = null;
HttpURLConnection httpConnection = null;
switch (size) {
case HEAD_LARGE:
urlSb.append("/120");
break;
case HEAD_MIDDLE:
urlSb.append("/50");
break;
case HEAD_SMALL:
urlSb.append("/40");
break;
default:
urlSb.append("/120");
break;
}
url = new URL (urlSb.toString());
httpConnection = (HttpURLConnection)url.openConnection();
httpConnection.setDoInput(true);
httpConnection.connect();
InputStream is = httpConnection.getInputStream();
headMap = BitmapFactory.decodeStream(is);
is.close();
httpConnection.disconnect();
return headMap;
}
此时要注意的是,由于该方法是好时较长的网络操作,则最好在一个service中执行这个方法。尽管头像图片不大,但是耗时不会短。
第五步,如果需要的话,则保存其头像,提供两个方法
public static String getSDPath(){
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在
if (sdCardExist)
{
sdDir = Environment.getExternalStorageDirectory();//获取跟目录
}
return sdDir.toString();
}
/**
* 保存文件
* @param bm
* @param fileName
* @throws IOException
*/
public void saveFile(Bitmap bm, String fileName) throws IOException {
String path = getSDPath() +"/revoeye/";
File dirFile = new File(path);
if(!dirFile.exists()){
dirFile.mkdir();
Log.i("create?", "create");
}
File myCaptureFile = new File(path + fileName);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
}
经过以上步骤后,我们就可以在DDMS下看到头像图片文件
导出后的头像:
这就是我腾讯微博的头像。
最后总结,以上这些操作中,异常处理、权限管理,我没有提到,请阅读者自行处理。
提示:
需要在AndroidManifest中声明的权限有:网络操作(搭建环境的时候,应该已经声明了)、存储卡创建与删除文件权限、存储卡读取写入数据权限,另外,用到一个service时候,必须同样在AndroidManifest中声明。
权限声明如下:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>