Android新浪微博开发(1)官方样例的研究

  这段时间开始进行新浪微博的开发学习,一来是来瞅瞅传说中的OAuth2.0,二来锻炼下自己自学能力。本人水平有限,表达能力也是有限,为了能让我自己更好地对我自己写的东西见文知意,比较喜欢用一些直白的语言描述东西,所以文章中大白话会很多,适合小白学习。

  我是9月低开始的新浪微博开发学习的,当时新浪正在放弃V1的API接口,所以我就没有看V1,直接进行了V2的API接口的学习。

  首先,下载了Android SDK,看了源文件,各种空的包,代码中也看不到注释,倒是注释了很多大段的代码,有点小惊讶,传说中的新浪微博SDK就是这样的?!反正,刚刚开始的时候,各种不懂,现在开始明白一些原理和方法,现在就将这些东西讲一下。

 

  首先是OAuth认证授权。当初的时候,我一直是想像新浪微博官方客户端一样,自己设计登录界面,让用户进行登录。后来发现实现不了,因为没有提供这方面的API接口。其实,原因很简单,新浪不会让客户端接触到用户账号和密码。但是用户肯定是要登录的,所以,网页登录的形式就出现了。又因为不能让客户端保存用户的账号密码,而且又不能每一个操作都进行登录,所以,客户端需要有一个标识用户唯一身份的东西。这个东西,能够让服务器标识唯一的用户,从而实现服务器客户端之间的交互。

  在官方给的样例中,通过点击一个按钮,就会发现打开了一个网页,用户在这个网页中进行登录授权。这个网页与应用是没有任何关系的。用户登录授权成功之后,服务器就会返回给应用一个用户唯一标识。应用使用这个唯一标识就可以代表一个用户了。

 

  我们的应用能够跟新浪的服务器进行交互,其实现的方式,其实就是通过各种HTTP请求的方式来实现的。例如,为了实现发表一个微博的功能,我们需要访问一个指定的URL(https://api.weibo.com/2/statuses/update.json),通过一些参数的设置,我们就能达到服务器的要求,服务器就会对我们进行相应,并且返回一些信息给我们。这样就实现了所谓的交互。

 

  下面看一看官方给的样例,第一个Activity,界面是由一个按钮和一个文本框组成的,没什么好说的,就说一说java源文件的一些重点。第一个页面是用于授权的,所以重点肯定就是授权了。

 1 Weibo weibo = Weibo.getInstance();
 2 weibo.setupConsumerConfig(CONSUMER_KEY, CONSUMER_SECRET);
 3 
 4 // Oauth2.0
 5 // 隐式授权认证方式
 6 weibo.setRedirectUrl("------");// 此处回调页内容应该替换为与appkey对应的应用回调页
 7 // 对应的应用回调页可在开发者登陆新浪微博开发平台之后,
 8 // 进入我的应用--应用详情--应用信息--高级信息--授权设置--应用回调页进行设置和查看,
 9 // 应用回调页不可为空
10 
11 weibo.authorize(AuthorizeActivity.this, new AuthDialogListener());

  需要注意的是,我们要将CONSUMER_KEY和 CONSUMER_SECRET字段设置为我们的App Key和App Secret,weibo.setRedirectUrl("------")中的参数改为我们的授权回调页。

  这些代码就能够实现授权了,它会自动访问新浪的授权页面。授权的结果,会通过AuthDialogListener给我们。(注释是我自己加的,只复制了重要的代码)

 1 class AuthDialogListener implements WeiboDialogListener
 2 {
 3 
 4     /* 授权完成 */
 5     @Override
 6     public void onComplete(Bundle values)
 7     {
 8         /*
 9          * 我们需要保存values中的access_token和expires_in所对应的值
10          * 其实,access_token是有用的,expires_in目前还没有用处
11          */
12         String token = values.getString("access_token");
13         String expires_in = values.getString("expires_in");
14 
15         /* 设置Weibo */
16         AccessToken accessToken = new AccessToken(token, Weibo.getAppSecret());
17         accessToken.setExpiresIn(expires_in);/*这一句是可有可无的*/
18         Weibo.getInstance().setAccessToken(accessToken);
19     }
20 
21     /* 授权失败 */
22     @Override
23     public void onError(DialogError e)
24     {
25         Toast.makeText(getApplicationContext(), "Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
26     }
27 
28     /* 授权取消 */
29     @Override
30     public void onCancel()
31     {
32         Toast.makeText(getApplicationContext(), "Auth cancel", Toast.LENGTH_LONG).show();
33     }
34 
35     /* 异常 */
36     @Override
37     public void onWeiboException(WeiboException e)
38     {
39         Toast.makeText(getApplicationContext(), "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
40     }
41 }

  我们在onComplete方法中就可以获得access_token,这样,我们就可以访问新浪的API的接口了。

  下面,我们接着看第二个界面,界面依然那么单一,继续看java代码重点。

1 private void share2weibo(String content, String picPath) throws WeiboException
2 {
3     Weibo weibo = Weibo.getInstance();
4     weibo.share2weibo(this, weibo.getAccessToken().getToken(), weibo.getAccessToken().getSecret(), content, picPath);
5 }

  当用户点击按钮之后,经一系列的操作后,会使用share2weibo这个方法,我们发现这个方法实际是使用Weibo类的share2weibo方法。继续进去看一看。

1 Intent i = new Intent(activity, ShareActivity.class);
2 i.putExtra(ShareActivity.EXTRA_ACCESS_TOKEN, accessToken);
3 i.putExtra(ShareActivity.EXTRA_TOKEN_SECRET, tokenSecret);
4 i.putExtra(ShareActivity.EXTRA_WEIBO_CONTENT, content);
5 i.putExtra(ShareActivity.EXTRA_PIC_URI, picPath);
6 activity.startActivity(i);

  在这里,我们就会发现,实际上是通过Intent调用了ShareActivity,这样我们就看到了发表微博的界面了。当我们写了内容之后,点击发表就能够发表一个微博了。

  在这里,有一些东西要说一下:

  1. TestActivity的按钮单击事件中,通过share2weibo方法,开启了ShareActivity,之后通过Intent开启了ShareActivity,但是我们只看到一个ShareActivity,而且点击关闭之后,的确是没有ShareActivity的。原因是在AndroidManifest.xml中对ShareActivity进行了设置:android:launchMode="singleTask"。
  2. weibo.share2weibo的各个参数的意义:第一个主要是起上下文的作用,第二个是access_token,第三个是AppSecret,第四个是微博内容,第五个是微博中的图片位置。之所以第二个参数和第三个参数会使用weibo.getAccessToken().get的方式进行获取,是因为我们在AuthorizeActivity中使用AccessToken accessToken = new AccessToken(token, CONSUMER_SECRET)并使用这个accessToken对weibo进行了设置。

  到现在一个发表到微博的功能的雏形就展现出来了,思路就是通过一个按钮,打开授权页面(AuthorizeActivity中的单击事件),授权成功之后,通过weibo.share2weibo直接跳转到ShareActivity即可。

 1 package my.android.share2sina;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.view.View.OnClickListener;
 7 import android.widget.Button;
 8 import android.widget.Toast;
 9 
10 import com.weibo.net.AccessToken;
11 import com.weibo.net.DialogError;
12 import com.weibo.net.Weibo;
13 import com.weibo.net.WeiboDialogListener;
14 import com.weibo.net.WeiboException;
15 
16 public class MainActivity extends Activity
17 {
18     private Button button;
19 
20     @Override
21     public void onCreate(Bundle savedInstanceState)
22     {
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.activity_main);
25         
26         button = (Button) findViewById(R.id.but);
27         button.setOnClickListener(new OnClickListener()
28         {
29             @Override
30             public void onClick(View v)
31             {
32                 Weibo weibo = Weibo.getInstance();
33                 weibo.setupConsumerConfig(Weibo.getAppKey(), Weibo.getAppSecret());
34                 weibo.authorize(MainActivity.this, new AuthDialogListener());
35             }
36         });
37     }
38 
39     class AuthDialogListener implements WeiboDialogListener
40     {
41         @Override
42         public void onComplete(Bundle values)
43         {
44             String token = values.getString("access_token");
45             String expires_in = values.getString("expires_in");
46 
47             AccessToken accessToken = new AccessToken(token, Weibo.getAppSecret());
48             accessToken.setExpiresIn(expires_in);
49             Weibo.getInstance().setAccessToken(accessToken);
50             try
51             {
52                 Weibo.getInstance().share2weibo(MainActivity.this, token, Weibo.getAppSecret(), "你要分享的内容", null);
53             }
54             catch (WeiboException e)
55             {
56                 e.printStackTrace();
57             }
58         }
59 
60         @Override
61         public void onError(DialogError e)
62         {
63             Toast.makeText(getApplicationContext(), "Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
64         }
65 
66         @Override
67         public void onCancel()
68         {
69             Toast.makeText(getApplicationContext(), "Auth cancel", Toast.LENGTH_LONG).show();
70         }
71 
72         @Override
73         public void onWeiboException(WeiboException e)
74         {
75             Toast.makeText(getApplicationContext(), "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
76         }
77     }
78 }

  注意:我的App Key、App Secret、授权回调页均是在Weibo的源文件中设置过的,所以如果想直接使用上面代码的,需要设置Weibo类的源文件。

  第一次写博客的说。

你可能感兴趣的:(android)