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

weiciyuan新浪微博webview授权解析

2015-07-25 18:32 246 查看
webview是用来展现web页面的一个视图。在Activity中,我们可以用它来显示一些本地或在线的web界面。

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的,那么一切也都明白了。

最后,文章写得不是很好,读者可以在下方留言,指出其中的不足,我再改进一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: