商业转载请联系作者获得授权,非商业转载请注明出处。

For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.

协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)

作者(Author):

链接(URL):https://www.35youth.cn/817.html

来源(Source):搬砖少年

近期团队接到一个新的项目,企业内部的一个掌上超市项目,最初考虑通过公众号或者小程序来做,后面说是部署在企业内网,就考虑到做网站应用,由于需要通过运营商分配的apn连接企业内网,所以在打开应用之前需要检测一下网络,如果是web端的话,那就没法检测网络了,所以考虑使用安卓的 webview 封装一下H5的应用。

1、配置网络连接权限

在AndroidManifest.xml文件中加上以下配置信息

<uses-permission android:name="android.permission.INTERNET"/>

注: 从Android 9.0(API级别28)开始,默认情况下禁用明文支持。因此http的url均无法在webview中加载 ,所以只配置以上信息可能会导致net::ERR_CLEARTEXT_NOT_PERMITTED报错,还需要在配置文件的 application中加入下面的配置。参照文章: net::ERR_CLEARTEXT_NOT_PERMITTED

android:usesCleartextTraffic="true"

webview 网络配置异常

net::ERR_CLEARTEXT_NOT_PERMITTED 配置

2、创建layout文件

使用idea的话,会自动创建MainActivity和对应的layout文件,直接在文件的基础上修改即可,使用Webview控件,如果需要使用进度条的话,可以将ProgressBar 的配置打开即可。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ctjsoft.jxf.shop.MainActivity">
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"/>
<!--<ProgressBar android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/progressbar"
style="@android:style/Widget.ProgressBar.Horizontal" android:max="100" android:progress="0"
android:visibility="gone"/>-->
</androidx.constraintlayout.widget.ConstraintLayout>

3、修改 MainActivity 文件

重写onCreate方法:

protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//progressBar = (ProgressBar) findViewById(R.id.progressbar);//进度条 webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
// webview的设置中添加如下代码
try {
if (Build.VERSION.SDK_INT >= 16) {
Class<?> clazz = webView.getSettings().getClass();
Method method = clazz.getMethod("setAllowUniversalAccessFromFileURLs", boolean.class);
if (method != null) {
method.invoke(webView.getSettings(), true);
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//webView.loadUrl("http://172.17.1.176:8082/");//加载url
webView.loadUrl(API); //使用webview显示html代码
// webView.loadDataWithBaseURL(null,"<html><head><title> 欢迎您 </title></head>" +
// "<body><h2>使用webview显示 html代码</h2></body></html>", "text/html" , "utf-8", null); webView.addJavascriptInterface(this, "android");//添加js监听 这样html就能调用客户端
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);
WebSettings webSettings = webView.getSettings();
/**
* LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
* LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
* LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
* LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
*/
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//不使用缓存,只从网络获取数据.
webView.getSettings().setTextZoom(100);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//设置js可以直接打开窗口,如window.open(),默认为false
webView.getSettings().setJavaScriptEnabled(true);//是否允许执行js,默认为false。设置true时,会提醒可能造成XSS漏洞
webView.getSettings().setSupportZoom(true);//是否可以缩放,默认
webView.getSettings().setBuiltInZoomControls(true);//是否显示缩放按钮,默认false
webView.getSettings().setUseWideViewPort(true);//设置此属性,可任意比例缩放。大视图模式
webView.getSettings().setLoadWithOverviewMode(true);//和setUseWideViewPort(true)一起解决网页自适应问题
webView.getSettings().setAppCacheEnabled(true);//是否使用缓存
webView.getSettings().setDomStorageEnabled(true);//DOM Storage
}
```
配置WebviewClient
//WebViewClient主要帮助WebView处理各种通知、请求事件
private WebViewClient webViewClient = new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {//页面加载完成
//progressBar.setVisibility(View.GONE);
} public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面开始加载
//progressBar.setVisibility(View.VISIBLE);
} @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Log.i("ansen", "拦截url:" + request.getUrl());
return super.shouldOverrideUrlLoading(view, request);
} }; //WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等
private WebChromeClient webChromeClient = new WebChromeClient() {
//不支持js的alert弹窗,需要自己监听然后通过dialog弹窗
public boolean onJsAlert(WebView webView, String url, String message, JsResult result) {
AlertDialog.Builder localBuilder = new AlertDialog.Builder(webView.getContext());
localBuilder.setMessage(message).setPositiveButton("确定", null);
localBuilder.setCancelable(false);
localBuilder.create().show(); //注意:
//必须要这一句代码:result.confirm()表示:
//处理结果为确定状态同时唤醒WebCore线程
//否则不能继续点击按钮
result.confirm();
return true;
} //获取网页标题
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
Log.i("ansen", "网页标题:" + title);
} //加载进度回调
@Override
public void onProgressChanged(WebView view, int newProgress) {
// progressBar.setProgress(newProgress);
}
}; @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.i("ansen", "是否有上一个页面:" + webView.canGoBack());
if (webView.canGoBack() && keyCode == KeyEvent.KEYCODE_BACK) {//点击返回按钮的时候判断有没有上一页
webView.goBack(); // goBack()表示返回webView的上一页面
return true;
}
return super.onKeyDown(keyCode, event);
} /**
* JS调用android的方法
*
* @param str
* @return
*/
@JavascriptInterface //仍然必不可少
public void getClient(String str) {
Log.i("ansen", "html调用客户端:" + str);
} @Override
protected void onDestroy() {
super.onDestroy(); //释放资源
webView.destroy();
webView = null;
}
```

Android开发:通过 webview 将网页打包成安卓应用的更多相关文章

  1. android开发中WebView的使用(附完整程序)

    原文地址:http://www.pocketdigi.com/20110216/176.html WebView是个好东西,作用相当于一个迷你的浏览器,采用Webkit内核,因此完美支持html,ja ...

  2. 将H5页面打包成安卓原生app

    第一步:下载HBuilderX,新建项目选择5+App新建一个空项目如下图 新建后项目目录结构如下图 第二步,将你要打包成安卓app的文件打包,最后生成的文件目录如下图 1.打包完成后,将对应文件内容 ...

  3. HBuilderX打包成安卓或苹果app之后的调试问题,避免每次都要打包

    一.使用VScode安装 Live Server插件 二.使用:安装成功后---->>新建一个index.html 写入内容如下图所示 注:href地址是你在电脑上启动该项目的访问地址(此 ...

  4. Android 之 用WebView显示网页

    WebView可以使得网页轻松的内嵌到 app 里,还可以直接跟js相互调用. WebView有两个方法:setWebChromeClient 和 setWebClient (1) setWebCli ...

  5. Electron把网页打包成桌面应用并进行源码加密

    前言 最近想把自己用html+css+js做的网页界面打包成桌面应用,网上一搜,发现Electron是一个不错的选择,试了试,发现效果真的不错.这里记录一下打包过程以作记录,便于自己以后查看学习. 一 ...

  6. HTML5学习总结-10 Android 控件WebView显示网页

    WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. webview有两个方法:setWebChromeClient 和 setWebClient 1)setWebClient: ...

  7. 搭建ionic3-angular5 开发环境并打包成安卓apk包教程

    安装node.js 搭建ionic3-angular5 开发环境,首先查看本地电脑是否安装node环境,打开终端,输入 命令: node -v 没有去安装nodejs  网址:http://nodej ...

  8. android中使用WebView请求网页

    请求网页首先需要访问网络的权限,在AndroidManifest.xml添加如下内容: <uses-permission android:name="android.permissio ...

  9. 【iOS越狱开发】如何将应用打包成.ipa文件

    在项目开发中,我们常常需要将工程文件打包成.ipa文件,提供给越狱的iphone安装. 下面是一种方法: 1.首先应该给工程安装好配置文件(这里不再敖述),在ios device的状态下,运行成功. ...

随机推荐

  1. <JZOJ1329>旅行

    贪心大水题 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm& ...

  2. BufferedReader中文乱码解决

    做一个从windows cmd截获命令返回值的java程序,结果截回来的文字中所有的中文都是乱码 Microsoft Windows [�汾 6.1.7260] ��Ȩ���� (c) 2009 Mi ...

  3. RocketMQ集群平滑下线或重启某个节点

    1.现状描述 集群其中一台物理机未知原因导致单用户无法登陆机器,该物理机需要重启修改密码或者重装系统.该台为master节点,运行正常.配置策略为: 异步刷盘 主从异步复制 如果直接下线该master ...

  4. Windows 下 LaTeX 手动安装宏包(package)以及生成帮助文档的整套流程

    本文简单介绍如何手动安装一个 LaTeX 宏包. 一般来说,下载的 TeX 发行版已经自带了很多宏包,可以满足绝大部分需求,但是偶尔我 们也可能碰到需要使用的宏包碰巧没有安装的情况,这时我们就需要自己 ...

  5. 一条SQL在内存结构与后台进程工作机制

    oracle服务器由数据库以及实例组成,数据库由数据文件,控制文件等物理文件组成,实例是由内存结构+后台进程组成,实例又可以看做连接数据库的方式,在我看来就好比一家公司,实例就是一个决策的办公室,大大 ...

  6. 关于C++类中的三兄弟(pretect、private、public)

    1.public修饰的成员变量 在程序的任何地方都可以被访问,就是公共变量的意思,不需要通过成员函数就可以由类的实例直接访问 2.private修饰的成员变量 只有类内可直接访问,私有的,类的实例要通 ...

  7. 关于Newtonsoft.Json引用报错

    自己运行的vs版本是2012,然后同事用了2017的,我把代码发给他后运行发现报以下错误: {未能加载文件或程序集"Newtonsoft.Json, Version=4.5.0.0, Cul ...

  8. python Could not find a version that satisfies the requirement pymysql (from versions: none) ERROR: No matching distribution found for pymysql

    使用pip安装pymysql出错;Could not find a version that satisfies the requirement cryptography (from pymysql) ...

  9. 从HTML标签开始

    开始这一切吧! 没错,你没看错,我将从HTML标签开始我的整个系列文章.很基础吧?但是每个前端人都是从最简单的HTML标签开始的,都是从一个<html></html>开始整个前 ...

  10. 提取.bank音频包。 Extract .bank audio files

    转载请注明出处! 首先我们需要提取的文件是 .bank 的音频文件包,里面包含很条音频. 这是我们会用到工具 step1: 运行  quickbms.exe, 它会自动打开选择文件窗口,我们直接选择下 ...