关闭

Android WebView 内处理302重定向

标签: webview重定向
3114人阅读 评论(1) 收藏 举报
分类:

核心思想:通过记录访问历史url,在返回时候对url进行过滤出来。

public class NewsDetailActivity extends AppCompatActivity{
    private WebViewWithProgress myWebViewWithProgress;
    private WebView myWebView;
    private String newsDetailURL;

    /**
     * 记录URL的栈
     * 规则:
     * 1.不可在{@code WebView.onPageFinished();}中开始记录URL
     * 2.记录需要屏蔽重定向URL
     * */
    private final Stack<String> mUrls=new Stack<>();
    /**
     * 判断页面是否加载完成
     * */
    private boolean mIsloading=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news_detail);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }

        Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar);
        setSupportActionBar(toolbar);
        // Show the Up button in the action bar.
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

        // 查找浏览器控件ID
        myWebViewWithProgress = (WebViewWithProgress) findViewById(R.id.MyWebViewContent);

        //获取浏览器
        myWebView = myWebViewWithProgress.getWebView();

        // 设置页面支持JavaScript
        myWebView.getSettings().setJavaScriptEnabled(true);

        //缩放开关
        //设置此属性,仅支持双击缩放,不支持触摸缩放(android4.0)
        myWebView.getSettings().setSupportZoom(true);
        // 设置是否可缩放
        myWebView.getSettings().setBuiltInZoomControls(true);
        //将图片调整到适合WebView的大小
        myWebView.getSettings().setUseWideViewPort(true);
        myWebView.getSettings().setDomStorageEnabled(true);
        myWebView.getSettings().setUseWideViewPort(true);

        myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        //设置图片自动加载
        myWebView.getSettings().setLoadsImagesAutomatically(true);

        newsDetailURL = getIntent().getStringExtra("newsDetailURL");


        // 设置WebView监听事件
        myWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                if(mIsloading &&mUrls.size()>0)
                {
                    mUrls.pop();
                }
                recordUrl(url);
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.v("FairyDebug", "URL加载完毕" + url);
                super.onPageFinished(view, url);
                if(mIsloading|| url.startsWith("about:"))
                {
                    mIsloading=false;
                }
            }


        });

        Log.v("FairyDebug","--------get---------------"+newsDetailURL);
        // 加载URL
        myWebView.loadUrl(newsDetailURL);


    }
    /**
     * 记录非重定向链接 避免刷新页面造成的重复入栈*/
    private void recordUrl(String url)
    {
        //这里还可以根据自身业务来屏蔽一些链接放入URL栈
        if(!TextUtils.isEmpty(url)&& !url.equalsIgnoreCase(getLastPageUrl())){
            mUrls.push(url);
        }
    }

    /**获取上一页的链接*/
    private synchronized  String getLastPageUrl(){
        return mUrls.size()>0 ? mUrls.peek():null;
    }

    /**推出上一页链接*/
    public String popLastPageUrl(){
        if(mUrls.size()>=2)
        {
            mUrls.pop();// pop current page url
            return mUrls.pop();
        }
        return  null;
    }

}

后话:

若没有设置 WebViewClient 则在点击链接之后由系统处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。
若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理。
若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。

2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android WebView 内处理302重定向

核心思想:通过记录访问历史url,在返回时候对url进行过滤出来。 public class NewsDetailActivity extends AppCompatActivity{ pri...
  • tyk9999tyk
  • tyk9999tyk
  • 2017-04-20 10:28
  • 797

Android WebView 内处理302重定向

解决webView 无法加载带有重定向的URL
  • hadues
  • hadues
  • 2016-03-27 23:58
  • 4039

【webView重定向】遇到的坑

缘由: 项目开发中用,不是所以界面都需要原生开发,也有一部分会用到H5。下面说的问题就是因为项目webView加载H5造成的。 现象: 1、打开一些网页,正常,而有一些就不正常; 2、...
  • knockheart
  • knockheart
  • 2017-03-07 09:37
  • 1884

Webview处理302跳转

WebView webView = (WebView) findViewById(R.id.webview); webView.setWebViewClient(new WebViewClient(...
  • kakathya
  • kakathya
  • 2015-11-24 17:30
  • 2262

webview中判断当前url是否是重定向

场景: 需要监听webview中点击的url,拦截并在另一个浏览器中打开。但是有的url是重定向,就需要在当前的webview中打开。 而如何在shouldOverrideUrlL...
  • knxw0001
  • knxw0001
  • 2014-11-03 15:30
  • 20598

android webView 解决重定向

android webView 解决重定向 回退页面刷新导致页面不能回退
  • u013472738
  • u013472738
  • 2016-10-08 19:33
  • 2901

iOS WebView重定向新开界面问题

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • msmwncx
  • msmwncx
  • 2015-12-22 18:17
  • 7506

【webView重定向】遇到的坑

缘由: 项目开发中用,不是所以界面都需要原生开发,也有一部分会用到H5。下面说的问题就是因为项目webView加载H5造成的。 现象: 1、打开一些网页,正常,而有一些就不正常; 2、...
  • knockheart
  • knockheart
  • 2017-03-07 09:37
  • 1884

安卓webview注入cookie丢失或者被覆盖现象探究

private void setWebViewCookie() {         CookieSyncManager.createInstance(this);      ...
  • rnZuoZuo
  • rnZuoZuo
  • 2015-10-13 19:05
  • 2916

Android网络编程中遇到返回码为302重定向的问题

最近在学习Android中的网络编程,即利用HttpURLConnection对象访问网络获取数据。初始代码如下: //1.根据url地址创建一个URL...
  • weiyongle1996
  • weiyongle1996
  • 2017-05-09 20:44
  • 614
    个人资料
    • 访问:10931878次
    • 积分:76673
    • 等级:
    • 排名:第23名
    • 原创:506篇
    • 转载:914篇
    • 译文:4篇
    • 评论:2258条
    打赏
    如果您认为本博客不错,读后觉得有收获,不妨打赏赞助我一下,让我有动力继续写出高质量的博客。



    赠人玫瑰,手有余香。分享技术,传递快乐。

    有心课堂,传递的不仅仅是技术!

    QQ交流群:250468947

    有心课堂会员,请加入VIP QQ交流群:213725333

    github
    我的视频
    博客专栏
    最新评论