新浪的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时加上注释啊