Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 實戰Android仿人人客戶端之人人授權訪問界面

實戰Android仿人人客戶端之人人授權訪問界面

編輯:Android開發實例

          以前在公司做Android應用(後面簡稱App)時的疑惑: 我只想實現用戶可以用人人賬號能登錄我們的App,可以將自己在我們App中看到的,某些喜歡的內容分享給自己在人人上的朋友、同事和同學等。但是我又不想使用人人官方提供的SDK。理由:太大,有人可能要說,可以去掉沒用到的類文件,我想說的是太費事了(我當時就這件事花了一天多時間);授權界面的Dialog覺得不美觀,我自己得改。當時我就在想人人如果能提供一個小點的SDK只有我說的那兩個功能就好了,欣賞大多數應用,裡面用到人人提供的功能的就是我說的這兩個。鑒於此,這次我不想使用人人提供的SDK(當然肯定會參考),所有功能自己編碼實現,這對我來說是一個挑戰,不過我喜歡這種有挑戰的事。好了開始正題,這篇是在前面 實戰Android仿人人客戶端之主流程(活動)圖及類圖  的基礎上進行的,不明白可以查看下。

一、類圖如下:

二、編碼實現:

       1、布局文件:

             a. 主布局文件(auth.xml)

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:orientation="vertical" > 
  6.  
  7.     <com.everyone.android.widget.TopNavbar 
  8.         android:id="@+id/rl_top_navbar" 
  9.         android:layout_width="fill_parent" 
  10.         android:layout_height="50dip" /> 
  11.  
  12.     <WebView 
  13.         android:id="@+id/wv_auth" 
  14.         android:layout_width="fill_parent" 
  15.         android:layout_height="fill_parent" /> 
  16.  
  17. </LinearLayout> 

             b. 頂部工具欄(或者菜單欄)的布局文件(top_navbar.xml)

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     style="@style/top_navbar" > 
  3.  
  4.     <LinearLayout 
  5.         android:id="@+id/ll_back" 
  6.         android:layout_width="60dip" 
  7.         android:layout_height="fill_parent" 
  8.         android:background="@drawable/v5_0_1_flipper_head_title_wrapper_background" 
  9.         android:gravity="center_vertical" > 
  10.  
  11.         <ImageView 
  12.             android:id="@+id/iv_back" 
  13.             android:layout_width="25dip" 
  14.             android:layout_height="25dip" 
  15.             android:layout_marginLeft="15dip" 
  16.             android:src="@drawable/v5_0_1_flipper_head_back" /> 
  17.     </LinearLayout> 
  18.  
  19.     <ImageView 
  20.         android:id="@+id/iv_line_separator" 
  21.         android:layout_width="1dip" 
  22.         android:layout_height="25dip" 
  23.         android:layout_centerVertical="true" 
  24.         android:layout_toRightOf="@+id/ll_back" 
  25.         android:background="@drawable/v5_0_1_flipper_head_separator" /> 
  26.  
  27.     <TextView 
  28.         android:id="@+id/tv_title" 
  29.         android:layout_width="wrap_content" 
  30.         android:layout_height="wrap_content" 
  31.         android:layout_centerVertical="true" 
  32.         android:layout_marginLeft="15dip" 
  33.         android:layout_toRightOf="@+id/iv_line_separator" 
  34.         android:text="人人授權訪問" 
  35.         android:textColor="#FFFFFF" 
  36.         android:textSize="17dip" 
  37.         android:textStyle="bold" /> 
  38.  
  39. </RelativeLayout> 

       2、應用授權界面的具體實現:

            a. 初始組件:

  1. @Override 
  2.   protected void setupView() {  
  3.       mTopNavbar = (TopNavbar) findViewById(R.id.rl_top_navbar);  
  4.       mWebView = (WebView) findViewById(R.id.wv_auth);  
  5.       mWebView.setVerticalScrollBarEnabled(false);  
  6.       mWebView.setHorizontalScrollBarEnabled(false);  
  7.       mWebView.getSettings().setJavaScriptEnabled(true);  
  8.   } 

            b. 組拼請求參數

 

  1. StringBuilder authorizeUrl = new StringBuilder(Constant.AUTHORIZE_URL);  
  2.     authorizeUrl.append("?");  
  3.     authorizeUrl.append("client_id=").append(Constant.API_KEY);  
  4.     authorizeUrl.append("&redirect_uri=").append(Constant.DEFAULT_REDIRECT_URI);  
  5.     authorizeUrl.append("&response_type=").append("token");  
  6.     authorizeUrl.append("&display=").append("touch");  
  7.     String scope = TextUtils.join(" ", Constant.HAVE_PERMISSIONS);  
  8.     authorizeUrl.append("&scope=").append(scope);  
  9.     Log.i(TAG, "authorizeUrl = " + authorizeUrl.toString());  

           c. 使用WebView組件加載授權界面  

  1. mWebView.loadUrl(authorizeUrl.toString());  
  2.          
  3.        // 以POST方式請求  
  4.        // mWebView.postUrl(Constant.AUTHORIZE_URL, EncodingUtils.getBytes(sb.toString(), "BASE64"));  
  5.        mWebView.setWebViewClient(new WebViewClient() {  
  6.  
  7.            public boolean shouldOverrideUrlLoading(WebView webView, String url) {  
  8.                Log.i(TAG, "shouldOverrideUrlLoading() Redirect URL = " + url);  
  9.  
  10.                if (url.startsWith(Constant.DEFAULT_REDIRECT_URI + "#error=login_denied")) {  
  11.                    AuthActivity.this.onBackPressed();  
  12.                } else if(url.startsWith("http://graph.renren.com/oauth/login_success.html#access_token")) {  
  13.                    String accessToken = url.substring(url.indexOf("="), url.indexOf("&"));  
  14.                    Log.i(TAG, "accessToken = " + accessToken);  
  15.                      
  16.                    AuthActivity.this.onBackPressed();  
  17.                    return false;  
  18.                }  
  19.                  
  20.                webView.loadUrl(url);  
  21.                return true;  
  22.            }  
  23.  
  24.            public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError errorCode) {  
  25.                // 在默認情況下,通過loadUrl(String url)方法,可以順利load。  
  26.                // 但是,當load有ssl層的https頁面時,如果這個網站的安全證書在Android無法得到認證,WebView就會變成一個空白頁,  
  27.                // 而並不會像PC浏覽器中那樣跳出一個風險提示框。因此,我們必須針對這種情況進行處理。(這個證書限於2.1版本以上的Android 系統才可以)  
  28.                  
  29.                // 默認的處理方式,WebView變成空白頁  
  30.                // handler.cancel();   
  31.                  
  32.                // 接受證書     
  33.                handler.proceed();  
  34.            }  
  35.  
  36.            @Override 
  37.            public void onReceivedError(WebView view, int errorCode,  
  38.                    String description, String failingUrl) {  
  39.                super.onReceivedError(view, errorCode, description, failingUrl);  
  40.                AuthActivity.this.onBackPressed();  
  41.            }  
  42.  
  43.            public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  44.                Log.i(TAG, "Webview loading URL: " + url);  
  45.                super.onPageStarted(view, url, favicon);  
  46.            }  
  47.  
  48.            public void onPageFinished(WebView view, String url) {  
  49.                Log.i(TAG, "onPageFinished() url = " + url);  
  50.                super.onPageFinished(view, url);  
  51.            }  
  52.        });  

                 d. Back鍵事件處理

  1. @Override 
  2.    public boolean onKeyDown(int keyCode, KeyEvent event) {  
  3.        if (keyCode == KeyEvent.KEYCODE_BACK) {  
  4.            if (mWebView != null) {  
  5.                mWebView.stopLoading();  
  6.            }  
  7.        }  
  8.        return super.onKeyDown(keyCode, event);  
  9.    }  

        應用授權界面,完整代碼:

 

  1. package com.everyone.android.ui;  
  2.  
  3. import android.graphics.Bitmap;  
  4. import android.os.Bundle;  
  5. import android.text.TextUtils;  
  6. import android.util.Log;  
  7. import android.view.KeyEvent;  
  8. import android.view.View;  
  9. import android.webkit.SslErrorHandler;  
  10. import android.webkit.WebView;  
  11. import android.webkit.WebViewClient;  
  12.  
  13. import com.everyone.android.AppBaseActivity;  
  14. import com.everyone.android.R;  
  15. import com.everyone.android.utils.Constant;  
  16. import com.everyone.android.widget.TopNavbar;  
  17.  
  18. /**  
  19.  * 功能描述:應用授權界面  
  20.  * @author android_ls  
  21.  */ 
  22. public class AuthActivity extends AppBaseActivity {  
  23.  
  24.     /**  
  25.      * 打印Log的標簽  
  26.      */ 
  27.     private static final String TAG = "AuthActivity";  
  28.  
  29.     private WebView mWebView;  
  30.  
  31.     private TopNavbar mTopNavbar;  
  32.  
  33.     @Override 
  34.     public void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.  
  37.         // 頂部返回按鈕事件處理  
  38.         mTopNavbar.llBack.setOnClickListener(new View.OnClickListener() {  
  39.  
  40.             @Override 
  41.             public void onClick(View v) {  
  42.                 onBackPressed();  
  43.             }  
  44.         });  
  45.           
  46.     }  
  47.  
  48.     @Override 
  49.     protected void setupView() {  
  50.         mTopNavbar = (TopNavbar) findViewById(R.id.rl_top_navbar);  
  51.         mWebView = (WebView) findViewById(R.id.wv_auth);  
  52.         mWebView.setVerticalScrollBarEnabled(false);  
  53.         mWebView.setHorizontalScrollBarEnabled(false);  
  54.         mWebView.getSettings().setJavaScriptEnabled(true);  
  55.     }  
  56.  
  57.     @Override 
  58.     protected int getLayoutId() {  
  59.         return R.layout.auth;  
  60.     }  
  61.       
  62.     @Override 
  63.     protected void initializedData() {  
  64.         // 組拼請求參數  
  65.         StringBuilder authorizeUrl = new StringBuilder(Constant.AUTHORIZE_URL);  
  66.         authorizeUrl.append("?");  
  67.         authorizeUrl.append("client_id=").append(Constant.API_KEY);  
  68.         authorizeUrl.append("&redirect_uri=").append(Constant.DEFAULT_REDIRECT_URI);  
  69.         authorizeUrl.append("&response_type=").append("token");  
  70.         authorizeUrl.append("&display=").append("touch");  
  71.         String scope = TextUtils.join(" ", Constant.HAVE_PERMISSIONS);  
  72.         authorizeUrl.append("&scope=").append(scope);  
  73.         Log.i(TAG, "authorizeUrl = " + authorizeUrl.toString());  
  74.           
  75.         mWebView.loadUrl(authorizeUrl.toString());  
  76.           
  77.         // 以POST方式請求  
  78.         // mWebView.postUrl(Constant.AUTHORIZE_URL, EncodingUtils.getBytes(sb.toString(), "BASE64"));  
  79.         mWebView.setWebViewClient(new WebViewClient() {  
  80.  
  81.             public boolean shouldOverrideUrlLoading(WebView webView, String url) {  
  82.                 Log.i(TAG, "shouldOverrideUrlLoading() Redirect URL = " + url);  
  83.  
  84.                 if (url.startsWith(Constant.DEFAULT_REDIRECT_URI + "#error=login_denied")) {  
  85.                     AuthActivity.this.onBackPressed();  
  86.                 } else if(url.startsWith("http://graph.renren.com/oauth/login_success.html#access_token")) {  
  87.                     String accessToken = url.substring(url.indexOf("="), url.indexOf("&"));  
  88.                     Log.i(TAG, "accessToken = " + accessToken);  
  89.                       
  90.                     AuthActivity.this.onBackPressed();  
  91.                     return false;  
  92.                 }  
  93.                   
  94.                 webView.loadUrl(url);  
  95.                 return true;  
  96.             }  
  97.  
  98.             public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError errorCode) {  
  99.                 // 在默認情況下,通過loadUrl(String url)方法,可以順利load。  
  100.                 // 但是,當load有ssl層的https頁面時,如果這個網站的安全證書在Android無法得到認證,WebView就會變成一個空白頁,  
  101.                 // 而並不會像PC浏覽器中那樣跳出一個風險提示框。因此,我們必須針對這種情況進行處理。(這個證書限於2.1版本以上的Android 系統才可以)  
  102.                   
  103.                 // 默認的處理方式,WebView變成空白頁  
  104.                 // handler.cancel();   
  105.                   
  106.                 // 接受證書     
  107.                 handler.proceed();  
  108.             }  
  109.  
  110.             @Override 
  111.             public void onReceivedError(WebView view, int errorCode,  
  112.                     String description, String failingUrl) {  
  113.                 super.onReceivedError(view, errorCode, description, failingUrl);  
  114.                 AuthActivity.this.onBackPressed();  
  115.             }  
  116.  
  117.             public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  118.                 Log.i(TAG, "Webview loading URL: " + url);  
  119.                 super.onPageStarted(view, url, favicon);  
  120.             }  
  121.  
  122.             public void onPageFinished(WebView view, String url) {  
  123.                 Log.i(TAG, "onPageFinished() url = " + url);  
  124.                 super.onPageFinished(view, url);  
  125.             }  
  126.         });  
  127.     }  
  128.       
  129.     @Override 
  130.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  131.         if (keyCode == KeyEvent.KEYCODE_BACK) {  
  132.             if (mWebView != null) {  
  133.                 mWebView.stopLoading();  
  134.             }  
  135.         }  
  136.         return super.onKeyDown(keyCode, event);  
  137.     }  
  138.       
  139. }  

