android 新浪微博Oauth2.0認證以及自訂webview認證

來源:互聯網
上載者:User

        首先不得不說,自己犯了一個比較窩囊的錯誤,不過也不能完全怪我,因為大家都知道,新浪微博Oauth2.0提供的jar包,好傢夥2M多,誰看誰都不想用,才使得我去研究1.0的使用,研究好久,終於實現可用了,變態的新浪最新說要停止1.0介面的調用,害的我不得不更改了,想想也是,人家升級就是為了好用嘛。好了不抱怨了,因為新浪Oauth2.0比1.0方便多了,也好用多了,在這裡我簡單說明一下:

      首先我不喜歡新浪提供的那樣加jar包的方式,因此就把他們的源碼整合到我的應用程式中,看起來也比較直觀.其實很簡單,就是把com.weibo.net包copy到自己項目裡,把Bug調理好就OK了.這裡不多說了,下面講下如何使用:

  程式碼片段:   

weibo = Weibo.getInstance();weibo.setupConsumerConfig(consumer_key, consumer_secret);weibo.setRedirectUrl(mRedirectUrl);// 認證weibo.authorize(MainActivity.this, new MyWeiboDialogListener());
class MyWeiboDialogListener implements WeiboDialogListener {@Overridepublic void onComplete(Bundle values) {/*** * 儲存token and expires_in */String token = values.getString("access_token");// 擷取access_tokeneditor = preferences.edit();editor.putString("token", token);editor.commit();Toast.makeText(MainActivity.this, token, 1000).show();// String expires_in = values.getString("expires_in");// 到期時間AccessToken accessToken = new AccessToken(token, consumer_secret);// accessToken.setExpiresIn(expires_in);Intent intent = new Intent();intent.setClass(MainActivity.this, MainActivity.class);startActivity(intent);}@Overridepublic void onWeiboException(WeiboException e) {}@Overridepublic void onError(DialogError e) {}@Overridepublic void onCancel() {}}

上面代碼我們只需要在介面中儲存token,expires_in值,(以便我們以後不用再次Oauth認證) ,但是發現我們只儲存token就可以實現,expires_in這個值我想只是個形式,如果到期的話token就會失效,這個時候應該需要從新認證,擷取新的token值,(這裡占時這麼說,我沒有調查過,有時間好好研究下在結論.別介意)

發送調用:

if (token == null || token.equals("")) {Toast.makeText(MainActivity.this, "請先Oauth認證", 1000).show();} else {Utility.setAuthorization(new Oauth2AccessTokenHeader()); // 這一步不能省.AccessToken accessToken = new AccessToken(token,consumer_secret);Weibo.getInstance().setAccessToken(accessToken);update(weibo.getInstance(), weibo.getAppKey(), editText.getText().toString(), "", "");/*** * 擷取相應介面資料 */// try {// getPublicTimeline(weibo.getInstance());// } catch (MalformedURLException e) {// // TODO Auto-generated catch block// e.printStackTrace();// } catch (IOException e) {// // TODO Auto-generated catch block// e.printStackTrace();// }}

官方源碼:

    private void authorize(Activity activity, String[] permissions, int activityCode,            final WeiboDialogListener listener) {        Utility.setAuthorization(new Oauth2AccessTokenHeader());        boolean singleSignOnStarted = false;        mAuthDialogListener = listener;        // Prefer single sign-on, where available.        if (activityCode >= 0) {            singleSignOnStarted = startSingleSignOn(activity, APP_KEY, permissions, activityCode);        }        // Otherwise fall back to traditional dialog.        if (!singleSignOnStarted) {            startDialogAuth(activity, permissions);        }    }


 Utility.setAuthorization(new Oauth2AccessTokenHeader());

這句話要在你建立AccessToken之前執行,記住就行了,我水平也不高.

這樣我們就實現了發表微博.

最後還要說明一點,在我們應用中直接使用他們的dialog認證,有個不足之處.

            

其實也沒什麼,就是用起來不方便,動不動就會遮蓋這個view,因為官方提供的是一個Dialog,所以我們不能用

android:windowSoftInputMode="adjustPan|stateAlwaysVisible" 

但是我們可以在代碼中實現,在com.weibo.net.WeiboDialog.java中oncreate中加入:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

這樣我們就不會在遮蓋我的iew了,效果如下:


你看,這樣就不影響了,對了,我對dialog自己進行了處理,大家也可以根據自己的眼光,進行處理.




上面簡單就介紹到這裡,因為自我感覺不靈活,下面我們來看幾個應用視圖:

                
 

看起來很友好吧,因此就要建立自己的webview的Activity。

下面我介紹下怎麼實現:

 建立MyWebViewActivity.java

package com.jj.sina;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.graphics.Bitmap;import android.net.Uri;import android.net.http.SslError;import android.os.Bundle;import android.util.Log;import android.view.View;import android.webkit.SslErrorHandler;import android.webkit.WebChromeClient;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.LinearLayout;import android.widget.Toast;import com.weibo.net.AccessToken;import com.weibo.net.DialogError;import com.weibo.net.Utility;import com.weibo.net.Weibo;import com.weibo.net.WeiboDialogListener;import com.weibo.net.WeiboException;/*** * 自訂webview(Oauth認證) *  * @author zhangjia *  */public class MyWebViewActivity extends Activity implements WeiboDialogListener {private final String TAG = "jjhappyforever";private WebView mWebView;private WeiboDialogListener mListener;private LinearLayout linearLayout;public void InitWebView() {linearLayout = (LinearLayout) findViewById(R.id.ll_webview);mWebView = (WebView) findViewById(R.id.mywebview);mWebView.setVerticalScrollBarEnabled(false);mWebView.setHorizontalScrollBarEnabled(false);mWebView.getSettings().setJavaScriptEnabled(true);mWebView.setWebViewClient(new WeiboWebViewClient());mWebView.loadUrl(MyWeiboManager.getOauthURL(this));}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mListener = this;setContentView(R.layout.webview);InitWebView();}/*** * WebViewClient *  * @author zhangjia *  */private class WeiboWebViewClient extends WebViewClient {/*** * 地址改變都會調用 */@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Log.d(TAG, "Redirect URL: " + url);if (url.startsWith(Weibo.getInstance().getRedirectUrl())) {handleRedirectUrl(view, url);return true;}// launch non-dialog URLs in a full browserstartActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));return true;}@Overridepublic void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {super.onReceivedError(view, errorCode, description, failingUrl);mListener.onError(new DialogError(description, errorCode,failingUrl));}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {Log.d(TAG, "onPageStarted URL: " + url);// google issue. shouldOverrideUrlLoading not executed/** * 點擊授權,url正確 */if (url.startsWith(Weibo.getInstance().getRedirectUrl())) {handleRedirectUrl(view, url);view.stopLoading();return;}super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {Log.d(TAG, "onPageFinished URL: " + url);super.onPageFinished(view, url);linearLayout.setVisibility(View.GONE);}public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {handler.proceed();}}private void handleRedirectUrl(WebView view, String url) {Bundle values = Utility.parseUrl(url);String error = values.getString("error");String error_code = values.getString("error_code");// 授權成功if (error == null && error_code == null) {mListener.onComplete(values);// 拒絕失敗等} else if (error.equals("access_denied")) {mListener.onCancel();} else {// 異常mListener.onWeiboException(new WeiboException(error, Integer.parseInt(error_code)));}}@Overridepublic void onComplete(Bundle values) {/*** * 在這裡要save the access_token */String token = values.getString("access_token");SharedPreferences preferences = getSharedPreferences(MainActivity.file,0);Editor editor = preferences.edit();editor.putString("token", token);editor.commit();AccessToken accessToken = new AccessToken(token, Weibo.getAppSecret());Weibo.getInstance().setAccessToken(accessToken);setResult(RESULT_OK);finish();}@Overridepublic void onWeiboException(WeiboException e) {e.printStackTrace();}@Overridepublic void onError(DialogError e) {e.printStackTrace();}@Overridepublic void onCancel() {finish();}}

上面代碼大部分都是copy WeiboDialog.java中的代碼,只是稍微做下改變.

最重要其實有兩部分:第一:怎麼擷取要Load的url,也就是認證介面的顯示,第二:怎麼擷取Access_token 值,有了這個值我們才可以進行API調用

仔細看下,不難理解的.

:(第一個我就不掩飾了,最上面講的就是)

                   
      

                

   上面說的只是一個雛形,大家根據自己項目種進行調整應用就好了,這方式看起來是不是比直接調用Android新浪 jar包好看多了吧,

    另外實現起來也比較靈活,新浪Oauth2.0還是瞞不錯的. 


由於比較忙,現將源碼上傳網上.如有問題,請留言.

Thanks for you ! ! !


源碼下載






相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.