今天做了一个webview网络操作的实例,这里与大家分享。相信开发过新浪、腾讯、豆瓣以及人人等微博的开发者都知道OAuth这个认证框架。这些开放平台上也有自己开发好了的SDK,只需要下载过来即可使用。今天主要是结合webview来实现人人网的认证授权。 

   OAuth 2.0验证授权流程,支持网站、站内应用、手机客户端、桌面客户端等。 具体可以参考:

   人人的开放平台的认证流程:http://wiki.dev.renren.com/wiki/Authentication

   OAuth2.0的协议标准:http://oauth.net/2/

在android的浏览器应用中,经常会使用到webview。这里webview的概念网络上一大堆,这里直接复制网络上的描述:

WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页,实现WebView有以下两种不同的方法:
第一种方法的步骤:
1.在要Activity中实例化WebView组件:WebView webView = new WebView(this);
2.调用WebView的loadUrl()方法,设置WevView要显示的网页:
  互联网用:webView.loadUrl("http://www.google.com");
  本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets 文件中
3.调用Activity的setContentView( )方法来显示网页视图
4.用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
5.需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。
 

嘿嘿以上的描述说的挺清楚的了。

以下是webview开发的实例,获取人人的授权token的核心代码

 

   
   
   
   
  1. package com.xzw.token; 
  2.  
  3. import java.io.BufferedReader; 
  4. import java.io.IOException; 
  5. import java.io.InputStreamReader; 
  6.  
  7. import org.apache.http.HttpEntity; 
  8. import org.apache.http.HttpResponse; 
  9. import org.apache.http.client.ClientProtocolException; 
  10. import org.apache.http.client.HttpClient; 
  11. import org.apache.http.client.methods.HttpGet; 
  12. import org.apache.http.impl.client.DefaultHttpClient; 
  13. import org.json.JSONException; 
  14. import org.json.JSONObject; 
  15.  
  16. import android.app.Activity; 
  17. import android.app.AlertDialog; 
  18. import android.app.ProgressDialog; 
  19. import android.content.DialogInterface; 
  20. import android.graphics.Bitmap; 
  21. import android.os.Bundle; 
  22. import android.util.Log; 
  23. import android.view.Window; 
  24. import android.webkit.WebSettings; 
  25. import android.webkit.WebView; 
  26. import android.webkit.WebViewClient; 
  27. import android.widget.Toast; 
  28.  
  29. public class OAuthActivity extends Activity { 
  30.     private static final String TAG = "OAuthActivity"
  31.  
  32.     private static final String CLIENT_ID = "e2e5e39bf9ff4b5a8245735a94d50e86"// 应用的APPkey 
  33.     private static final String CLIENT_SECRET = "b6ba1f9fa8ff47889abe2e2d5928d6fd"//应用的appke secret 
  34.     private static final String REDIRECT_URL = "http://192.168.51.141"; // 重定向地址 
  35.     private static final String AUTHORIZE_URL = "https://graph.renren.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code"; // Oauth2认证地址 
  36.     private static final String ACCESS_TOKEN_URL = "https://graph.renren.com/oauth/token?grant_type=authorization_code&client_id=%s&redirect_uri=%s&client_secret=%s&code=%s"
  37.  
  38.     private WebView mLoginWebView; 
  39.     private ProgressDialog progressDialog; 
  40.     private AlertDialog alertDialog; 
  41.  
  42.     @Override 
  43.     public void onCreate(Bundle savedInstanceState) { 
  44.         super.onCreate(savedInstanceState); 
  45.         requestWindowFeature(Window.FEATURE_NO_TITLE); 
  46.         setContentView(R.layout.activity_main); 
  47.         initWebView();// 初始化webview 
  48.  
  49.     } 
  50.     /** 
  51.      * 初始化webview 
  52.      */ 
  53.     private void initWebView() { 
  54.  
  55.         mLoginWebView = (WebView) findViewById(R.id.loginView); 
  56.          
  57.         WebSettings settings = mLoginWebView.getSettings(); 
  58.         settings.setJavaScriptEnabled(true);//设置支持javascript 
  59.         settings.setSupportZoom(true);  // 
  60.         settings.setBuiltInZoomControls(true); //设置支持缩放 
  61.  
  62.         String url = String.format(AUTHORIZE_URL, new Object[] { CLIENT_ID, 
  63.                 REDIRECT_URL }); 
  64.  
  65.         // 加载网页 
  66.         mLoginWebView.loadUrl(url);   
  67.  
  68.         // 网页加载进度条 
  69.         progressDialog = ProgressDialog.show(thisnull"正在加载,请稍后..."); 
  70.         alertDialog = new AlertDialog.Builder(this).create(); //创建AlertDialog 
  71.  
  72.         mLoginWebView.setWebViewClient(new MyWebViewClient()); 
  73.  
  74.     } 
  75.  
  76.     class MyWebViewClient extends WebViewClient { 
  77.         /** 
  78.          * 拦截URL地址,进行业务操作 
  79.          */ 
  80.         @Override 
  81.         public boolean shouldOverrideUrlLoading(WebView view, String url) { 
  82.             Log.i(TAG, "-shouldOverrideUrlLoading--startwith-" + url); 
  83.             String callback_url = REDIRECT_URL + "/?"
  84.  
  85.             if (url.startsWith(callback_url)) { //匹配callback_url 
  86.                  
  87.                 Log.i(TAG, "-shouldOverrideUrlLoading--" + url); 
  88.                 String code = url.replace(callback_url + "code="""); 
  89.                 System.out.println("code=" + code); 
  90.                 String urlString = String.format(ACCESS_TOKEN_URL, 
  91.                         new Object[] { CLIENT_ID, REDIRECT_URL, CLIENT_SECRET, 
  92.                                 code }); 
  93.                 parseUrl(urlString); 
  94.                 return false
  95.             } else { 
  96.                 view.loadUrl(url); 
  97.                 return true
  98.             } 
  99.  
  100.         } 
  101.  
  102.         @Override 
  103.         public void onPageStarted(WebView view, String url, Bitmap favicon) { 
  104.             Log.i(TAG, "-onPageFinished-" + url); 
  105.             if (!progressDialog.isShowing()) { //网页开始加载时,显示进度条。 
  106.                 progressDialog.show(); 
  107.             } 
  108.  
  109.         } 
  110.  
  111.         @Override 
  112.         public void onPageFinished(WebView view, String url) { 
  113.             Log.i(TAG, "-onPageFinished-" + url); 
  114.             if (progressDialog.isShowing()) { // 加载完毕后,进度条不显示 
  115.                 progressDialog.dismiss(); 
  116.             } 
  117.  
  118.         } 
  119.  
  120.         @Override 
  121.         public void onReceivedError(WebView view, int errorCode, 
  122.                 String description, String failingUrl) { 
  123.  
  124.             Log.i(TAG, "-onReceivedError-" + failingUrl); 
  125.  
  126.             Toast.makeText(OAuthActivity.this"网页加载出错", Toast.LENGTH_LONG) 
  127.                     .show(); 
  128.             alertDialog.setTitle("Error"); 
  129.             alertDialog.setMessage(description); 
  130.             alertDialog.setButton("ok"new DialogInterface.OnClickListener() { 
  131.  
  132.                 @Override 
  133.                 public void onClick(DialogInterface dialog, int which) { 
  134.  
  135.                 } 
  136.             }); 
  137.             alertDialog.show(); 
  138.  
  139.         } 
  140.     } 
  141.     /** 
  142.      * URL解析 
  143.      * @param url 
  144.      */ 
  145.     private void parseUrl(String url){  
  146.         HttpClient client = new DefaultHttpClient(); 
  147.         HttpGet get = new HttpGet(url); 
  148.          
  149.         try { 
  150.             HttpResponse response = client.execute(get); 
  151.             HttpEntity entity = response.getEntity();  
  152.             BufferedReader buffReader = new BufferedReader(new InputStreamReader( 
  153.                     entity.getContent())); 
  154.             StringBuffer strBuff = new StringBuffer(); 
  155.             String result = null
  156.             while ((result = buffReader.readLine()) != null) { 
  157.                 strBuff.append(result); 
  158.             } 
  159.             System.out.println(strBuff.toString()); 
  160.             parseJson(strBuff.toString()); 
  161.         } catch (ClientProtocolException e) { 
  162.             // TODO Auto-generated catch block 
  163.             e.printStackTrace(); 
  164.         } catch (IOException e) { 
  165.             // TODO Auto-generated catch block 
  166.             e.printStackTrace(); 
  167.         } 
  168.     } 
  169.     /** 
  170.      * json解析 
  171.      * @param strJson 
  172.      */ 
  173.     private void parseJson(String strJson){ 
  174.         try { 
  175.             JSONObject json = new JSONObject(strJson); 
  176.             int expires_in = json.getInt("expires_in"); 
  177.             String refresh_token = json.getString("refresh_token"); 
  178.             String access_token = json.getString("access_token"); 
  179.             System.out.println("过期时间="+expires_in+" \naccess_token="+access_token); 
  180.         } catch (JSONException e) { 
  181.             // TODO Auto-generated catch block 
  182.             e.printStackTrace(); 
  183.         } 
  184.          
  185.  
  186.     } 
  187.  

看下效果图:

 

WebView实例开发之人人网Oauth2认证_第1张图片 WebView实例开发之人人网Oauth2认证_第2张图片 WebView实例开发之人人网Oauth2认证_第3张图片 WebView实例开发之人人网Oauth2认证_第4张图片

 

WebView实例开发之人人网Oauth2认证_第5张图片

 欢迎大家一起学习交流。源码已上传

weibo:http://weibo.com/xzw1989