使用WebView实现新浪微博Oauth2.0认证(android)

接上篇博文提到了

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 plain copy
  1. public void request(final Context context,   
  2.             final String url,   
  3.             final WeiboParameters params,   
  4.             final String httpMethod,   
  5.             final RequestListener listener){  
  6.         new Thread(){  
  7.             @Override public void run() {  
  8.                 try {  
  9.                     String resp = mWeibo.request(context, url, params, httpMethod, mWeibo.getAccessToken());  
  10.                     listener.onComplete(resp);  
  11.                 } catch (WeiboException e) {  
  12.                     listener.onError(e);  
  13.                 }  
  14.             }  
  15.         }.run();  
  16.           
  17.     }<span style="color:#000000;"></span>   

 尼玛直接run难怪会阻塞UI线程,改成start就OK了。

下面着重讲讲webview这个页面认证的实现原理

且看 WeiboWebViewClient 这个类

 

[java]  view plain copy
  1. private class WeiboWebViewClient extends WebViewClient {  
  2.   
  3.         @Override  
  4.         public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  5.             MyDebug.print("WeiboWebViewClient""shouldOverrideUrlLoading url = " + url);  
  6.             showProgress();  
  7.             view.loadUrl(url);  
  8.             return super.shouldOverrideUrlLoading(view, url);  
  9.         }  
  10.   
  11.         @Override  
  12.         public void onReceivedError(WebView view, int errorCode, String description,  
  13.                 String failingUrl) {  
  14.               
  15.             MyDebug.printErr("WeiboWebViewClient""onReceivedError failingUrl = " + failingUrl);  
  16.             super.onReceivedError(view, errorCode, description, failingUrl);  
  17.         }  
  18.   
  19.         @Override  
  20.         public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  21.               
  22.             MyDebug.print("WeiboWebViewClient""onPageStarted url = " + url + "\nthreadid = " +  
  23.                     Thread.currentThread().getId());  
  24.               
  25.             showProgress();  
  26.             if (url.startsWith(mWeiboManager.getRedictUrl())) {  
  27.                handleRedirectUrl(view, url, WebViewActivity.this);  
  28.                view.stopLoading();  
  29.                return;  
  30.             }  
  31.               
  32.             super.onPageStarted(view, url, favicon);  
  33.   
  34.         }  
  35.   
  36.         @Override  
  37.         public void onPageFinished(WebView view, String url) {  
  38.             MyDebug.print("WeiboWebViewClient""onPageFinished url = " + url);  
  39.             hideProgress();  
  40.             super.onPageFinished(view, url);  
  41.         }  
  42.           
  43.         private  boolean handleRedirectUrl(WebView view, String url, IWeiboClientListener listener)   
  44.         {  
  45.             Bundle values = Utility.parseUrl(url);  
  46.             String error = values.getString("error");  
  47.             String error_code = values.getString("error_code");  
  48.             
  49.   
  50.             MyDebug.print("handleRedirectUrl""error = " + error + "\n error_code = " + error_code);  
  51.             if (error == null && error_code == null)  
  52.             {  
  53.                 listener.onComplete(values);  
  54.             }else if (error.equals("access_denied"))  
  55.             {  
  56.                 listener.onCancel();  
  57.             }else{     
  58.                 WeiboException weiboException = new WeiboException(error, Integer.parseInt(error_code));  
  59.                 listener.onWeiboException(weiboException);  
  60.             }  
  61.               
  62.             return false;  
  63.         }  
  64.  }  

下面这个是关键:

[java]  view plain copy
  1. if (url.startsWith(mWeiboManager.getRedictUrl())) {  
  2.                    handleRedirectUrl(view, url, WebViewActivity.this);  
  3.                    view.stopLoading();  
  4.                    return;  
  5.                 }  
  6. <p> </p>  

 

也就是我们进入授权页面点击授权的时候,页面最终会去载入我们先前传入的URL回调地址(该回调地址作为前缀),此时我们只要从该URL里去解析我们想要的东西即可

如何解析URLsdk里有提供相应方法,即Utility.parseUrl(url);handleRedirectUrl里根据解析得到的结果调用监听器相应接口即可,我们再看看监听器onComplete里的实现

[java]  view plain copy
  1. public void onComplete(Bundle values) {  
  2.         // TODO Auto-generated method stub  
  3.               
  4.             CookieSyncManager.getInstance().sync();  
  5.           
  6.             String access_token = values.getString("access_token");  
  7.             String expires_in = values.getString("expires_in");  
  8.             String remind_in = values.getString("remind_in");  
  9.             String uid = values.getString("uid");  
  10.               
  11.             MyDebug.print("onComplete""access_token = " + access_token +   
  12.                                                 "\nexpires_in = " + expires_in);  
  13.   
  14.             AuthoSharePreference.putToken(this, access_token);  
  15.             AuthoSharePreference.putExpires(this, expires_in);  
  16.             AuthoSharePreference.putRemind(this, remind_in);            
  17.             AuthoSharePreference.putUid(this, uid);  
  18.                     
  19.             AccessToken accessToken = new AccessToken(access_token, WeiboConstParam.CONSUMER_SECRET);  
  20.             mWeiboManager.setAccessToaken(accessToken);         
  21.               
  22.             setResult(RESULT_OK);  
  23.             finish();  
  24.     }  
  25. <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 plain copy
  1. public interface WeiboConstParam {  
  2.   
  3.     String CONSUMER_KEY = "-----------";                                // appkey  
  4.       
  5.     String CONSUMER_SECRET = "------------";    // secret  
  6.       
  7.     String REDIRECT_URL = "---------------";                // url回调地址  
  8.       
  9. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值