Activity:package com.beini.h5app;import android.app.Activity;import android.graphics.Bitmap;import android.net.http.SslError;import android.os.Bundle;import android.util.Log;import android.view.View;import android.webkit.GeolocationPermissions;import android.webkit.JsPromptResult;import android.webkit.JsResult;import android.webkit.SslErrorHandler;import android.webkit.WebChromeClient;import android.webkit.WebResourceError;import android.webkit.WebResourceRequest;import android.webkit.WebResourceResponse;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;import java.io.IOException;import java.io.InputStream;public class MainActivity extends Activity {    private WebView web_view;    private String url = "file:///android_asset/demo.html";    private String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        web_view = findViewById(R.id.web_view);        findViewById(R.id.btn_click).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                web_view.loadUrl("javascript:alertMethod()");            }        });//        WebSettings webSettings = web_view.getSettings();//浏览器的web设置信息        webSettings.setJavaScriptEnabled(true);//设置WebView属性,能够执行Javascript脚本        //设置自适应屏幕,两者合用        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小        //缩放操作        webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件//      webSettings.setUseWideViewPort(true);// 当容器超过页面大小时,是否放大页面大小到容器宽度//      webSettings.setLoadWithOverviewMode(true);//当页面超过容器大小时,是否缩小页面尺寸到页面宽度        //其他细节操作        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存        webSettings.setAllowFileAccess(true); //设置可以访问文件        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式        //设置WebView缓存        //优先使用缓存:        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);        //缓存模式如下:        //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据        //LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。        //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.        //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。//        if (NetStatusUtil.isConnected(getApplicationContext())) {//            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根据cache-control决定是否从网络上取数据。//        } else {//            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//没网,则从本地获取,即离线加载//        }        //每个 Application 只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()        webSettings.setDomStorageEnabled(true); // 开启 DOM storage API 功能 设置是否启用app缓存        webSettings.setDatabaseEnabled(true);   //开启 database storage API 功能        webSettings.setAppCacheEnabled(true);//开启 Application Caches 功能//        webSettings.setAllowFileAccess(true);//设置是否允许访问文件,例如WebView访问sd卡的文件。不过assets与res文件不受此限制,仍然可以通过“file:///android_asset”和“file:///android_res”访问。//        webSettings.setDatabaseEnabled(true); // 设置是否启用数据库//        String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;//        webSettings.setAppCachePath(cacheDirPath); //设置  Application Caches 缓存目录        web_view.setWebChromeClient(new MWebChromCLient());//设置浏览器的交互事件        web_view.setWebViewClient(new MWebViewClient());//设置浏览器的加载事件        web_view.addJavascriptInterface(this, "beini");//添加本地的js代码接口//      web_view.setDownloadListener(downloadListener);//设置文件下载监听        web_view.loadUrl(url);//      web_view.loadData();// 加载文本数据。第二个参数表示媒体类型,如"text/html";第三个参数表示数据的编码格式,"base64"表示采用base64编码,其余值(包括null)表示url编码。//        web_view.canGoBack();// 表示返回WebView的上一页//        web_view.goBack();//返回到上一个页面    }    class MWebViewClient extends WebViewClient {//避免打开系统浏览器        @Override        public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面开始加载。一般在此弹出进度对话框ProgressFialog            super.onPageStarted(view, url, favicon);        }        @Override        public void onPageFinished(WebView view, String url) {//页面加载结束。一般在此关闭进度对话框            super.onPageFinished(view, url);        }        @Override        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {//收到ssl错误            super.onReceivedSslError(view, handler, error);        }        @Override        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {//收到错误信息            Log.d(TAG, "         onReceivedError    ");            super.onReceivedError(view, request, error);        }        /**         * 当按下某个连接时WebViewClient会调用这个方法,并传递参数         *         * @param view         * @param request         * @return         */        @Override        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {            Log.d(TAG, "        shouldOverrideUrlLoading ");            view.loadUrl(url);            return true;        }        /**         * shouldInterceptRequest这个回调可以通知主程序WebView处理的资源(css,js,image等)请求,并允许主程序进行处理后返回数据。如果主程序返回的数据为null,WebView会自行请求网络加载资源,否则使用主程序提供的数据。注意这个回调发生在非UI线程中,所以进行UI系统相关的操作是不可以的。         *         * @param view         * @param request         * @return         */        @Override        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {            WebResourceResponse response = null;            if (url.contains("logo")) {                try {                    InputStream localCopy = getApplicationContext().getAssets().open("droidyue.png");                    response = new WebResourceResponse("image/png", "UTF-8", localCopy);                } catch (IOException e) {                    e.printStackTrace();                }            }            return response;        }    }    class MWebChromCLient extends WebChromeClient {        @Override        public void onReceivedTitle(WebView view, String title) {// 收到页面标题            super.onReceivedTitle(view, title);        }        @Override        public void onProgressChanged(WebView view, int newProgress) {//页面加载进度发生变化            super.onProgressChanged(view, newProgress);            Log.d(TAG, "                onProgressChanged  newProgress=" + newProgress);        }        @Override        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {//弹出js警告框            Log.d(TAG, "                onJsAlert  ");            return super.onJsAlert(view, url, message, result);        }        @Override        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {// 弹出js提示框            Log.d(TAG, "                onJsPrompt  ");            return super.onJsPrompt(view, url, message, defaultValue, result);        }        @Override        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {//弹出js确认框            Log.d(TAG, "                onJsConfirm  ");            return super.onJsConfirm(view, url, message, result);        }        @Override        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {// 网页请求定位权限。通常重写该方法弹出一个确认对话框,提示用户是否允许网页获得定位权限。下面代码表示允许定位权限:            super.onGeolocationPermissionsShowPrompt(origin, callback);//            callback.invoke(origin, true, false);//表示运行定位        }    }    @android.webkit.JavascriptInterface    public void actionFromJs() {        this.runOnUiThread(new Runnable() {            @Override            public void run() {                Toast.makeText(MainActivity.this, "js调用了Native函数", Toast.LENGTH_SHORT).show();//                String text = logTextView.getText() + "\njs调用了Native函数";//                logTextView.setText(text);            }        });    }    @android.webkit.JavascriptInterface    public void actionFromJsWithParam(final String str) {        runOnUiThread(new Runnable() {            @Override            public void run() {                Toast.makeText(MainActivity.this, "js调用了Native函数传递参数:" + str, Toast.LENGTH_SHORT).show();//                String text = logTextView.getText() +  "\njs调用了Native函数传递参数:" + str;//                logTextView.setText(text);            }        });    }}

 

布局:

 

<?xml version="1.0" encoding="utf-8"?>    

更多相关文章

  1. Android设置系统时间
  2. Android(安卓)TextView 一些字体颜色、大小设置属性
  3. 《Android(安卓)基础(三十三)》 TabHost ~ 仿微信底部菜单
  4. android之相机 VideoSource和AudioSource
  5. FloatingActionButton
  6. Android(安卓)之 Dialog复选框获取值
  7. Android中webview的使用
  8. 源码开发-小结
  9. Android(安卓)模仿微信主页面

随机推荐

  1. Android之使用Android-query框架进行开发
  2. AndroidGPS定位详解 (4)
  3. android编译问题,如何控制make编译hdpi,mdp
  4. RelativeLayout的布局学习(部分知识点)
  5. android-wifi-tether - Wireless Tether
  6. Android(安卓)实例及组件
  7. Android开源项目和web在线查看
  8. tools:context=”.MainActivity”与xmlns
  9. 不使用webview,用手机浏览器的android ap
  10. android中将txt文件保存到SD卡中