weiciyuan新浪微博webview授权解析
2015-07-25 18:32
246 查看
webview是用来展现web页面的一个视图。在Activity中,我们可以用它来显示一些本地或在线的web界面。
1、在layout布局文件中定义一个webview
2、使用loadUrl(),加载网页
一旦使能之后,你也可以自己创建接口在你的应用和JavaScript代码间进行交互。
可以通过getSettings()获得WebSettings,然后用setJavaScriptEnabled()使能JavaScript:
此时就OK了, 就可以在你的WebView中打开链接了。
另外还有其他一些可重写的方法
1,接收到Http请求的事件
onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
2,打开链接前的事件
public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; }
这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
3,载入页面完成的事件
public void onPageFinished(WebView view, String url){ }
同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切换程序动作。
4,载入页面开始的事件
public void onPageStarted(WebView view, String url, Bitmap favicon) { }
这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
首先,在Activity的oncreate方法中,通过findViewById找到了对应的webview,给他设置了webclient,然后通过WebSettings给它做了一些设置。之后,当Activity加载后,或者用户点击actionbar上面的刷新按钮后,都会调用一个叫做refresh的函数,代码如下:
其中getWeiboOAuthUrl()返回的是一个地址,这个没有什么难度,读者可以自己去读读代码。接下来比较重要的地方就是WeiboWebViewClient,这个类与微博授权息息相关,需要好好研究。
首先看看onPageFinished,这个方法比较简单,就是看看页面加载完了以后,这个页面的URL如果不是”about:blank”,如果不是就停止actionbar上面刷新按钮的动画。
接着看看onReceivedError,这个方法也很简单,就是在加载页面出错时,显示一个SinaWeiboErrorDialog的Dialog。
最后是非常重要的onPageStarted。我们通过新浪微博授权,会经过三个界面的跳转。
第一个界面的URL是:getWeiboOAuthUrl返回的字符串。
第二个界面的URL是:https://api.weibo.com/oauth2/authorize。
第三个界面的URL是:https://api.weibo.com/oauth2/default.html#access_token=XXXXXXXX&remind_in=XXXX&expires_in=XXXX&uid=XXXXX。
其中第三个URL里面有我们需要的各种信息,再看看onPageStarted,
就是检查URL是不是第三个界面的,如果是的就调用handleRedirectUrl函数。handleRedirectUrl做的主要事情就是将access_token和expires_in等等之类有用的信息存在本地。
最后,文章写得不是很好,读者可以在下方留言,指出其中的不足,我再改进一下。
webview基本用法
使用webview可以按照下面几个简单的步骤。1、在layout布局文件中定义一个webview
<?xml version="1.0" encoding="utf-8"?> <WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/webView" android:layout_width="fill_parent" android:layout_height="fill_parent" />
2、使用loadUrl(),加载网页
WebView myWebView = (WebView) findViewById(R.id.webView); myWebView.loadUrl("http://www.baidu.com");
在WebView中使用JavaScript
如果你想要载入的页面中用了JavaScript,你必须为你的WebView使能JavaScript。一旦使能之后,你也可以自己创建接口在你的应用和JavaScript代码间进行交互。
可以通过getSettings()获得WebSettings,然后用setJavaScriptEnabled()使能JavaScript:
WebView myWebView = (WebView) findViewById(R.id.webView); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true);
处理页面浏览
当用户点击了你的WebView中的一个链接,默认的行为是Android启动一个处理URL的应用,通常,默认的浏览器打开并下载目标URL。但是,你可以在你的WebView中覆盖这一行为,使得连接仍在你的WebView中打开。之后,根据在WebView中维护的网页浏览历史,你可以允许用户向前或向后浏览他们的网页。在WebView中打开所有链接
要打开用户点击的链接,只需要用setWebViewClient()方法向你的WebView提供一个WebViewClient 比如:WebView myWebView = (WebView) findViewById(R.id.webView); myWebView.setWebViewClient(new WebViewClient());
此时就OK了, 就可以在你的WebView中打开链接了。
关于打开链接位置的更多控制
如果你对在哪里打开链接需要更多的控制,你可以创建自己的类,继承 WebViewClient,然后覆写shouldOverrideUrlLoading() 方法。比如:private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if(Uri.parse(url).getHost().equals(www.baidu.com)) { // 记录用户访问百度的频率 frequence++; // frequence为一个全局变量 } view.loadUrl(url); return true; } }
另外还有其他一些可重写的方法
1,接收到Http请求的事件
onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
2,打开链接前的事件
public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; }
这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
3,载入页面完成的事件
public void onPageFinished(WebView view, String url){ }
同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切换程序动作。
4,载入页面开始的事件
public void onPageStarted(WebView view, String url, Bitmap favicon) { }
这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
weiciyuan新浪微博webview授权解析
weiciyuan中sina微博授权的Activity是OAuthActivity,看看这个Activity的代码:@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.oauthactivity_layout); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(false); // 授权, menu在actionbar中 actionBar.setTitle(getString(R.string.login)); webView = (WebView) findViewById(R.id.webView); webView.setWebViewClient(new WeiboWebViewClient()); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setSaveFormData(false); settings.setSavePassword(false); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); settings.setRenderPriority(WebSettings.RenderPriority.HIGH); CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.removeAllCookie(); }
首先,在Activity的oncreate方法中,通过findViewById找到了对应的webview,给他设置了webclient,然后通过WebSettings给它做了一些设置。之后,当Activity加载后,或者用户点击actionbar上面的刷新按钮后,都会调用一个叫做refresh的函数,代码如下:
public void refresh() { webView.clearView(); webView.loadUrl("about:blank"); // actionbar上面刷新按钮旋转的动画 LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE); ImageView iv = (ImageView) inflater.inflate(R.layout.refresh_action_view, null); Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh); iv.startAnimation(rotation); refreshItem.setActionView(iv); // 加载微博授权首界面 webView.loadUrl(getWeiboOAuthUrl()); }
其中getWeiboOAuthUrl()返回的是一个地址,这个没有什么难度,读者可以自己去读读代码。接下来比较重要的地方就是WeiboWebViewClient,这个类与微博授权息息相关,需要好好研究。
WeiboWebViewClient
该类的代码如下:private class WeiboWebViewClient extends WebViewClient { // url is "https://api.weibo.com/oauth2/default.html# // access_token=2.00iUsKhCZNmGKBa04d767c3aZiSP1B& // remind_in=204602&expires_in=204602&uid=2470240872" [url3] @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } // url1: sina // url2: https://api.weibo.com/oauth2/authorize // url3: token @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if (url.startsWith(URLHelper.DIRECT_URL)) { handleRedirectUrl(view, url); view.stopLoading(); return; } super.onPageStarted(view, url, favicon); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); new SinaWeiboErrorDialog().show(getSupportFragmentManager(), ""); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (!url.equals("about:blank")) { completeRefresh(); } } }
首先看看onPageFinished,这个方法比较简单,就是看看页面加载完了以后,这个页面的URL如果不是”about:blank”,如果不是就停止actionbar上面刷新按钮的动画。
接着看看onReceivedError,这个方法也很简单,就是在加载页面出错时,显示一个SinaWeiboErrorDialog的Dialog。
最后是非常重要的onPageStarted。我们通过新浪微博授权,会经过三个界面的跳转。
第一个界面的URL是:getWeiboOAuthUrl返回的字符串。
第二个界面的URL是:https://api.weibo.com/oauth2/authorize。
第三个界面的URL是:https://api.weibo.com/oauth2/default.html#access_token=XXXXXXXX&remind_in=XXXX&expires_in=XXXX&uid=XXXXX。
其中第三个URL里面有我们需要的各种信息,再看看onPageStarted,
url.startsWith(URLHelper.DIRECT_URL)
就是检查URL是不是第三个界面的,如果是的就调用handleRedirectUrl函数。handleRedirectUrl做的主要事情就是将access_token和expires_in等等之类有用的信息存在本地。
结束
到这里,weiciyuan新浪微博webview授权就讲解完了。总结一下,其实过程还是比较简单的,读者如果断点调试,仔细看看每个URL的值,一步一步看看程序是如何处理这些URL的,那么一切也都明白了。最后,文章写得不是很好,读者可以在下方留言,指出其中的不足,我再改进一下。
相关文章推荐
- Objective-C中的@property和@synthesize用法
- [WebView其中一项研究]:Web Apps基本介绍
- Android中ListView使用
- android studio删除module
- 解决Android代码中遇到高版本API的错误提示
- Android 01:AutoCompleteTextView-简单实现实现自动输入文本效果
- [Unity3D]Unity3D圣骑士当游戏开发商遭遇Mecanim动画系统
- Android.9图片评论(一个)
- 2015 Multi-University Training Contest 2 hdu 5303 Delicious Apples
- Android的四种启动模式
- VS2015 use C# for iOS
- 《慕客网:IOS动画案例之会跳动的登入界面(下)》学习笔记 -Sketch的使用
- Android开发之使用AsyncTask实现实时翻译
- x-apple-amd-action_message错误 苹果客服提供的解决办法,亲测有效
- android中设置ListView的选中的Item的背景颜色
- Android模拟器运行缓慢解决办法
- 在Fragment中重写返回键以及WebView加载重定向页面返回问题
- 关于context和getapplicationcontext
- iOS界面生命周期过程详解
- Android HandlerThread、Looper、Handler 知识点梳理