使用WebView实现新浪微博Oauth2.0认证(android)
2013-09-12 15:00
253 查看
接上篇博文提到了
android新浪微博Oauth2.0认证以及登录
http://blog.csdn.net/geniuseoe2012/article/details/7727564
也提到了写SDK的这家伙很坑爹的把界面元素也添到了SDK里面
而我们则希望SDK提供的是纯接口的东东
之前看到网上不少关于webview实现新浪微博认证,思路都是通过WebView显示的html代码然后从中提取出授权码,不过那样界面会跳转到授权码显示页面,界面看起来不是很和谐,而我们直接使用SDK里的那种方式就可以很方便的实现我们想要的效果
为此在下特意研究了下SDK里认证界面的具体实现,然后将其中的代码提取出来,仿其实现方式用我们自己的webview来实现微博的认证过程,这样我们就不必再依赖SDK工程而可以直接将SRC打成jar包导入了,下面先看工程目录图:
Com.weibo.net这个包就是把SDK里的代码copy过来,然后把一些不相干的类给干掉了,同时屏蔽掉一些接口,本例没有把它们打成jar包,为的是方便大家看到源码
同时SDK里的源码有个小错误:
就是AsyncWeiboRunner类下的request方法
[java] view
plaincopy
public void request(final Context context,
final String url,
final WeiboParameters params,
final String httpMethod,
final RequestListener listener){
new Thread(){
@Override public void run() {
try {
String resp = mWeibo.request(context, url, params, httpMethod, mWeibo.getAccessToken());
listener.onComplete(resp);
} catch (WeiboException e) {
listener.onError(e);
}
}
}.run();
}<span style="color:#000000;"></span>
尼玛直接run难怪会阻塞UI线程,改成start就OK了。
下面着重讲讲webview这个页面认证的实现原理
且看 WeiboWebViewClient 这个类
[java] view
plaincopy
private class WeiboWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
MyDebug.print("WeiboWebViewClient", "shouldOverrideUrlLoading url = " + url);
showProgress();
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description,
String failingUrl) {
MyDebug.printErr("WeiboWebViewClient", "onReceivedError failingUrl = " + failingUrl);
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
MyDebug.print("WeiboWebViewClient", "onPageStarted url = " + url + "\nthreadid = " +
Thread.currentThread().getId());
showProgress();
if (url.startsWith(mWeiboManager.getRedictUrl())) {
handleRedirectUrl(view, url, WebViewActivity.this);
view.stopLoading();
return;
}
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
MyDebug.print("WeiboWebViewClient", "onPageFinished url = " + url);
hideProgress();
super.onPageFinished(view, url);
}
private boolean handleRedirectUrl(WebView view, String url, IWeiboClientListener listener)
{
Bundle values = Utility.parseUrl(url);
String error = values.getString("error");
String error_code = values.getString("error_code");
MyDebug.print("handleRedirectUrl", "error = " + error + "\n error_code = " + error_code);
if (error == null && error_code == null)
{
listener.onComplete(values);
}else if (error.equals("access_denied"))
{
listener.onCancel();
}else{
WeiboException weiboException = new WeiboException(error, Integer.parseInt(error_code));
listener.onWeiboException(weiboException);
}
return false;
}
}
下面这个是关键:
[java] view
plaincopy
if (url.startsWith(mWeiboManager.getRedictUrl())) {
handleRedirectUrl(view, url, WebViewActivity.this);
view.stopLoading();
return;
}
<p> </p>
也就是我们进入授权页面点击授权的时候,页面最终会去载入我们先前传入的URL回调地址(该回调地址作为前缀),此时我们只要从该URL里去解析我们想要的东西即可
如何解析URL在sdk里有提供相应方法,即Utility.parseUrl(url);在handleRedirectUrl里根据解析得到的结果调用监听器相应接口即可,我们再看看监听器onComplete里的实现
[java] view
plaincopy
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
CookieSyncManager.getInstance().sync();
String access_token = values.getString("access_token");
String expires_in = values.getString("expires_in");
String remind_in = values.getString("remind_in");
String uid = values.getString("uid");
MyDebug.print("onComplete", "access_token = " + access_token +
"\nexpires_in = " + expires_in);
AuthoSharePreference.putToken(this, access_token);
AuthoSharePreference.putExpires(this, expires_in);
AuthoSharePreference.putRemind(this, remind_in);
AuthoSharePreference.putUid(this, uid);
AccessToken accessToken = new AccessToken(access_token, WeiboConstParam.CONSUMER_SECRET);
mWeiboManager.setAccessToaken(accessToken);
setResult(RESULT_OK);
finish();
}
<p><span style="color:#000000;BACKGROUND: rgb(255,255,255)"></span> </p>
怎么样,是不是跟官方的那个例子很接近了,拿到access_token我们就可以为所欲为了
截图就不贴了,跟前篇博文的效果差不多,只不过认证页面放在了activity里而不在一个dialog而已
下面附上源码工程:
http://download.csdn.net/detail/geniuseoe2012/4441971
老规矩,WeiboConstParam.java里的key值等等参数修改成自己的值就可以了
[java] view
plaincopy
public interface WeiboConstParam {
String CONSUMER_KEY = "-----------"; // appkey
String CONSUMER_SECRET = "------------"; // secret
String REDIRECT_URL = "---------------"; // url回调地址
}
android新浪微博Oauth2.0认证以及登录
http://blog.csdn.net/geniuseoe2012/article/details/7727564
也提到了写SDK的这家伙很坑爹的把界面元素也添到了SDK里面
而我们则希望SDK提供的是纯接口的东东
之前看到网上不少关于webview实现新浪微博认证,思路都是通过WebView显示的html代码然后从中提取出授权码,不过那样界面会跳转到授权码显示页面,界面看起来不是很和谐,而我们直接使用SDK里的那种方式就可以很方便的实现我们想要的效果
为此在下特意研究了下SDK里认证界面的具体实现,然后将其中的代码提取出来,仿其实现方式用我们自己的webview来实现微博的认证过程,这样我们就不必再依赖SDK工程而可以直接将SRC打成jar包导入了,下面先看工程目录图:
Com.weibo.net这个包就是把SDK里的代码copy过来,然后把一些不相干的类给干掉了,同时屏蔽掉一些接口,本例没有把它们打成jar包,为的是方便大家看到源码
同时SDK里的源码有个小错误:
就是AsyncWeiboRunner类下的request方法
[java] view
plaincopy
public void request(final Context context,
final String url,
final WeiboParameters params,
final String httpMethod,
final RequestListener listener){
new Thread(){
@Override public void run() {
try {
String resp = mWeibo.request(context, url, params, httpMethod, mWeibo.getAccessToken());
listener.onComplete(resp);
} catch (WeiboException e) {
listener.onError(e);
}
}
}.run();
}<span style="color:#000000;"></span>
尼玛直接run难怪会阻塞UI线程,改成start就OK了。
下面着重讲讲webview这个页面认证的实现原理
且看 WeiboWebViewClient 这个类
[java] view
plaincopy
private class WeiboWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
MyDebug.print("WeiboWebViewClient", "shouldOverrideUrlLoading url = " + url);
showProgress();
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description,
String failingUrl) {
MyDebug.printErr("WeiboWebViewClient", "onReceivedError failingUrl = " + failingUrl);
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
MyDebug.print("WeiboWebViewClient", "onPageStarted url = " + url + "\nthreadid = " +
Thread.currentThread().getId());
showProgress();
if (url.startsWith(mWeiboManager.getRedictUrl())) {
handleRedirectUrl(view, url, WebViewActivity.this);
view.stopLoading();
return;
}
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
MyDebug.print("WeiboWebViewClient", "onPageFinished url = " + url);
hideProgress();
super.onPageFinished(view, url);
}
private boolean handleRedirectUrl(WebView view, String url, IWeiboClientListener listener)
{
Bundle values = Utility.parseUrl(url);
String error = values.getString("error");
String error_code = values.getString("error_code");
MyDebug.print("handleRedirectUrl", "error = " + error + "\n error_code = " + error_code);
if (error == null && error_code == null)
{
listener.onComplete(values);
}else if (error.equals("access_denied"))
{
listener.onCancel();
}else{
WeiboException weiboException = new WeiboException(error, Integer.parseInt(error_code));
listener.onWeiboException(weiboException);
}
return false;
}
}
下面这个是关键:
[java] view
plaincopy
if (url.startsWith(mWeiboManager.getRedictUrl())) {
handleRedirectUrl(view, url, WebViewActivity.this);
view.stopLoading();
return;
}
<p> </p>
也就是我们进入授权页面点击授权的时候,页面最终会去载入我们先前传入的URL回调地址(该回调地址作为前缀),此时我们只要从该URL里去解析我们想要的东西即可
如何解析URL在sdk里有提供相应方法,即Utility.parseUrl(url);在handleRedirectUrl里根据解析得到的结果调用监听器相应接口即可,我们再看看监听器onComplete里的实现
[java] view
plaincopy
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
CookieSyncManager.getInstance().sync();
String access_token = values.getString("access_token");
String expires_in = values.getString("expires_in");
String remind_in = values.getString("remind_in");
String uid = values.getString("uid");
MyDebug.print("onComplete", "access_token = " + access_token +
"\nexpires_in = " + expires_in);
AuthoSharePreference.putToken(this, access_token);
AuthoSharePreference.putExpires(this, expires_in);
AuthoSharePreference.putRemind(this, remind_in);
AuthoSharePreference.putUid(this, uid);
AccessToken accessToken = new AccessToken(access_token, WeiboConstParam.CONSUMER_SECRET);
mWeiboManager.setAccessToaken(accessToken);
setResult(RESULT_OK);
finish();
}
<p><span style="color:#000000;BACKGROUND: rgb(255,255,255)"></span> </p>
怎么样,是不是跟官方的那个例子很接近了,拿到access_token我们就可以为所欲为了
截图就不贴了,跟前篇博文的效果差不多,只不过认证页面放在了activity里而不在一个dialog而已
下面附上源码工程:
http://download.csdn.net/detail/geniuseoe2012/4441971
老规矩,WeiboConstParam.java里的key值等等参数修改成自己的值就可以了
[java] view
plaincopy
public interface WeiboConstParam {
String CONSUMER_KEY = "-----------"; // appkey
String CONSUMER_SECRET = "------------"; // secret
String REDIRECT_URL = "---------------"; // url回调地址
}
相关文章推荐
- 使用WebView实现新浪微博Oauth2.0认证(android)
- Android SwipeRefreshLayout结合WebView使用实现以及可能遇到的问题
- Android使用WebView实现截图分享功能
- Android中使用WebSocket实现群聊和消息推送功能(不使用WebView)
- Android使用Webview播放Swf文件,实现与Flash数据交互
- Android使用webview控件加载本地html,通过Js与后台Java实现数据的传递
- android 使用webView加载欢迎界面的个人实现思路,实现欢迎界面不断在改变
- Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)
- Android使用WebView实现图片点击的监听
- Android WebView的简单使用,实现标题、加载进度提示
- Android新浪微博-项目整理总结 二[使用WebView获取OAuth验证码]
- Android中WebView使用html,且实现android和JS的互相调用
- Android中WebView使用6,js调java实现播放视频
- Android使用内置WebView打开TextView超链接的实现方法
- Android编程使用WebView实现文件下载功能的两种方法
- 关于android webview 端调原生app 的支付宝接口实现 还有BeeCloud(秒支付) 的接入使用
- Android使用WebView实现文件下载功能
- Android端使用WebView注入一段js代码实现js调用android
- Android 浏览器 —— 使用 WebView 实现文件下载
- 使用 android-Ultra-Pull-To-Refresh 实现 WebView 下拉刷新