Tears_fg

导航

使用webView制作浏览器

xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.webviewdemo1.MainActivity" >

    <WebView 
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</LinearLayout>

源代码:

package com.example.webviewdemo1;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {
    private String url="http://www.meizu.com/"; 
    private WebView webView;
    private ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        /*Uri uri = Uri.parse(url);//URL为要链接的地址
        Intent intent = new Intent(Intent.ACTION_VIEW,uri);//创建一个意图,将地址传入
        startActivity(intent);//开启活动
         */
        //!!!注意:一定要自定义网络权限,不然不能联网
// <uses-permission android:name="android.permission.INTERNET"/>
init(); } private void init() { webView = (WebView) findViewById(R.id.webView); //webView加载本地资源 //webView.loadUrl("file:///webViewDemo1//assets//example.html"); //webView加载web资源 webView.loadUrl(url); //覆盖webView默认通过第三方浏览器或者是默认浏览器打开网页的行为,使得网页可以在webView中打开 webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //返回值为true时控制网页在webView中打开,如果为false则是调用系统浏览器或者第三方浏览器去打开 view.loadUrl(url); return true; } //webViewClient帮助webView去处理一些页面控制和请求通知 }); //启用支持javaScript WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); //提高速度 //webView加载页面优先使用缓存加载,默认不使用缓存加载 webView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { //newProgress 1-100之间的整数 if(newProgress==100){ //网页加载完毕,关闭ProgressDialog closeProgress(); }else{ //网页开始加载,打开ProgressDialog openDialog(newProgress); } } private void openDialog(int newProgress) { if(dialog==null){ dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("正在加载"); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setProgress(newProgress); dialog.show(); }else{ dialog.setProgress(newProgress); } } private void closeProgress() { if(dialog!=null&&dialog.isShowing()){ dialog.dismiss(); dialog=null; } } }); } //改写物理按键 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ if(webView.canGoBack()){ webView.goBack();//返回上一页面 return true; }else{ System.exit(0);//退出程序 } } return super.onKeyDown(keyCode, event); } }

 webView的一些其他配置:

    /**
     * 初始化webView的设置
     */
    private void initWebView() {
        WebSettings settings = wv.getSettings();
        /**
         * //WebView缓存的运用,可以加快网页加载的速度.缓存模式:
         Android的WebView有五种缓存模式
         1.LOAD_CACHE_ONLY //不使用网络,只读取本地缓存数据
         2.LOAD_DEFAULT //根据cache-control决定是否从网络上取数据。
         3.LOAD_CACHE_NORMAL //API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
         4.LOAD_NO_CACHE //不使用缓存,只从网络获取数据
         5.LOAD_CACHE_ELSE_NETWORK //只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据
         */
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//优先使用缓存
        //webViewClient帮助WebView去处理一些界面控制和请求的通知
        //启用支持javaScript(脚本语言)
        settings.setJavaScriptEnabled(true);
        settings.setPluginState(WebSettings.PluginState.ON);
        //解决无法根据浏览器居中显示内容的问题
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        //加了下面这句就能访问网络了,没加之前报:TypeError: Cannot call method 'getItem' of null at
        settings.setDomStorageEnabled(true);//使用Dom的本地存储机制,但是加了返回有点小bug,所以能不加就不加吧
        wv.setVisibility(View.VISIBLE);
        wv.setWebChromeClient(new WebChromeClient()); //加了才能播放视频
    }

 

//      webView.getSettings().setJavaScriptEnabled(true);  
//      webView.getSettings().setDisplayZoomControls(true);// 设置显示缩放按钮  
//      webView.getSettings().setSupportZoom(true); // 支持缩放   
//      webView.getSettings().setBuiltInZoomControls(true);  
          
        //方法一:  
//      webView.getSettings().setUseWideViewPort(true);//让webview读取网页设置的viewport,pc版网页  
//      webView.getSettings().setLoadWithOverviewMode(true);  
          
        //方法二:  
        webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);//适应内容大小  
//      webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);//适应屏幕,内容将自动缩放  

webView.getSettings().setBuiltInZoomControls(true);//可以缩放,但是会显示缩放的按钮
webView.getSettings().setDisplayZoomControls(false);//隐藏缩放的按钮
 
webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//把所有内容放大webview等宽的一列中

//设置标题
        WebChromeClient wvcc = new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                if(TextUtils.isEmpty(title)){
                    title = "默认标题";
                }
                setThisTitle(title);
            }

        };
        // 设置setWebChromeClient对象
        webView.setWebChromeClient(wvcc);

 8.3Add:

问题:

webview加载网页提示网页无法打开:ERR_UNKNOWN_URL_SCHEME

原因:因为webview只能识别http和https协议,遇到图中这种"tg:resolve "开头的自定义协议时就无法识别,便会提示ERR_UNKNOWN_URL_SCHEME这样的错误。

解决方案:

            bwNew.webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                    if (url == null) return false
                    if(url.startsWith("http://") || url.startsWith("https://")){
                        bwNew.loadUrl(url)
                        return false //返回false表示此url由系统处理,url未加载完成继续往下走
                    }
                     try {
                        var intent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity(intent)
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                    return true
                }
            }

 

代码解析:

 

 

示例: https://t.me/CoinliveHQ

1. 当返回http://或者https://,直接webview内部消化。

加载完成,不会重定向。

加载未完成,继续往下走。

2.如果未加载完成,执行步骤二:步骤三,步骤四

 https://t.me/CoinliveHQ :

这个地址就是先返回https://t.me/CoinliveHQ   执行步骤一   没加载完成 

又重定向tg:resolve?domain=CoinliveHQ 执行了步骤二步骤三步骤四

https://baidu.com 

这个地址返回会有个scheme:// 然后到步骤三 返回不处理,显示百度页面

 

posted on 2016-06-14 13:14  Tears_fg  阅读(5024)  评论(0编辑  收藏  举报