腾讯微博平台开发,熟悉API结构,获得头像本地保存


高手们勿喷,写此教程,只是因为在自己初涉腾讯微博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,其下有多个子类,最常用的有:StatusesAPITAPIUserAPIFriendsAPIPrivateAPI等。

获得用户的头像,从UserAPI中的相关方法获取。

扫描二维码关注公众号,回复: 2230062 查看本文章

大致流程如下:

第一步,先获得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"/>




猜你喜欢

转载自blog.csdn.net/boybeak/article/details/8138356