Java使用新浪微博API通过账号密码方式登陆微博的实例
今天下了个新浪微博的API研究研究,目前实现了发布微博功能,包括带图片的微博。为了安全,新浪微博的API中并没有提供用微博帐号密码登录的功能,而是采用OAuth授权,用户通过浏览器访问新浪网站登录,登录成功后,浏览器再返回key和secret给程序。
main.xml:
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"> <Buttonandroid:layout_width="fill_parent" android:layout_height="wrap_content"android:id="@+id/login" android:text="登录"/> <EditTextandroid:id="@+id/status"android:layout_width="fill_parent" android:layout_height="300sp"android:hint="输入微博消息"/> <Buttonandroid:layout_width="fill_parent" android:layout_height="wrap_content"android:id="@+id/send" android:text="发布"/> </LinearLayout>
一个登录按钮,一个输入框,一个发布按钮
因为要接收浏览器返回的数据,所以,AndroidManifest.xml注册Activity的时候要加个Intent-Filter
<?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.pocketdigi.weibo"android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="7"/> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".Main"android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <actionandroid:name="android.intent.action.VIEW"/> <categoryandroid:name="android.intent.category.DEFAULT"/> <categoryandroid:name="android.intent.category.BROWSABLE"/> <dataandroid:scheme="sina"android:host="weibo"/> <!--监控sina://weibo这样的地址--> </intent-filter> </activity> </application> <uses-permissionandroid:name="android.permission.INTERNET"></uses-permission> </manifest>
intent-filter必须分成两段写,如果合在一起写,就启动不了了。
为了简便,直接把新浪Sample里的OAuthConstant类拷过来:
packageweibo4android.androidexamples;
importweibo4android.Weibo;
importweibo4android.http.AccessToken;
importweibo4android.http.RequestToken;
publicclassOAuthConstant{
privatestaticWeiboweibo=null;
privatestaticOAuthConstantinstance=null;
privateRequestTokenrequestToken;
privateAccessTokenaccessToken;
privateStringtoken;
privateStringtokenSecret;
privateOAuthConstant(){};
publicstaticsynchronizedOAuthConstantgetInstance(){
if(instance==null)
instance=newOAuthConstant();
returninstance;
}
publicWeibogetWeibo(){
if(weibo==null)
weibo=newWeibo();
returnweibo;
}
publicAccessTokengetAccessToken(){
returnaccessToken;
}
publicvoidsetAccessToken(AccessTokenaccessToken){
this.accessToken=accessToken;
this.token=accessToken.getToken();
this.tokenSecret=accessToken.getTokenSecret();
}
publicRequestTokengetRequestToken(){
returnrequestToken;
}
publicvoidsetRequestToken(RequestTokenrequestToken){
this.requestToken=requestToken;
}
publicStringgetToken(){
returntoken;
}
publicvoidsetToken(Stringtoken){
this.token=token;
}
publicStringgetTokenSecret(){
returntokenSecret;
}
publicvoidsetTokenSecret(StringtokenSecret){
this.tokenSecret=tokenSecret;
}
}
接下来就是最关键的主程序:
packagecom.pocketdigi.weibo;
importjava.io.File;
importweibo4android.Weibo;
importweibo4android.WeiboException;
importweibo4android.http.AccessToken;
importweibo4android.http.RequestToken;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.content.SharedPreferences;
importandroid.content.SharedPreferences.Editor;
importandroid.net.Uri;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
publicclassMainextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
Stringkey="",secret="";
Buttonlogin,send;
EditTextstatus;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.setProperty("weibo4j.oauth.consumerKey","3997936609");
System.setProperty("weibo4j.oauth.consumerSecret",
"8bc9e3bfd6ae8e3b2b8bda9079918950");
//设置在新浪应用开放平台申请的应用的key和secret
login=(Button)findViewById(R.id.login);
send=(Button)findViewById(R.id.send);
status=(EditText)findViewById(R.id.status);
login.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
login();
//登录
}});
send.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
Stringtext=String.valueOf(status.getText());
Weiboweibo=newWeibo();
weibo.setToken(key,secret);
try{
//weibo.updateStatus(text);
//只发文字
Filef=newFile("/sdcard/wallpaper/129567208597069400.jpg");
weibo.uploadStatus(text,f);
//发文字+图片,这里需要导入commons-httpclient-3.0.1.jar,自己网上下
//在实际项目上,最好放Thread里,因为按下去的时候按钮会卡
}catch(WeiboExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}});
}
@Override
protectedvoidonStart(){
//TODOAuto-generatedmethodstub
super.onStart();
//启动时执行检测是否来自网页登录返回
//如果是,获取key和secret
//否则读取SharedPreferences
//若得不到key和secret,直接跳转登录
Uriuri=this.getIntent().getData();
if(uri!=null){
//如果是浏览器返回
try{
RequestTokenrequestToken=OAuthConstant.getInstance()
.getRequestToken();
AccessTokenaccessToken=requestToken.getAccessToken(uri
.getQueryParameter("oauth_verifier"));
OAuthConstant.getInstance().setAccessToken(accessToken);
//保存
Editorsharedata=getSharedPreferences("WeiBo",0).edit();
sharedata.putString("key",accessToken.getToken());
sharedata.putString("secret",accessToken.getTokenSecret());
sharedata.commit();
key=accessToken.getToken();
secret=accessToken.getTokenSecret();
}catch(WeiboExceptione){
e.printStackTrace();
}
}else{
//如果是用户自己启动
SharedPreferencessettings=getSharedPreferences("WeiBo",0);
key=settings.getString("key","");
secret=settings.getString("secret","");
}
if(key.equals("")||secret.equals("")){
Toast.makeText(this,"尚未登录",Toast.LENGTH_LONG).show();
login();
//跳转到浏览器登录
}
}
publicvoidlogin(){
Weiboweibo=OAuthConstant.getInstance().getWeibo();
RequestTokenrequestToken;
try{
requestToken=weibo.getOAuthRequestToken("sina://weibo");
//为了避免与同类应用冲突,还是自己改下URI吧
Uriuri2=Uri.parse(requestToken.getAuthenticationURL()+"&from=xweibo");
OAuthConstant.getInstance().setRequestToken(requestToken);
startActivity(newIntent(Intent.ACTION_VIEW,uri2));
}catch(WeiboExceptione){
e.printStackTrace();
}
}
}
发图片需要导入commons-httpclient-3.0.1.jar,否则启动报错,当然weibo4android-1.2.0.jar是不可少的