/*
* Copyright (C) 2010-2013 The SINA WEIBO Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sina.weibo.sdk.openapi;
import android.content.Context;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.util.SparseArray;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.net.WeiboParameters;
/**
* 该类封装了微博接口。
* 详情请参考<a href="http://t.cn/8F3e7SE">微博接口</a>
*
* @author SINA
* @since 2014-03-03
*/
public class StatusesAPI extends AbsOpenAPI {
/** 过滤类型ID,0:全部、1:原创、2:图片、3:视频、4:音乐 */
public static final int FEATURE_ALL = 0;
public static final int FEATURE_ORIGINAL = 1;
public static final int FEATURE_PICTURE = 2;
public static final int FEATURE_VIDEO = 3;
public static final int FEATURE_MUSICE = 4;
/** 作者筛选类型,0:全部、1:我关注的人、2:陌生人 */
public static final int AUTHOR_FILTER_ALL = 0;
public static final int AUTHOR_FILTER_ATTENTIONS = 1;
public static final int AUTHOR_FILTER_STRANGER = 2;
/** 来源筛选类型,0:全部、1:来自微博的评论、2:来自微群的评论 */
public static final int SRC_FILTER_ALL = 0;
public static final int SRC_FILTER_WEIBO = 1;
public static final int SRC_FILTER_WEIQUN = 2;
/** 原创筛选类型,0:全部微博、1:原创的微博。 */
public static final int TYPE_FILTER_ALL = 0;
public static final int TYPE_FILTER_ORIGAL = 1;
/** API URL */
private static final String API_BASE_URL = API_SERVER + "/statuses";
/**
* API 类型。
* 命名规则:
* <li>读取接口:READ_API_XXX
* <li>写入接口:WRITE_API_XXX
* 请注意:该类中的接口仅做为演示使用,并没有包含所有关于微博的接口,第三方开发者可以
* 根据需要来填充该类,可参考legacy包下 {@link com.sina.weibo.sdk.openapi.legacy.StatusesAPI}
*/
private static final int READ_API_FRIENDS_TIMELINE = 0;
private static final int READ_API_MENTIONS = 1;
private static final int WRITE_API_UPDATE = 2;
private static final int WRITE_API_REPOST = 3;
private static final int WRITE_API_UPLOAD = 4;
private static final int WRITE_API_UPLOAD_URL_TEXT = 5;
private static final SparseArray<String> sAPIList = new SparseArray<String>();
static {
sAPIList.put(READ_API_FRIENDS_TIMELINE, API_BASE_URL + "/friends_timeline.json");
sAPIList.put(READ_API_MENTIONS, API_BASE_URL + "/mentions.json");
sAPIList.put(WRITE_API_REPOST, API_BASE_URL + "/repost.json");
sAPIList.put(WRITE_API_UPDATE, API_BASE_URL + "/update.json");
sAPIList.put(WRITE_API_UPLOAD, API_BASE_URL + "/upload.json");
sAPIList.put(WRITE_API_UPLOAD_URL_TEXT, API_BASE_URL + "/upload_url_text.json");
}
/**
* 构造函数,使用各个 API 接口提供的服务前必须先获取 Token。
*
* @param accesssToken 访问令牌
*/
public StatusesAPI(Context context, String appKey, Oauth2AccessToken accessToken) {
super(context, appKey, accessToken);
}
/**
* 获取当前登录用户及其所关注用户的最新微博。
*
* @param since_id 若指定此参数,则返回ID比since_id大的微博(即比since_id时间晚的微博),默认为0
* @param max_id 若指定此参数,则返回ID小于或等于max_id的微博,默认为0。
* @param count 单页返回的记录条数,默认为50。
* @param page 返回结果的页码,默认为1。
* @param base_app 是否只获取当前应用的数据。false为否(所有数据),true为是(仅当前应用),默认为false。
* @param featureType 过滤类型ID,0:全部、1:原创、2:图片、3:视频、4:音乐,默认为0。
* <li>{@link #FEATURE_ALL}
* <li>{@link #FEATURE_ORIGINAL}
* <li>{@link #FEATURE_PICTURE}
* <li>{@link #FEATURE_VIDEO}
* <li>{@link #FEATURE_MUSICE}
* @param trim_user 返回值中user字段开关,false:返回完整user字段、true:user字段仅返回user_id,默认为false。
* @param listener 异步请求回调接口
*/
public void friendsTimeline(long since_id, long max_id, int count, int page, boolean base_app,
int featureType, boolean trim_user, RequestListener listener) {
WeiboParameters params =
buildTimeLineParamsBase(since_id, max_id, count, page, base_app, trim_user, featureType);
requestAsync(sAPIList.get(READ_API_FRIENDS_TIMELINE), params, HTTPMETHOD_GET, listener);
}
/**
* 获取最新的提到登录用户的微博列表,即@我的微博。
*
* @param since_id 若指定此参数,则返回ID比since_id大的微博(即比since_id时间晚的微博),默认为0。
* @param max_id 若指定此参数,则返回ID小于或等于max_id的微博,默认为0。
* @param count 单页返回的记录条数,默认为50。
* @param page 返回结果的页码,默认为1。
* @param authorType 作者筛选类型,0:全部、1:我关注的人、2:陌生人 ,默认为0。可为以下几种 :
* <li>{@link #AUTHOR_FILTER_ALL}
* <li>{@link #AUTHOR_FILTER_ATTENTIONS}
* <li>{@link #AUTHOR_FILTER_STRANGER}
* @param sourceType 来源筛选类型,0:全部、1:来自微博的评论、2:来自微群的评论,默认为0。可为以下几种 :
* <li>{@link #SRC_FILTER_ALL}
* <li>{@link #SRC_FILTER_WEIBO}
* <li>{@link #SRC_FILTER_WEIQUN}
* @param filterType 原创筛选类型,0:全部微博、1:原创的微博,默认为0。 可为以下几种 :
* <li>{@link #TYPE_FILTER_ALL}
* <li>{@link #TYPE_FILTER_ORIGAL}
* @param trim_user 返回值中user字段开关,false:返回完整user字段、true:user字段仅返回user_id,默认为false
* @param listener 异步请求回调接口
*/
public void mentions(long since_id, long max_id, int count, int page, int authorType, int sourceType,
int filterType, boolean trim_user, RequestListener listener) {
WeiboParameters params = buildMentionsParams(since_id, max_id, count, page, authorType, sourceType, filterType, trim_user);
requestAsync(sAPIList.get(READ_API_MENTIONS), params, HTTPMETHOD_GET, listener);
}
/**
* 发布一条新微博(连续两次发布的微博不可以重复)。
*
* @param content 要发布的微博文本内容,内容不超过140个汉字。
* @param lat 纬度,有效范围:-90.0到+90.0,+表示北纬,默认为0.0。
* @param lon 经度,有效范围:-180.0到+180.0,+表示东经,默认为0.0。
* @param listener 异步请求回调接口
*/
public void update(String content, String lat, String lon, RequestListener listener) {
WeiboParameters params = buildUpdateParams(content, lat, lon);
requestAsync(sAPIList.get(WRITE_API_UPDATE), params, HTTPMETHOD_POST, listener);
}
/**
* 上传图片并发布一条新微博。
*
* @param content 要发布的微博文本内容,内容不超过140个汉字
* @param bitmap 要上传的图片,仅支持JPEG、GIF、PNG格式,图片大小小于5M
* @param lat 纬度,有效范围:-90.0到+90.0,+表示北纬,默认为0.0。
* @param lon 经度,有效范围:-180.0到+180.0,+表示东经,默认为0.0。
* @param listener 异步请求回调接口
*/
public void upload(String content, Bitmap bitmap, String lat, String lon, RequestListener listener) {
WeiboParameters params = buildUpdateParams(content, lat, lon);
params.put("pic", bitmap);
requestAsync(sAPIList.get(WRITE_API_UPLOAD), params, HTTPMETHOD_POST, listener);
}
/**
* 指定一个图片URL地址抓取后上传并同时发布一条新微博,此方法会处理URLencod。
*
* @param status 要发布的微博文本内容,内容不超过140个汉字。
* @param imageUrl 图片的URL地址,必须以http开头。
* @param pic_id 已经上传的图片pid,多个时使用英文半角逗号符分隔,最多不超过九张。
* imageUrl 和 pic_id必选一个,两个参数都存在时,取picid参数的值为准。
* <b>注:目前该参数不可用,现在还只能通过BD合作接入,不对个人申请</b>
* @param lat 纬度,有效范围:-90.0到+90.0,+表示北纬,默认为0.0。
* @param lon 经度,有效范围:-180.0到+180.0,+表示东经,默认为0.0。
* @param listener 异步请求回调接口
*/
public void uploadUrlText(String status, String imageUrl, String pic_id, String lat, String lon,
RequestListener listener) {
WeiboParameters params = buildUpdateParams(status, lat, lon);
params.put("url", imageUrl);
params.put("pic_id", pic_id);
requestAsync(sAPIList.get(WRITE_API_UPLOAD_URL_TEXT), params, HTTPMETHOD_POST, listener);
}
/**
* @see #friendsTimeline(long, long, int, int, boolean, int, boolean, RequestListener)
*/
public String friendsTimelineSync(long since_id, long max_id, int count, int page, boolean base_app, int featureType,
boolean trim_user) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page, base_app,
trim_user, featureType);
return requestSync(sAPIList.get(READ_API_FRIENDS_TIMELINE), params, HTTPMETHOD_GET);
}
/**
* -----------------------------------------------------------------------
* 请注意:以下方法匀均同步方法。如果开发者有自己的异步请求机制,请使用该函数。
* -----------------------------------------------------------------------
*/
/**
* @see #mentions(long, long, int, int, int, int, int, boolean, RequestListener)
*/
public String mentionsSync(long since_id, long max_id, int count, int page,
int authorType, int sourceType, int filterType, boolean trim_user) {
WeiboParameters params = buildMentionsParams(since_id, max_id, count, page, authorType, sourceType, filterType, trim_user);
return requestSync(sAPIList.get(READ_API_MENTIONS), params, HTTPMETHOD_GET);
}
/**
* @see #update(String, String, String, RequestListener)
*/
public String updateSync(String content, String lat, String lon) {
WeiboParameters params = buildUpdateParams(content, lat, lon);
return requestSync(sAPIList.get(WRITE_API_UPDATE), params, HTTPMETHOD_POST);
}
/**
* @see #upload(String, Bitmap, String, String, RequestListener)
*/
public String uploadSync(String content, Bitmap bitmap, String lat, String lon) {
WeiboParameters params = buildUpdateParams(content, lat, lon);
params.put("pic", bitmap);
return requestSync(sAPIList.get(WRITE_API_UPLOAD), params, HTTPMETHOD_POST);
}
/**
* @see #uploadUrlText(String, String, String, String, String, RequestListener)
*/
public String uploadUrlTextSync(String status, String imageUrl, String pic_id, String lat, String lon) {
WeiboParameters params = buildUpdateParams(status, lat, lon);
params.put("url", imageUrl);
params.put("pic_id", pic_id);
return requestSync(sAPIList.get(WRITE_API_UPLOAD_URL_TEXT), params, HTTPMETHOD_POST);
}
// 组装TimeLines的参数
private WeiboParameters buildTimeLineParamsBase(long since_id, long max_id, int count, int page,
boolean base_app, boolean trim_user, int featureType) {
WeiboParameters params = new WeiboParameters(mAppKey);
params.put("since_id", since_id);
params.put("max_id", max_id);
params.put("count", count);
params.put("page", page);
params.put("base_app", base_app ? 1 : 0);
params.put("trim_user", trim_user ? 1 : 0);
params.put("feature", featureType);
return params;
}
// 组装微博请求参数
private WeiboParameters buildUpdateParams(String content, String lat, String lon) {
WeiboParameters params = new WeiboParameters(mAppKey);
params.put("status", content);
if (!TextUtils.isEmpty(lon)) {
params.put("long", lon);
}
if (!TextUtils.isEmpty(lat)) {
params.put("lat", lat);
}
return params;
}
private WeiboParameters buildMentionsParams(long since_id, long max_id, int count, int page,
int authorType, int sourceType, int filterType, boolean trim_user) {
WeiboParameters params = new WeiboParameters(mAppKey);
params.put("since_id", since_id);
params.put("max_id", max_id);
params.put("count", count);
params.put("page", page);
params.put("filter_by_author", authorType);
params.put("filter_by_source", sourceType);
params.put("filter_by_type", filterType);
params.put("trim_user", trim_user ? 1 : 0);
return params;
}
}