TopNavbar類:

  1. package com.everyone.android.widget;  
  2.  
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.view.LayoutInflater;  
  6. import android.widget.FrameLayout;  
  7. import android.widget.LinearLayout;  
  8. import android.widget.RelativeLayout;  
  9. import android.widget.TextView;  
  10.  
  11. import com.everyone.android.R;  
  12.  
  13. /**  
  14.  * 功能描述:自定義頂部工具欄  
  15.  * @author android_ls  
  16.  * 創建日期:2013-03-26  
  17.  */ 
  18. public class TopNavbar extends FrameLayout {  
  19.  
  20.     public TextView tvTitle;  
  21.  
  22.     public LinearLayout llBack;  
  23.  
  24.     public TopNavbar(Context context) {  
  25.         super(context);  
  26.         setupViews();  
  27.     }  
  28.  
  29.     public TopNavbar(Context context, AttributeSet attrs) {  
  30.         super(context, attrs);  
  31.         setupViews();  
  32.     }  
  33.  
  34.     private void setupViews() {  
  35.         final LayoutInflater mLayoutInflater = LayoutInflater.from(getContext());  
  36.         RelativeLayout rlTopNavbar = (RelativeLayout) mLayoutInflater.inflate(R.layout.top_navbar, null);  
  37.         addView(rlTopNavbar);  
  38.  
  39.         llBack = (LinearLayout) rlTopNavbar.findViewById(R.id.ll_back);  
  40.         tvTitle = (TextView) rlTopNavbar.findViewById(R.id.tv_title);  
  41.     }  
  42.  
  43. }  

