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是不可少的