您的位置:首页 > 移动开发

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

2014-05-19 17:49 537 查看
先看效果图:











相信开发过新浪、腾讯、豆瓣以及人人等微博的开发者都知道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的核心代码

001
package
com.xzw.token;
002
import
java.io.BufferedReader;
003
import
java.io.IOException;
004
import
java.io.InputStreamReader;
005
import
org.apache.http.HttpEntity;
006
import
org.apache.http.HttpResponse;
007
import
org.apache.http.client.ClientProtocolException;
008
import
org.apache.http.client.HttpClient;
009
import
org.apache.http.client.methods.HttpGet;
010
import
org.apache.http.impl.client.DefaultHttpClient;
011
import
org.json.JSONException;
012
import
org.json.JSONObject;
013
import
android.app.Activity;
014
import
android.app.AlertDialog;
015
import
android.app.ProgressDialog;
016
import
android.content.DialogInterface;
017
import
android.graphics.Bitmap;
018
import
android.os.Bundle;
019
import
android.util.Log;
020
import
android.view.Window;
021
import
android.webkit.WebSettings;
022
import
android.webkit.WebView;
023
import
android.webkit.WebViewClient;
024
import
android.widget.Toast;
025
026
027
public
class
OAuthActivity
extends
Activity {
028
private
static

final
String TAG =
"OAuthActivity"
;
029
 
private
static

final
String CLIENT_ID =

"e2e5e39bf9ff4b5a8245735a94d50e86"
;
// 应用的APPkey
030
private
static
final

String CLIENT_SECRET =
"b6ba1f9fa8ff47889abe2e2d5928d6fd"
;
//应用的appke secret
031
private
static
final

String REDIRECT_URL =
"<a href="
\"http:
//192.168.51.141/\"" target="\"_blank\"">http://192.168.51.141</a>";
// 重定向地址
032
private
static

final
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
private
static

final
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
private
WebView mLoginWebView;
036
 
private
ProgressDialog progressDialog;
037
 
private
AlertDialog alertDialog;
038
@Override
039
public
void

onCreate(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
private
void

initWebView() {
049
mLoginWebView = (WebView) findViewById(R.id.loginView);
050
 
WebSettings settings = mLoginWebView.getSettings();
051
 
settings.setJavaScriptEnabled(
true
);
//设置支持javascript
052
 
settings.setSupportZoom(
true
);
//
053
settings.setBuiltInZoomControls(
true
);
//设置支持缩放
054
String url = String.format(AUTHORIZE_URL,
new

Object[] {
055
CLIENT_ID, REDIRECT_URL });
056
 
// 加载网页
057
mLoginWebView.loadUrl(url);
058
// 网页加载进度条
059
progressDialog = ProgressDialog.show(
this
,
null
,
"正在加载,请稍后..."
);
060
alertDialog =
new

AlertDialog.Builder(
this
).create();
061
//创建AlertDialog
062
mLoginWebView.setWebViewClient(
new
MyWebViewClient());
063
}
064
065
class
MyWebViewClient
extends

WebViewClient {
066
/**
067
 
* 拦截URL地址,进行业务操作
068
 
*/
069
@Override
070
 
public
boolean

shouldOverrideUrlLoading(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
new
Object[] { CLIENT_ID, REDIRECT_URL, CLIENT_SECRET,code });
079
parseUrl(urlString);
080
return
false
;
081
}
else
{
082
view.loadUrl(url);
083
return
true
;
084
}
085
}

086
@Override
087
public
void

onPageStarted(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
public
void

onPageFinished(WebView view, String url) {
096
Log.i(TAG,
"-onPageFinished-"

+ url);
097
if
(progressDialog.isShowing()) {
098
// 加载完毕后,进度条不显示
099
progressDialog.dismiss();
100
}

101
}

102
@Override
103
public
void

onReceivedError(WebView view,
int

errorCode,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"
,
new

DialogInterface.OnClickListener() {
109
@Override
110
 
public
void

onClick(DialogInterface dialog,
int

which) { 
111
}
112
});
113
alertDialog.show();
114
}
115
}
116
/**
117
* URL解析
118
* @param url
119
*/
120
private
void
parseUrl=\'#\'" /span>
121
 
HttpClient client =
new

DefaultHttpClient();
122
HttpGet get =
new

HttpGet(url);
123
 
try
{
124
HttpResponse response = client.execute(get);
125
HttpEntity entity = response.getEntity();
126
 
BufferedReader buffReader =
new

BufferedReader(
new
InputStreamReader(entity.getContent()));
127
StringBuffer strBuff =
new

StringBuffer();
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
*/
144
private
void
parseJson(String strJson){
145
try
{
146
 
JSONObject json =
new

JSONObject(strJson);
147
int
expires_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
 
}}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