WebView实例开发之人人网Oauth2认证(含URL解析,json解析)

来源:互联网 发布:怎么投诉淘宝客服人员 编辑:程序博客网 时间:2024/05/01 15:20
先看效果图:
   

   


相信开发过新浪、腾讯、豆瓣以及人人等微博的开发者都知道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的核心代码
001package com.xzw.token;
002import java.io.BufferedReader;
003import java.io.IOException;
004import java.io.InputStreamReader;
005import org.apache.http.HttpEntity;
006import org.apache.http.HttpResponse;
007import org.apache.http.client.ClientProtocolException;
008import org.apache.http.client.HttpClient;
009import org.apache.http.client.methods.HttpGet;
010import org.apache.http.impl.client.DefaultHttpClient;
011import org.json.JSONException;
012import org.json.JSONObject;
013import android.app.Activity;
014import android.app.AlertDialog;
015import android.app.ProgressDialog;
016import android.content.DialogInterface;
017import android.graphics.Bitmap;
018import android.os.Bundle;
019import android.util.Log;
020import android.view.Window;
021import android.webkit.WebSettings;
022import android.webkit.WebView;
023import android.webkit.WebViewClient;
024import android.widget.Toast;
025 
026 
027public classOAuthActivityextends Activity {  
028   privatestaticfinal String TAG = "OAuthActivity";  
029    privatestaticfinal String CLIENT_ID = "e2e5e39bf9ff4b5a8245735a94d50e86";// 应用的APPkey   
030private staticfinalString CLIENT_SECRET = "b6ba1f9fa8ff47889abe2e2d5928d6fd";//应用的appke secret   
031private staticfinalString REDIRECT_URL = "<a href="\"http://192.168.51.141/\"" target="\"_blank\"">http://192.168.51.141</a>"; // 重定向地址  
032   privatestaticfinal String AUTHORIZE_URL = "<a href="\"https://graph.renren.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code\"" target="\"_blank\"">https://graph.renren.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code</a>";
033// Oauth2认证地址   
034  privatestaticfinal String ACCESS_TOKEN_URL = "<a href="\"https://graph.renren.com/oauth/token?grant_type=authorization_code&client_id=%s&redirect_uri=%s&client_secret=%s&code=%s\"" target="\"_blank\"">https://graph.renren.com/oauth/token?grant_type=authorization_code&client_id=%s&redirect_uri=%s&client_secret=%s&code=%s</a>";
035      privateWebView mLoginWebView;
036    privateProgressDialog progressDialog;
037    privateAlertDialog alertDialog;
038     @Override   
039  publicvoidonCreate(Bundle savedInstanceState) {  
040       super.onCreate(savedInstanceState);  
041       requestWindowFeature(Window.FEATURE_NO_TITLE);   
042     setContentView(R.layout.activity_main);     
043    initWebView();// 初始化webview  
044    }   
045/**     
046* 初始化webview  
047    */   
048  privatevoidinitWebView() {
049         mLoginWebView = (WebView) findViewById(R.id.loginView);           
050       WebSettings settings = mLoginWebView.getSettings();     
051    settings.setJavaScriptEnabled(true);//设置支持javascript     
052    settings.setSupportZoom(true);  //   
053settings.setBuiltInZoomControls(true);//设置支持缩放         
054String url = String.format(AUTHORIZE_URL,newObject[] {
055CLIENT_ID,    REDIRECT_URL });      
056    // 加载网页   
057      mLoginWebView.loadUrl(url);      
058      // 网页加载进度条        
059progressDialog = ProgressDialog.show(this,null,"正在加载,请稍后...");      
060   alertDialog =newAlertDialog.Builder(this).create();
061//创建AlertDialog        
062  mLoginWebView.setWebViewClient(newMyWebViewClient());   
063   }     
064 
065class MyWebViewClientextendsWebViewClient {   
066     /**      
067    * 拦截URL地址,进行业务操作   
068       */      
069   @Override     
070    publicbooleanshouldOverrideUrlLoading(WebView view, String url) {             Log.i(TAG,"-shouldOverrideUrlLoading--startwith-"+ url);   
071          String callback_url = REDIRECT_URL +"/?";      
072        if(url.startsWith(callback_url)) {
073//匹配callback_url                        
074         Log.i(TAG,"-shouldOverrideUrlLoading--"+ url);      
075           String code = url.replace(callback_url +"code=","");              
076   System.out.println("code="+ code);           
077      String urlString = String.format(ACCESS_TOKEN_URL,      
078                  newObject[] { CLIENT_ID, REDIRECT_URL, CLIENT_SECRET,     code });     
079            parseUrl(urlString);     
080            returnfalse;           
081  } else{               
082view.loadUrl(url);        
083         returntrue;      
084      }        
085  }      
086   @Override      
087   publicvoidonPageStarted(WebView view, String url, Bitmap favicon) {         
088   Log.i(TAG,"-onPageFinished-"+ url);      
089       if(!progressDialog.isShowing()) {
090//网页开始加载时,显示进度条。   
091              progressDialog.show();     
092        }        
093  }        
094  @Override      
095   publicvoidonPageFinished(WebView view, String url) {     
096        Log.i(TAG,"-onPageFinished-"+ url);   
097         if(progressDialog.isShowing()) {
098// 加载完毕后,进度条不显示              
099   progressDialog.dismiss();         
100   }      
101   }   
102      @Override   
103     publicvoidonReceivedError(WebView view,interrorCode,   String description, String failingUrl) {      
104       Log.i(TAG,"-onReceivedError-"+ failingUrl);  
105            Toast.makeText(OAuthActivity.this,"网页加载出错", Toast.LENGTH_LONG).show();         
106    alertDialog.setTitle("Error");   
107          alertDialog.setMessage(description);      
108      alertDialog.setButton("ok",newDialogInterface.OnClickListener() {   
109               @Override            
110    publicvoidonClick(DialogInterface dialog,intwhich) {   
111              }     
112        });         
113   alertDialog.show();      
114   }  
115   }  
116   /**   
117  * URL解析   
118  * @param url   
119  */   
120private voidparseUrl=\'#\'" /span>   
121    HttpClient client =newDefaultHttpClient();
122        HttpGet get =newHttpGet(url);        
123          try{            
124HttpResponse response = client.execute(get);     
125        HttpEntity entity = response.getEntity();      
126       BufferedReader buffReader =newBufferedReader(newInputStreamReader(                     entity.getContent()));         
127   StringBuffer strBuff =newStringBuffer();      
128       String result =null;         
129    while((result = buffReader.readLine()) !=null) {      
130          strBuff.append(result);         
131   }             System.out.println(strBuff.toString());   
132          parseJson(strBuff.toString());      
133   } catch(ClientProtocolException e) {      
134       // TODO Auto-generated catch block      
135      e.printStackTrace();      
136  } catch(IOException e) {      
137      // TODO Auto-generated catch block        
138     e.printStackTrace();      
139   }     }   
140/**   
141  * json解析  
142    * @param strJson   
143   */   
144private voidparseJson(String strJson){   
145      try{         
146    JSONObject json =newJSONObject(strJson);     
147        intexpires_in = json.getInt("expires_in");  
148           String refresh_token = json.getString("refresh_token");   
149          String access_token = json.getString("access_token");        
150     System.out.println("过期时间="+expires_in+" \naccess_token="+access_token);   
151     } catch (JSONException e) {         
152   // TODO Auto-generated catch block      
153       e.printStackTrace();      
154  }         
155       } }
0 0
原创粉丝点击