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,这样我们就看到了发表微博的界面了。当我们写了内容之后,点击发表就能够发表一个微博了。
在这里,有一些东西要说一下:
- TestActivity的按钮单击事件中,通过share2weibo方法,开启了ShareActivity,之后通过Intent开启了ShareActivity,但是我们只看到一个ShareActivity,而且点击关闭之后,的确是没有ShareActivity的。原因是在AndroidManifest.xml中对ShareActivity进行了设置:android:launchMode="singleTask"。
- 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类的源文件。
第一次写博客的说。