新浪的SDK把网络操作全封装好了,网上也能搜到很多的教程。自己主要的工作就是:设计个好的UI(现在好像大多用TabView和ListView的方式)、用异步线程的方式处理网络请求,当然就会涉及到与主UI线程通信的handler了,还有就是理解OAuth认证,这个SDK里也有例子。
1 为啥都使用OAuth认证呢?
不管是新浪,还是腾讯、天涯等等,开发平台都在使用OAuth认证,之前新浪还支持HTTP普通鉴权(Basic Authentication)方式(http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E)现在已经不支持啦。为什么呢?为了不让第三方应用获得用户的明文密码,登入是在新浪的授权页上,用户输入用户名和密码授权,之后返回AccessTocken,以后应用程序就使用这个来请求。
2 新浪微博SDK
每家开放应用平台(新浪、腾讯、天涯)都开发了相应的SDK,新浪的下载地址为(http://open.weibo.com/wiki/index.php/SDK),有很多版本的,甚至有Android版的,其实只要有Java版的就可以了。SDK封装了网络操作和基本的微博操作,还给力个例子。先看看这个给的例子再干什么。
看看代码的:
AndroidExample.java中,首先要去Weibo.java中把CONSUMER_KEY和CONSUMER_SECRET的值用自己注册的值填好,然后通过OAuthConstant得到Weibo的实例,这里采用了单例的设计模式,然后又通过这个weibo实例得到RequestToken的实例并设置了callback_url("weibo4android://OAuthActivity"),然后就是发了个Intent还启动转到了这个页面上
public class AndroidExample extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//在此之前要去Weibo.java中把CONSUMER_KEY和CONSUMER_SECRET的值用自己注册的值填好
System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY);
System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET);
Button beginOuathBtn= (Button) findViewById(R.id.Button01);
beginOuathBtn.setOnClickListener(new Button.OnClickListener()
{
public void onClick( View v )
{
//通过OAuthConstant得到Weibo的实例,这里采用了单例的设计模式
Weibo weibo = OAuthConstant.getInstance().getWeibo();
RequestToken requestToken;
try {
//通过这个weibo实例得到RequestToken的实例并设置了callback_url("weibo4android://OAuthActivity")
requestToken =weibo.getOAuthRequestToken("weibo4android://OAuthActivity");
System.out.println("requestToken:"+requestToken);
Uri uri = Uri.parse(requestToken.getAuthenticationURL()+ "&from=xweibo");
System.out.println("uri:"+uri);
//设置单例中的RequestToken
OAuthConstant.getInstance().setRequestToken(requestToken);
//发了个Intent还启动转到了这个页面上
startActivity(new Intent(Intent.ACTION_VIEW, uri));
} catch (WeiboException e) {
e.printStackTrace();
}
}
} );
}
}
callback_url在那设定的呢?在manifest文件中,Activity OAuthActivity的标签下的scheme和host属性
<activity android:name=".OAuthActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="weibo4android" android:host="OAuthActivity" />
</intent-filter>
</activity>
当页面跳转回来后,从Intent中得到AccessToken的key和Secret,就可以使用这两个参数进行授权登录了,然后在调用微博实例时设置好AccessToken,就可以使用Weibo类的函数了,例子是给了某一话题下的微博,我改成的卡扎菲,此时正好他下台。Status类就是微博的数据的类,要得到微博的信息就用它了。
public class OAuthActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timeline);
//从返回的Intent中得到数据
Uri uri=this.getIntent().getData();
System.out.println("this.getIntent().getData()---->"+uri);
try {
RequestToken requestToken= OAuthConstant.getInstance().getRequestToken();
//得到AccessToken
AccessToken accessToken=requestToken.getAccessToken(uri.getQueryParameter("oauth_verifier"));
System.out.println("accessToken:"+accessToken);
//将AccessToken设给OAuthConstant
OAuthConstant.getInstance().setAccessToken(accessToken);
TextView textView = (TextView) findViewById(R.id.TextView01);
textView.setText("得到AccessToken的key和Secret,可以使用这两个参数进行授权登录了.\n Access token:\n"+accessToken.getToken()+"\n Access token secret:\n"+accessToken.getTokenSecret());
} catch (WeiboException e) {
e.printStackTrace();
}
Button button= (Button) findViewById(R.id.Button01);
button.setText("某一话题下的微博");
button.setOnClickListener(new Button.OnClickListener()
{
public void onClick( View v )
{
Weibo weibo=OAuthConstant.getInstance().getWeibo();
//设置好微博的AccessToken
weibo.setToken(OAuthConstant.getInstance().getToken(), OAuthConstant.getInstance().getTokenSecret());
List<Status> friendsTimeline;
try {
//得到某一话题下的微博,注意Status是微博的内容的类
friendsTimeline = weibo.getTrendStatus("卡扎菲", new Paging(1,20));
StringBuilder stringBuilder = new StringBuilder("1");
for (Status status : friendsTimeline) {
stringBuilder.append(status.getUser().getScreenName() + "说:"
+ status.getText() + "-------------------------\n\n");
}
TextView textView = (TextView) findViewById(R.id.TextView01);
textView.setText(stringBuilder.toString());
} catch (WeiboException e) {
e.printStackTrace();
}
}
} );
}
}
通过上面的例子可以看出,只要使用设置了RequestToken和AccessToken的微博实例就可以得到我们想要的内容了,而RequestToken是对应这我的应用的一组数据串,AccessToken是我的应用和用户的授权(通过用户名和密码)的一组数据串。既然这样把AccessToken的值存下来不就不用每次都登录了。
下面就自己通过得到的AccessToken直接登录试试。新建一个MytestActivity.java类
public class MytestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mytestlayout);
System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY);
System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET);
//新建一个RequestToken
RequestToken requestToken = new RequestToken("1364680900","f8f43ee3c2e6bb6e57d5354e0570237c");
//新建一个AccessToken
AccessToken accessToken = new AccessToken(
"32e03adb68945490be2ec246723f5bf5",
"d0b5c462e6e61fcfa43202a4354f8102");
//将RequestToken和AccessToken设到OAuthConstant单例中
OAuthConstant.getInstance().setRequestToken(requestToken);
OAuthConstant.getInstance().setAccessToken(accessToken);
Button button = (Button) findViewById(R.id.btnaddstatus);
button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
try {
TextView tv1 = (TextView)findViewById(R.id.tv1);
String str = new String();
// 得到具有授权的weibo实例
Weibo weibo = OAuthConstant.getInstance().getWeibo();
weibo.setToken(OAuthConstant.getInstance().getToken(),
OAuthConstant.getInstance().getTokenSecret());
//得到微博
List<Status> pubstat = weibo.getFriendsTimeline();
for(Iterator<Status> it=pubstat.iterator();it.hasNext();){
Status st = it.next();
//微博的所有数据
str+=st.toString();
//只显示谁说了什么
//str+=st.getUser().getName()+":"+st.getText();
str+="\n--------------------------\n";
}
tv1.setText(str);
} catch (WeiboException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
别忘了最后在manifest中修改为启动Activity.运行后看看,一对乱七八糟的东西.
将显示的改为只显示谁说了什么再看看:st.getUser().getName()+":"+st.getText();
嘿,清爽多了。再看看首页,对得起来
如此简单,就基本上可以看见自己的微博首页的内容啦,下步就是要美化UI,而且,要不能把网络操作放在主线程中等等等等了.......
3 status的内容
可以慢慢对照看看status里的成员变量都有啥,开始那些乱七八糟的东西就是它的ToString方法打印出的。
public class Status extends WeiboResponse implements java.io.Serializable {
private Date createdAt; //创建的日期
private long id; //微博的ID,应该是所有新浪微博的一个编号,很大
private String text; //正文
private String source; //从什么地方发出来的,如"新浪微博","iPhone客户端","Android客户端"
private boolean isTruncated;
private long inReplyToStatusId;
private long inReplyToUserId;
private boolean isFavorited; //是否被收藏
private String inReplyToScreenName;
private double latitude = -1; //纬度
private double longitude = -1; //经度
private String thumbnail_pic; //最小的那个图片
private String bmiddle_pic; //点击放大后的图片
private String original_pic; //点击放大后再点击"查看大图"的图片
private RetweetDetails retweetDetails;
private Status retweeted_status; //如是转发的微博,原文的信息,注意它也是个Status类
private String mid;
private static final long serialVersionUID = 1608000492860584608L;
private User user = null; //发微博的博主的信息,是个User类
再看看User这个类,从名字可以看出存的应该是博主的信息
public class User extends WeiboResponse implements java.io.Serializable {
static final String[] POSSIBLE_ROOT_NAMES = new String[]{"user", "sender", "recipient", "retweeting_user"};
private Weibo weibo;
private long id;
private String name; //名字
private String screenName; //显示的名字
private String location;
private String description; //个人描述
private String profileImageUrl; //头像地址
private String url; //博客地址
看看你添个人资料是有多少项就知道这个类有多复杂了,就知道主要的几条就行了,其它就"顾名思义"吧,新浪真应该发布sdk时加上注释啊