weiciyuan新浪微博webview授权解析

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的,那么一切也都明白了。
最后,文章写得不是很好,读者可以在下方留言,指出其中的不足,我再改进一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值