常量類:

  1. package com.everyone.android.utils;  
  2.  
  3. /**  
  4.  * 功能描述:常量類  
  5.  * @author android_ls  
  6.  */ 
  7. public class Constant {  
  8.  
  9.     /**  
  10.      * 人人登錄和授權的地址  
  11.      */ 
  12.     public static final String AUTHORIZE_URL = "https://graph.renren.com/oauth/authorize";  
  13.  
  14.     /**  
  15.      * 默認重定向URL  
  16.      */ 
  17.     public static final String DEFAULT_REDIRECT_URI = "http://graph.renren.com/oauth/login_success.html";  
  18.       
  19.     /**  
  20.      * 第三方應用所擁有的權限  
  21.      */ 
  22.     public static final String[] HAVE_PERMISSIONS = { "publish_feed", "create_album", "photo_upload", "read_user_album", "status_update",  
  23.             "read_user_blog", "read_user_checkin", "read_user_feed", "read_user_guestbook", "read_user_invitation", "read_user_like_history",  
  24.             "read_user_message", "read_user_notification", "read_user_photo", "read_user_status", "read_user_comment", "read_user_share",  
  25.             "read_user_request", "publish_blog", "publish_checkin", "publish_feed", "publish_share", "write_guestbook", "send_invitation",   
  26.             "send_request", "send_message", "send_notification", "photo_upload", "create_album", "publish_comment", "operate_like", "admin_page" };  
  27.       
  28.     /**  
  29.      * API_KEY  
  30.      */ 
  31.     public static final String API_KEY = "661ea1ba2d6b49859be197d77fe361f1";  
  32.  
  33.     /**  
  34.      * Secret Key  
  35.      */ 
  36.     public static final String SECRET_KEY = "a088d31cd5d341819bfc75ac0208b5e1";  
  37.  
  38.     /**  
  39.      * 應用ID  
  40.      */ 
  41.     public static final String APP_ID = "195789";  
  42.       
  43. }  
  44.  


三、運行效果圖:

 

轉自:http://blog.csdn.net/android_ls/article/details/8725422

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved