android 新浪微博Oauth2.0認證

openkk 12年前發布 | 66K 次閱讀 Android Android開發 移動開發

        首先不得不說,自己犯了一個比較窩囊的錯誤,不過也不能完全怪我,因為大家都知道,新浪微博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 {

    @Override
    public void onComplete(Bundle values) {
        /***
         * 保存token and expires_in
         */

        String token = values.getString("access_token");// 獲取access_token

        editor = 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);

    }

    @Override
    public void onWeiboException(WeiboException e) {

    }

    @Override
    public void onError(DialogError e) {

    }

    @Override
    public void onCancel() {

    }

}</pre><span style="font-size:14px;">上面代碼我們只需要在接口中保存token,expires_in值,(以便我們以后不用再次Oauth認證) ,但是發現我們只保存token就可以實現,expires_in這個值我想只是個形式,如果到期的話token就會失效,這個時候應該需要從新認證,獲取新的token值,(這里占時這么說,我沒有調查過,有時間好好研究下在結論.別介意)</span> <p></p>

發送調用:

             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();
                // }
            }
        </pre><br />

官方源碼:

    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);
    }

}</pre><br />

 Utility.setAuthorization(new Oauth2AccessTokenHeader());
</span>

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

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

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

 android 新浪微博Oauth2.0認證        android 新浪微博Oauth2.0認證        android 新浪微博Oauth2.0認證

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

android:windowSoftInputMode="adjustPan|stateAlwaysVisible" 

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

 getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
這樣我們就不會在遮蓋我的iew了,效果如下:

 android 新浪微博Oauth2.0認證
你看,這樣就不影響了,對了,我對dialog自己進行了處理,大家也可以根據自己的眼光,進行處理.




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

 android 新浪微博Oauth2.0認證           android 新浪微博Oauth2.0認證           android 新浪微博Oauth2.0認證

看起來很友好吧,因此就要創建自己的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));
    
    

    }

    @Override protected void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);
     mListener = this;
     setContentView(R.layout.webview);
     InitWebView();
    
    

    }

    /***

    • WebViewClient
    • @author zhangjia
    • */ private class WeiboWebViewClient extends WebViewClient {

      /***

      • 地址改變都會調用 */ @Override public 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 browser startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); return true; }

        @Override public void onReceivedError(WebView view, int errorCode,

         String description, String failingUrl) {
        

        super.onReceivedError(view, errorCode, description, failingUrl);

        mListener.onError(new DialogError(description, errorCode,

             failingUrl));
        

        }

        @Override public 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); }

        @Override public 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)));
      

      } }

      @Override public 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(); }

      @Override public void onWeiboException(WeiboException e) { e.printStackTrace(); }

      @Override public void onError(DialogError e) { e.printStackTrace(); }

      @Override public void onCancel() { finish(); }

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

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

仔細看下,不難理解的.

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

    android 新浪微博Oauth2.0認證          android 新浪微博Oauth2.0認證         android 新浪微博Oauth2.0認證         

    android 新浪微博Oauth2.0認證               android 新浪微博Oauth2.0認證

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

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

 

轉自:http://blog.csdn.net/jj120522/article/details/7928202

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!