编写微博客户端,最重要的就是用户授权方法。现在主流SNS社区开放API后,基本都采用OAuth认证进行授权。本文主要记录新浪微博1.0a版本的OAuth认证。但是随着2.0版本的逐渐普及,会在今后的加入2.0版本的方法。
有关OAuth认证的理论及相应流程在这里不做过多追述,各大网站上都已经写的十分清晰,这里主要写下我自己的实现方法。对于OAuth认证,这里采用signpost-oauth开源项目。
首先编写一个类,用于存储认证过程中需要用到基本信息。
public class SinaConstant {// 新浪OAuth辅助信息类
// 所分配的APP_KEY
public static final String CONSUMER_KEY = "";
// 所分配的APP_SECRET
public static final String CONSUMER_SECRET = "";
// 用于获取未授权的request token
public static final String REQUEST_URL = "http://api.t.sina.com.cn/oauth/request_token";
// 用于获取access token
public static final String ACCESS_URL = "http://api.t.sina.com.cn/oauth/access_token";
// 用于对未授权的request token进行授权
public static final String AUTHORIZE_URL = "http://api.t.sina.com.cn/oauth/authorize";
// 回调地址
public static final String OAUTH_CALLBACK_URL = "mysina://CallActivity";
}
注:1、其中回调地址用于指向从新浪页面授权后跳转到页面;2、对应的key和secret填写新浪微博对应提供的app_key及app_secret
建立一个Activity用于进行添加账号的操作。将改Activity设置为单例模式
<activity
android:label="@string/app_name"
android:launchMode="singleInstance" android:name=".AddUserActivity" >
<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:host="CallActivity"
android:scheme="mysina" />
</intent-filter>
</activity>
注:1、android:launchMode="singleInstance"将该Activity设置为单例;2、data标签与SinaConstant类中的回调地址对应,用于从浏览器回传值时呼出该Activity
建立AddUserActivity,对应代码如下:
public class AddUserActivity extends Activity {
/** Called when the activity is first created. */
Context context;
private OAuthConsumer sinaconsumer;
private OAuthProvider sinaprovider;
private OAuthRequestToken oauthtool;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.usermanager);
sinaconsumer = new CommonsHttpOAuthConsumer(SinaConstant.CONSUMER_KEY,SinaConstant.CONSUMER_SECRET);//初始化用于OAuth认证的Consumer对象
sinaprovider = new CommonsHttpOAuthProvider(SinaConstant.REQUEST_URL,SinaConstant.ACCESS_URL, SinaConstant.AUTHORIZE_URL);//初始化用于OAuth认证的Provider对象
ImageButton adduser = (ImageButton) findViewById(R.id.addUserImage);this.context = this;
adduser.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("OAuth认证新浪");
oauthtool = new OAuthRequestToken(context, sinaconsumer,sinaprovider);
oauthtool.execute();
}
});
}
protected void onNewIntent(Intent intent) {//AddUserActivity为单例,再第二次开启时加载该方法
super.onNewIntent(intent);
Uri uri = intent.getData();
String verifier = null;
verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
try {
sinaprovider.setOAuth10a(true);//设置OAuth版本号
sinaprovider.retrieveAccessToken(sinaconsumer, verifier);//通过服务器返回的Verifier去获取账号对应的Token
SortedSet<String> user_ids = sinaprovider.getResponseParameters().get("user_id");
String user_id = user_ids.first();
String Token= sinaconsumer.getToken();
String TokenSecret = sinaconsumer.getTokenSecret();
System.out.println(userKey + "&*&" + userSecret);
} catch (Exception e) {
e.printStackTrace();
}
}
注:1、在OnNewIntent方法中,sinaprovider.retrieveAccessToken()需要与网路交互,最好采取异步操作,本代码中忽略,异步方法可以参考在onClickListener监听中的OAuthRequestToken。
我们可以在上面的代码中看到,我们已经获取到相应的Token及TokenSecret了。通过这2个值,我们技能对授权账号进行操作,获取账号信息,发送微博,获取微博,更新资料等。
在第一步认证中,用到了一个异步类OAuthRequestToken,代码如下 :
public class OAuthRequestToken extends AsyncTask<String, Void, String> {
private OAuthConsumer consumer;
private OAuthProvider provider;
private Context context;
private ProgressDialog pd;
public OAuthRequestToken(Context context, OAuthConsumer consumer,
OAuthProvider provider) {
this.context = context;
this.consumer = consumer;
this.provider = provider;
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
// if(type.equalsIgnoreCase("sina")){
try {
Uri uri = null;
// retrieveRequestToken的第二个参数是回调URL
final String url = provider.retrieveRequestToken(consumer,SinaConstant.OAUTH_CALLBACK_URL);
System.out.println(consumer.getToken());
uri = Uri.parse(url);
context.startActivity(new Intent(Intent.ACTION_VIEW, uri));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
return "success";
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
pd.dismiss();
if(result == null){
Toast.makeText(context, "网络异常,请稍后重试", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = new ProgressDialog(context);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("正在加载");
pd.show();
}
}
OAuth认证,在本文中是通过调用系统浏览器到新浪微博指定地址进行授权,如果使用UCWeb之类的浏览器可能会出现无法回调的异常。所以建议使用WebView来实现授权页面。相应的方法会在后面写到。
分享到:
相关推荐
通过以上介绍可以看出,在进行Android客户端与SNS网站接入的过程中,开发者需要关注多个方面的问题,包括但不限于认证方式的选择、权限的申请与管理、官方SDK的使用等。只有充分理解这些要点并遵循相应规范,才能...
总的来说,"SNS驴友系统"项目涵盖了Android开发的众多关键技术和最佳实践,包括服务器端架构设计、数据库管理、客户端UI设计、网络通信、数据模型、推送通知、地图服务以及性能优化。深入研究这个项目,不仅可以提升...
2. **Web与移动SNS开发**:社交网络服务(SNS)的开发涵盖了Web和移动两个领域,意味着该代码不仅包含传统的Web页面,还有适应不同移动设备(如Android)的应用程序,这需要对响应式设计和跨平台开发有深入理解。...
记事狗微博系统采用php mysql开发并开源发布,可承载千万级用户,其支持Wap、3G、Android客户端、iphone客户端、短信、微信等多种方式发布内容,并可选择同步到主流的微博平台(也支持微博帐户登录),内置的插件和...
记事狗微博系统是一套创新的互动社区系统,其以微博为核心,兼有轻博、SNS和BBS特点,既可用来独立建站也可通过Ucenter和oauth接口与已有网站无缝整合,通过微博评论模块、关注转发机制打通全站的信息流、关系流,可...
记事狗微博系统是一套创新的互动社区系统,其以微博为核心,兼有轻博、SNS和BBS特点,既可用来独立建站也可通过Ucenter和oauth接口与已有网站无缝整合,通过微博评论模块、关注转发机制打通全站的信息流、关系流,可...
OAuth2.0是一种广泛使用的授权框架,它允许第三方应用在用户授权的情况下访问其在其他服务上的数据。 #### 第一步:请求授权码(code) 使用Android SDK中的`SendAuth.Req`类发送请求,如下所示: ```java // ...