现在的位置: 首页 > 综合 > 正文

Android新浪微博开发(一)OAnth认证及账户管理、sdk的使用

2013年08月06日 ⁄ 综合 ⁄ 共 7263字 ⁄ 字号 评论关闭

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

 

 

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.