編輯:Android開發實例
以前在公司做Android應用(後面簡稱App)時的疑惑: 我只想實現用戶可以用人人賬號能登錄我們的App,可以將自己在我們App中看到的,某些喜歡的內容分享給自己在人人上的朋友、同事和同學等。但是我又不想使用人人官方提供的SDK。理由:太大,有人可能要說,可以去掉沒用到的類文件,我想說的是太費事了(我當時就這件事花了一天多時間);授權界面的Dialog覺得不美觀,我自己得改。當時我就在想人人如果能提供一個小點的SDK只有我說的那兩個功能就好了,欣賞大多數應用,裡面用到人人提供的功能的就是我說的這兩個。鑒於此,這次我不想使用人人提供的SDK(當然肯定會參考),所有功能自己編碼實現,這對我來說是一個挑戰,不過我喜歡這種有挑戰的事。好了開始正題,這篇是在前面 實戰Android仿人人客戶端之主流程(活動)圖及類圖 的基礎上進行的,不明白可以查看下。
一、類圖如下:
二、編碼實現:
1、布局文件:
a. 主布局文件(auth.xml)
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <com.everyone.android.widget.TopNavbar
- android:id="@+id/rl_top_navbar"
- android:layout_width="fill_parent"
- android:layout_height="50dip" />
- <WebView
- android:id="@+id/wv_auth"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- </LinearLayout>
b. 頂部工具欄(或者菜單欄)的布局文件(top_navbar.xml)
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/top_navbar" >
- <LinearLayout
- android:id="@+id/ll_back"
- android:layout_width="60dip"
- android:layout_height="fill_parent"
- android:background="@drawable/v5_0_1_flipper_head_title_wrapper_background"
- android:gravity="center_vertical" >
- <ImageView
- android:id="@+id/iv_back"
- android:layout_width="25dip"
- android:layout_height="25dip"
- android:layout_marginLeft="15dip"
- android:src="@drawable/v5_0_1_flipper_head_back" />
- </LinearLayout>
- <ImageView
- android:id="@+id/iv_line_separator"
- android:layout_width="1dip"
- android:layout_height="25dip"
- android:layout_centerVertical="true"
- android:layout_toRightOf="@+id/ll_back"
- android:background="@drawable/v5_0_1_flipper_head_separator" />
- <TextView
- android:id="@+id/tv_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_marginLeft="15dip"
- android:layout_toRightOf="@+id/iv_line_separator"
- android:text="人人授權訪問"
- android:textColor="#FFFFFF"
- android:textSize="17dip"
- android:textStyle="bold" />
- </RelativeLayout>
2、應用授權界面的具體實現:
a. 初始組件:
- @Override
- protected void setupView() {
- mTopNavbar = (TopNavbar) findViewById(R.id.rl_top_navbar);
- mWebView = (WebView) findViewById(R.id.wv_auth);
- mWebView.setVerticalScrollBarEnabled(false);
- mWebView.setHorizontalScrollBarEnabled(false);
- mWebView.getSettings().setJavaScriptEnabled(true);
- }
b. 組拼請求參數
- StringBuilder authorizeUrl = new StringBuilder(Constant.AUTHORIZE_URL);
- authorizeUrl.append("?");
- authorizeUrl.append("client_id=").append(Constant.API_KEY);
- authorizeUrl.append("&redirect_uri=").append(Constant.DEFAULT_REDIRECT_URI);
- authorizeUrl.append("&response_type=").append("token");
- authorizeUrl.append("&display=").append("touch");
- String scope = TextUtils.join(" ", Constant.HAVE_PERMISSIONS);
- authorizeUrl.append("&scope=").append(scope);
- Log.i(TAG, "authorizeUrl = " + authorizeUrl.toString());
c. 使用WebView組件加載授權界面
- mWebView.loadUrl(authorizeUrl.toString());
- // 以POST方式請求
- // mWebView.postUrl(Constant.AUTHORIZE_URL, EncodingUtils.getBytes(sb.toString(), "BASE64"));
- mWebView.setWebViewClient(new WebViewClient() {
- public boolean shouldOverrideUrlLoading(WebView webView, String url) {
- Log.i(TAG, "shouldOverrideUrlLoading() Redirect URL = " + url);
- if (url.startsWith(Constant.DEFAULT_REDIRECT_URI + "#error=login_denied")) {
- AuthActivity.this.onBackPressed();
- } else if(url.startsWith("http://graph.renren.com/oauth/login_success.html#access_token")) {
- String accessToken = url.substring(url.indexOf("="), url.indexOf("&"));
- Log.i(TAG, "accessToken = " + accessToken);
- AuthActivity.this.onBackPressed();
- return false;
- }
- webView.loadUrl(url);
- return true;
- }
- public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError errorCode) {
- // 在默認情況下,通過loadUrl(String url)方法,可以順利load。
- // 但是,當load有ssl層的https頁面時,如果這個網站的安全證書在Android無法得到認證,WebView就會變成一個空白頁,
- // 而並不會像PC浏覽器中那樣跳出一個風險提示框。因此,我們必須針對這種情況進行處理。(這個證書限於2.1版本以上的Android 系統才可以)
- // 默認的處理方式,WebView變成空白頁
- // handler.cancel();
- // 接受證書
- handler.proceed();
- }
- @Override
- public void onReceivedError(WebView view, int errorCode,
- String description, String failingUrl) {
- super.onReceivedError(view, errorCode, description, failingUrl);
- AuthActivity.this.onBackPressed();
- }
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- Log.i(TAG, "Webview loading URL: " + url);
- super.onPageStarted(view, url, favicon);
- }
- public void onPageFinished(WebView view, String url) {
- Log.i(TAG, "onPageFinished() url = " + url);
- super.onPageFinished(view, url);
- }
- });
d. Back鍵事件處理
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- if (mWebView != null) {
- mWebView.stopLoading();
- }
- }
- return super.onKeyDown(keyCode, event);
- }
應用授權界面,完整代碼:
- package com.everyone.android.ui;
- import android.graphics.Bitmap;
- import android.os.Bundle;
- import android.text.TextUtils;
- import android.util.Log;
- import android.view.KeyEvent;
- import android.view.View;
- import android.webkit.SslErrorHandler;
- import android.webkit.WebView;
- import android.webkit.WebViewClient;
- import com.everyone.android.AppBaseActivity;
- import com.everyone.android.R;
- import com.everyone.android.utils.Constant;
- import com.everyone.android.widget.TopNavbar;
- /**
- * 功能描述:應用授權界面
- * @author android_ls
- */
- public class AuthActivity extends AppBaseActivity {
- /**
- * 打印Log的標簽
- */
- private static final String TAG = "AuthActivity";
- private WebView mWebView;
- private TopNavbar mTopNavbar;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 頂部返回按鈕事件處理
- mTopNavbar.llBack.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onBackPressed();
- }
- });
- }
- @Override
- protected void setupView() {
- mTopNavbar = (TopNavbar) findViewById(R.id.rl_top_navbar);
- mWebView = (WebView) findViewById(R.id.wv_auth);
- mWebView.setVerticalScrollBarEnabled(false);
- mWebView.setHorizontalScrollBarEnabled(false);
- mWebView.getSettings().setJavaScriptEnabled(true);
- }
- @Override
- protected int getLayoutId() {
- return R.layout.auth;
- }
- @Override
- protected void initializedData() {
- // 組拼請求參數
- StringBuilder authorizeUrl = new StringBuilder(Constant.AUTHORIZE_URL);
- authorizeUrl.append("?");
- authorizeUrl.append("client_id=").append(Constant.API_KEY);
- authorizeUrl.append("&redirect_uri=").append(Constant.DEFAULT_REDIRECT_URI);
- authorizeUrl.append("&response_type=").append("token");
- authorizeUrl.append("&display=").append("touch");
- String scope = TextUtils.join(" ", Constant.HAVE_PERMISSIONS);
- authorizeUrl.append("&scope=").append(scope);
- Log.i(TAG, "authorizeUrl = " + authorizeUrl.toString());
- mWebView.loadUrl(authorizeUrl.toString());
- // 以POST方式請求
- // mWebView.postUrl(Constant.AUTHORIZE_URL, EncodingUtils.getBytes(sb.toString(), "BASE64"));
- mWebView.setWebViewClient(new WebViewClient() {
- public boolean shouldOverrideUrlLoading(WebView webView, String url) {
- Log.i(TAG, "shouldOverrideUrlLoading() Redirect URL = " + url);
- if (url.startsWith(Constant.DEFAULT_REDIRECT_URI + "#error=login_denied")) {
- AuthActivity.this.onBackPressed();
- } else if(url.startsWith("http://graph.renren.com/oauth/login_success.html#access_token")) {
- String accessToken = url.substring(url.indexOf("="), url.indexOf("&"));
- Log.i(TAG, "accessToken = " + accessToken);
- AuthActivity.this.onBackPressed();
- return false;
- }
- webView.loadUrl(url);
- return true;
- }
- public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError errorCode) {
- // 在默認情況下,通過loadUrl(String url)方法,可以順利load。
- // 但是,當load有ssl層的https頁面時,如果這個網站的安全證書在Android無法得到認證,WebView就會變成一個空白頁,
- // 而並不會像PC浏覽器中那樣跳出一個風險提示框。因此,我們必須針對這種情況進行處理。(這個證書限於2.1版本以上的Android 系統才可以)
- // 默認的處理方式,WebView變成空白頁
- // handler.cancel();
- // 接受證書
- handler.proceed();
- }
- @Override
- public void onReceivedError(WebView view, int errorCode,
- String description, String failingUrl) {
- super.onReceivedError(view, errorCode, description, failingUrl);
- AuthActivity.this.onBackPressed();
- }
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- Log.i(TAG, "Webview loading URL: " + url);
- super.onPageStarted(view, url, favicon);
- }
- public void onPageFinished(WebView view, String url) {
- Log.i(TAG, "onPageFinished() url = " + url);
- super.onPageFinished(view, url);
- }
- });
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- if (mWebView != null) {
- mWebView.stopLoading();
- }
- }
- return super.onKeyDown(keyCode, event);
- }
- }
TopNavbar類:
- package com.everyone.android.widget;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.LayoutInflater;
- import android.widget.FrameLayout;
- import android.widget.LinearLayout;
- import android.widget.RelativeLayout;
- import android.widget.TextView;
- import com.everyone.android.R;
- /**
- * 功能描述:自定義頂部工具欄
- * @author android_ls
- * 創建日期:2013-03-26
- */
- public class TopNavbar extends FrameLayout {
- public TextView tvTitle;
- public LinearLayout llBack;
- public TopNavbar(Context context) {
- super(context);
- setupViews();
- }
- public TopNavbar(Context context, AttributeSet attrs) {
- super(context, attrs);
- setupViews();
- }
- private void setupViews() {
- final LayoutInflater mLayoutInflater = LayoutInflater.from(getContext());
- RelativeLayout rlTopNavbar = (RelativeLayout) mLayoutInflater.inflate(R.layout.top_navbar, null);
- addView(rlTopNavbar);
- llBack = (LinearLayout) rlTopNavbar.findViewById(R.id.ll_back);
- tvTitle = (TextView) rlTopNavbar.findViewById(R.id.tv_title);
- }
- }
常量類:
- package com.everyone.android.utils;
- /**
- * 功能描述:常量類
- * @author android_ls
- */
- public class Constant {
- /**
- * 人人登錄和授權的地址
- */
- public static final String AUTHORIZE_URL = "https://graph.renren.com/oauth/authorize";
- /**
- * 默認重定向URL
- */
- public static final String DEFAULT_REDIRECT_URI = "http://graph.renren.com/oauth/login_success.html";
- /**
- * 第三方應用所擁有的權限
- */
- public static final String[] HAVE_PERMISSIONS = { "publish_feed", "create_album", "photo_upload", "read_user_album", "status_update",
- "read_user_blog", "read_user_checkin", "read_user_feed", "read_user_guestbook", "read_user_invitation", "read_user_like_history",
- "read_user_message", "read_user_notification", "read_user_photo", "read_user_status", "read_user_comment", "read_user_share",
- "read_user_request", "publish_blog", "publish_checkin", "publish_feed", "publish_share", "write_guestbook", "send_invitation",
- "send_request", "send_message", "send_notification", "photo_upload", "create_album", "publish_comment", "operate_like", "admin_page" };
- /**
- * API_KEY
- */
- public static final String API_KEY = "661ea1ba2d6b49859be197d77fe361f1";
- /**
- * Secret Key
- */
- public static final String SECRET_KEY = "a088d31cd5d341819bfc75ac0208b5e1";
- /**
- * 應用ID
- */
- public static final String APP_ID = "195789";
- }
轉自:http://blog.csdn.net/android_ls/article/details/8725422
本文實例講述了Android中ViewFlipper的使用及設置動畫效果。分享給大家供大家參考,具體如下: 說到左右滑動,其實實現左右滑動的方式很多,有ViewP
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
本文實例講述了Android實現文字和圖片混排(文字環繞圖片)效果。分享給大家供大家參考,具體如下: 在平時我們做項目中,或許有要對一張圖片或者某一個東西進行文字