WebView实例开发之人人网Oauth2认证

简介:

今天做了一个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错误。
  <uses-permission android:name="android.permission.INTERNET" />

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

以下是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.  

看下效果图:

 

  

 

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



本文转自xuzw13 51CTO博客,原文链接:http://blog.51cto.com/xuzhiwei/1031871,如需转载请自行联系原作者

相关文章
|
XML JavaScript 前端开发
鸿蒙开发(17)---WebView组件
鸿蒙开发(17)---WebView组件
861 0
鸿蒙开发(17)---WebView组件
|
9天前
|
Web App开发 数据采集 移动开发
开发uniapp过程中对app、微信小程序与h5的webview调试
开发uniapp过程中对app、微信小程序与h5的webview调试
19 1
|
9天前
|
移动开发 前端开发 JavaScript
移动端 Hybrid 开发:RN、Flutter与Webview的抉择与融合
【4月更文挑战第6天】本文对比了移动端Hybrid开发的三种主流方案——React Native (RN),Flutter和Webview。RN基于JavaScript,适合React熟练的团队,适用于性能要求高、跨平台的中大型应用。Flutter,使用Dart语言,以其高性能和自定义UI适用于追求极致体验的项目。Webview适合快速移植Web应用至移动端,开发成本低但性能受限。选择时要考虑项目规模、性能需求、团队技术栈等因素,实际应用中常采用混合策略,如RN/Flutter+Webview、原生模块集成等,以实现最佳开发效果和长期技术规划。
92 0
|
9天前
|
JavaScript 前端开发 Android开发
android开发,使用kotlin学习WebView(详细)
android开发,使用kotlin学习WebView(详细)
203 0
|
Web App开发 XML 移动开发
【Android】WebView 开发遇到的问题小结
【Android】WebView 开发遇到的问题小结
548 0
【Android】WebView 开发遇到的问题小结
|
Web App开发 XML 移动开发
Hybrid App 应用 开发中 9 个必备知识点复习(WebView / 调试 等) 下
Hybrid App 应用 开发中 9 个必备知识点复习(WebView / 调试 等) 下
462 0
|
存储 移动开发 缓存
Hybrid App 应用 开发中 9 个必备知识点复习(WebView / 调试 等) 上
Hybrid App 应用 开发中 9 个必备知识点复习(WebView / 调试 等) 上
326 0
|
移动开发 前端开发 JavaScript
鸿蒙-webview的使用和JS交互(附源码)【鸿蒙开发04】
日常我们在开发项目时,为了项目快速的开发和迭代,难免会用到H5页面。使用鸿蒙进行项目开发时,也一样免不了要加载H5页面,在移动开发中打开H5页面需要使用WebView组件。同时,为了和H5页面进行数据交换,有时候还需要借助JSBridge来实现客户端与H5之间的通讯。 日常我们在开发项目时,为了项目快速的开发和迭代,难免会用到H5页面。使用鸿蒙进行项目开发时,也一样免不了要加载H5页面,在移动开发中打开H5页面需要使用WebView组件。同时,为了和H5页面进行数据交换,有时候还需要借助JSBridge来实现客户端与H5之间的通讯。 那么鸿蒙之中用到的技术是什么呢?WebView 在此之前,
799 0
|
JavaScript 前端开发 Android开发
Android开发学习笔记:浅谈WebView
Android开发学习笔记:浅谈WebView
Android开发学习笔记:浅谈WebView
xal
|
Web App开发 JavaScript API
VSCode插件开发全攻略(七)WebView
更多文章请戳[VSCode插件开发全攻略系列目录导航](https://www.atatech.org/articles/121864)。 # 什么是Webview 大家都知道,整个VSCode编辑器就是一张大的网页,其实,我们还可以在`Visual Studio Code`中创建完全自定义的、可以间接和`nodejs`通信的特殊网页(通过一个`acquireVsCodeApi`特殊方
xal
3779 0