为什么要将H5网址封装成APP?

越来越多的开发者热衷于使用html5+JavaScript开发移动Web网页。HTML5的出现能否在未来取代移动APP应用,就目前来说,还是个未知数。一方面,用户在使用习惯上,不喜欢在浏览器上输入复杂的网址;另一方面,Html5存放在服务器端,在每次使用时需要进行数据传递,会造成流量浪费。有些开发者不想接触复杂的JAVA代码,那么有什么办法,既可以使用HTMl5开发网站应用,又可以将其简单封装成APK文件呢?当然有,那就是使用Android的Webview控件。

一、封装步骤:

1、打开Android Studio → 创建一个新项目

2、在activity_main.xml里添加一个WebView视图控件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><WebViewandroid:layout_width="match_parent"android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

3、在MainActivity.java活动里,添加相关方法,代码如下:

package net.zy13.html5;import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.WebView;public class MainActivity extends AppCompatActivity {private WebView webview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//这是为了应用程序安装完后直接打开,按home键退出后,再次打开程序出现的BUGif ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {//结束你的activityreturn;}// 隐藏标题栏,在加载布局之前设置(兼容Android2.3.3版本)requestWindowFeature(Window.FEATURE_NO_TITLE);getSupportActionBar().hide();//加载webview控件loadWebview();//隐藏活动窗口//setContentView(R.layout.activity_main);}private void loadWebview() {//实例化WebView对象webview = new WebView(this);//设置WebView属性WebSettings ws = webview.getSettings();ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//设置布局,会引起WebView的重新布局(relayout),默认值NARROW_COLUMNSws.setLoadsImagesAutomatically(true);//自动加载图片资源ws.setUseWideViewPort(true);//支持HTML的“viewport”标签或者使用wide viewportws.setLoadWithOverviewMode(true);//缩小内容以适应屏幕宽度ws.setJavaScriptEnabled(true);//执行javascript脚本ws.setGeolocationEnabled(true);//启用定位ws.setDomStorageEnabled(true);//启用DOM存储APIwebview.requestFocus();webview.canGoForward();webview.canGoBack();webview.setScrollBarStyle(0);//加载需要显示的网页webview.loadUrl("http://lt.296o.com/");//设置Web视图setContentView(webview);}/*** 设置回退* 覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法* @param keyCode* @param event* @return*/@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {webview.goBack(); //goBack()表示返回WebView的上一页面return true;}return false;}
}

4、在AndroidManifest.xml清单文件中,添加网络访问权限

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

5、使用签名打包生成apk文件的方法参考下面这篇文章

Android Studio使用签名打包发布APP(安卓生成apk文件)_幕尘枫的博客-CSDN博客_android studio 打包发布

二、WebView的WebSettings的相关设置

WebSettings webSettings=webView.getSettings();

setAllowContentAccess (boolean allow) 
是否允许在WebView中访问内容URL(Content Url),默认允许。内容Url访问允许WebView从安装在系统中的内容提供者载入内容。

setAllowFileAccess (boolean allow) 
是否允许访问文件,默认允许。注意,这里只是允许或禁止对文件系统的访问,Assets 和 resources 文件使用file:///android_asset和file:///android_res仍是可访问的。

setAllowFileAccessFromFileURLs (boolean flag) 
是否允许运行在一个URL环境(the context of a file scheme URL)中的JavaScript访问来自其他URL环境的内容,为了保证安全,应该不允许。也请注意,这项设置只影响对file schema 资源的JavaScript访问,其他形式的访问,例如来自图片HTML单元的访问不受影响。为了防止相同的域策略(same domain policy)对ICE_CREAM_SANDWICH以及更老机型的侵害,应该显式地设置此值为false。

setAllowUniversalAccessFromFileURLs (boolean flag) 
是否允许运行在一个file schema URL环境下的JavaScript访问来自其他任何来源的内容,包括其他file schema URLs. 参见setAllowFileAccessFromFileURLs(boolean),为了确保安全,应该设置为不允许,注意这项设置只影响对file schema 资源的JavaScript访问,其他形式的访问,例如来自图片HTML单元的访问不受影响。为了防止相同的域策略(same domain policy)对ICE_CREAM_SANDWICH以及更老机型的侵害,应该显式地设置此值为false。ICE_CREAM_SANDWICH_MR1 以及更老的版本此默认值为true,JELLY_BEAN以及更新版本此默认值为false

setAppCacheEnabled (boolean flag) 
应用缓存API是否可用,默认值false, 结合setAppCachePath(String)使用。

setAppCachePath(String) 
设置应用缓存文件的路径。为了让应用缓存API可用,此方法必须传入一个应用可写的路径。该方法只会执行一次,重复调用会被忽略。

setAppCacheMaxSize (long appCacheMaxSize) 
已废弃。设置应用缓存内容的最大值。所传值会被近似为数据库支持的最近似值,因此这是一个指示值,而不是一个固定值。所传值若小于数据库大小不会让数据库调整大小。默认值是MAX_VALUE,建议将默认值设置为最大值。

setBlockNetworkImage (boolean flag) 
是否禁止从网络(通过http和https URI schemes访问的资源)下载图片资源,默认值为false。注意,除非getLoadsImagesAutomatically()返回true,否则该方法无效。还请注意,即使此项设置为false,使用setBlockNetworkLoads(boolean)禁止所有网络加载也会阻止网络图片的加载。当此项设置的值从true变为false,WebView当前显示的内容所引用的网络图片资源会自动获取。

setBlockNetworkLoads (boolean flag) 
是否禁止从网络下载数据,如果app有INTERNET权限,默认值为false,否则默认为true。使用setBlockNetworkImage(boolean) 只会禁止图片资源的加载。注意此值由true变为false,当前WebView展示的内容所引用的网络资源不会自动加载,直到调用了重载。如果APP没有INTERNET权限,设置此值为false会抛出SecurityException。

setBuiltInZoomControls (boolean enabled) 
是否使用内置的缩放机制。内置的缩放机制包括屏幕上的缩放控件(浮于WebView内容之上)和缩放手势的运用。通过setDisplayZoomControls(boolean)可以控制是否显示这些控件,默认值为false。

setCacheMode (int mode) 
重写使用缓存的方式,默认值LOAD_DEFAULT。缓存的使用方式基于导航类型,正常的页面加载,检测缓存,需要时缓存内容复现。导航返回时,内容不会复现,只有内容会从缓存盘中恢复。该方法允许客户端通过指定LOAD_DEFAULT, LOAD_CACHE_ELSE_NETWORK, LOAD_NO_CACHE or LOAD_CACHE_ONLY的其中一项来重写其行为。

setCursiveFontFamily (String font) 
设置WebView字体库字体,默认“cursive”

setDatabaseEnabled (boolean flag) 
数据库存储API是否可用,默认值false。如何正确设置数据存储API参见setDatabasePath(String)。该设置对同一进程中的所有WebView实例均有效。注意,只能在当前进程的任意WebView加载页面之前修改此项,因为此节点之后WebView的实现类可能会忽略该项设置的改变。

setDatabasePath (String databasePath) 
已废弃,数据库路径由实现(implementation)管理,调用此方法无效。 
设置数据库的存储路径,为了保证数据库正确运行,该方法必须使用一个应用可写的路径。此方法只能执行一次,重复调用会被忽略。

setDefaultFixedFontSize (int size) 
设置默认固定的字体大小,默认为16,可取值1到72

setDefaultFontSize (int size) 
设置默认的字体大小,默认16,可取值1到72

setDefaultTextEncodingName (String encoding) 
设置默认的字符编码集,默认”UTF-8”.

setDefaultZoom (WebSettings.ZoomDensity zoom) 
已废弃。设置默认的缩放密度,必须在UI线程调用,默认值MEDIUM.该项设置在新应用中不推荐使用。如果WebView用于展示手机页面,可以通过调整页面的’meta viewport’ 标记中的’width’ 和 ‘initial-scale’属性实现预期效果,对于漏用标记的页面,可以使用setInitialScale(int)和setUseWideViewPort(boolean) .

setDisplayZoomControls (boolean enabled) 
使用内置的缩放机制时是否展示缩放控件,默认值true。参见setBuiltInZoomControls(boolean).

setDomStorageEnabled (boolean flag) 
DOM存储API是否可用,默认false。

setEnableSmoothTransition (boolean enable) 
已废弃,将来会成为空操作(no-op),设置当panning或者缩放或者持有当前WebView的window没有焦点时是否允许其光滑过渡,若为true,WebView会选择一个性能最大化的解决方案。例如过渡时WebView的内容可能不更新。若为false,WebView会保持精度(fidelity),默认值false。

setFantasyFontFamily (String font) 
设置fantasy字体集(font family)的名字默认为“fantasy”

setFixedFontFamily (String font) 
设置固定的字体集的名字,默认为”monospace”。

setGeolocationDatabasePath (String databasePath) 
定位数据库的保存路径,为了确保定位权限和缓存位置的持久化,该方法应该传入一个应用可写的路径。

setGeolocationEnabled (boolean flag) 
定位是否可用,默认为true。请注意,为了确保定位API在WebView的页面中可用,必须遵守如下约定: 
(1) app必须有定位的权限,参见ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION; 
(2) app必须提供onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback)回调方法的实现,在页面通过JavaScript定位API请求定位时接收通知。 
作为可选项,可以在数据库中存储历史位置和Web初始权限,参见setGeolocationDatabasePath(String).

setJavaScriptCanOpenWindowsAutomatically (boolean flag) 
让JavaScript自动打开窗口,默认false。适用于JavaScript方法window.open()。

setJavaScriptEnabled (boolean flag) 
设置WebView是否允许执行JavaScript脚本,默认false,不允许。

setLayoutAlgorithm (WebSettings.LayoutAlgorithm l) 
设置布局,会引起WebView的重新布局(relayout),默认值NARROW_COLUMNS

setLightTouchEnabled (boolean enabled) 
已废弃。从 JELLY_BEAN 开始,该设置无效。允许使用轻触摸做出选择和光标悬停。

setLoadWithOverviewMode (boolean overview) 
是否允许WebView度超出以概览的方式载入页面,默认false。即缩小内容以适应屏幕宽度。该项设置在内容宽度超出WebView控件的宽度时生效,例如当getUseWideViewPort() 返回true时。

setLoadsImagesAutomatically (boolean flag) 
WebView是否下载图片资源,默认为true。注意,该方法控制所有图片的下载,包括使用URI嵌入的图片(使用setBlockNetworkImage(boolean) 只控制使用网络URI的图片的下载)。如果该设置项的值由false变为true,WebView展示的内容所引用的所有的图片资源将自动下载。

setMediaPlaybackRequiresUserGesture (boolean require) 
WebView是否需要用户的手势进行媒体播放,默认值为true。

setMinimumFontSize (int size) 
设置最小的字号,默认为8

setMinimumLogicalFontSize (int size) 
设置最小的本地字号,默认为8。

setMixedContentMode (int mode) 
当一个安全的来源(origin)试图从一个不安全的来源加载资源时配置WebView的行为。默认情况下,KITKAT及更低版本默认值为MIXED_CONTENT_ALWAYS_ALLOW,LOLLIPOP版本默认值MIXED_CONTENT_NEVER_ALLOW,WebView首选的最安全的操作模式为MIXED_CONTENT_NEVER_ALLOW ,不鼓励使用MIXED_CONTENT_ALWAYS_ALLOW。

setNeedInitialFocus (boolean flag) 
调用requestFocus(int, Android.graphics.Rect)时是否需要设置节点获取焦点,默认值为true。

setOffscreenPreRaster (boolean enabled) 
当WebView切换到后台但仍然与窗口关联时是否raster tiles,打开它可以避免在WebView从后台切换到前台时重新绘制,默认值false。在这种模式下后台的WebView占用更多的内存。请按如下准则显示内存的使用:

WebView的尺寸不能比设备的屏幕尺寸更大;
限制在少数WebView上使用该模式;
在可见的WebView和即将显现的WebView上使用;
setPluginState (WebSettings.PluginState state) 
在API18以上已废弃。未来将不支持插件,不要使用。告诉WebView启用、禁用或者有即用(on demand)的插件,即用模式是指如果存在一个可以处理嵌入内容的插件,会显示一个占位图标,点击时开启。默认值OFF。

setRenderPriority (WebSettings.RenderPriority priority) 
在API18以上已废弃。不建议调整线程优先级,未来版本不会支持这样做。设置绘制(Render,很多书上翻译成渲染,貌似很专业,但是不易懂,不敢苟同)线程的优先级。不像其他设置,同一进程中只需调用一次,默认值NORMAL。

setSansSerifFontFamily (String font) 
设置无衬线字体集(sans-serif font family)的名字。默认值”sans-serif”.

setSaveFormData (boolean save) 
WebView是否保存表单数据,默认值true。

setSavePassword (boolean save) 
API18以上版本已废弃。未来版本将不支持保存WebView中的密码。设置WebView是否保存密码,默认true。

setSerifFontFamily (String font) 
设置衬线字体集(serif font family)的名字,默认“sans-serif”。

setStandardFontFamily (String font) 
设置标准字体集的名字,默认值“sans-serif”。

setSupportMultipleWindows (boolean support) 
设置WebView是否支持多窗口。如果设置为true,主程序要实现onCreateWindow(WebView, boolean, boolean, Message),默认false。

setSupportZoom (boolean support) 
WebView是否支持使用屏幕上的缩放控件和手势进行缩放,默认值true。设置setBuiltInZoomControls(boolean)可以使用特殊的缩放机制。该项设置不会影响zoomIn() and zoomOut()的缩放操作。

setTextSize (WebSettings.TextSize t) 
API14版本以上已废弃。请取代使用setTextZoom(int)。设置页面文本的尺寸,默认NORMAL。

setTextZoom (int textZoom) 
设置页面上的文本缩放百分比,默认100。

setUseWideViewPort (boolean use) 
WebView是否支持HTML的“viewport”标签或者使用wide viewport。设置值为true时,布局的宽度总是与WebView控件上的设备无关像素(device-dependent pixels)宽度一致。当值为true且页面包含viewport标记,将使用标签指定的宽度。如果页面不包含标签或者标签没有提供宽度,那就使用wide viewport。

setUserAgentString (String ua) 
设置WebView的用户代理字符串。如果字符串为null或者empty,将使用系统默认值。注意从KITKAT版本开始,加载网页时改变用户代理会让WebView再次初始化加载。

supportMultipleWindows () 
获取WebView是否支持多窗口的值。

supportZoom () 
获取WebView是否支持缩放的值

三、bug解决

1、部分手机无法打开网页,报错net::ERR_CLEARTEXT_NOT_PERMITTED,如下:

2、原因分析:

WebView在Android 8.0以下都是可以正常打开链接的,但从Android 9.0(API级别28)开始,默认情况下禁用明文支持,因此http的url均无法在webview中正常加载 !

3、解决方法:

在AndroidManifest.xml清单文件中,application节点添加如下配置即可

android:usesCleartextTraffic="true"
<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"android:usesCleartextTraffic="true"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>

Android Studio将html5网址封装成APP相关推荐

  1. Android Studio 打包H5网址页面,封装APK

    Android Studio 打包H5网址页面,封装APK 一.下载 AndroidStudio 二.配置SDK 三.新建项目 四.配置项目 MainActivity WebViewClient An ...

  2. cordova 一个将web应用程序封装成app的框架

    cordova 一个将web应用程序封装成app的框架 cordova的详细介绍请参考这个链接:http://www.zhoujingen.cn/blog/7034.html 我接下来主要将如何搭建. ...

  3. Android Studio 实现将视频资源嵌入APP中

    Android Studio 实现将视频资源嵌入APP中 (直取思路跟代码跳转文末,如有帮助勿忘分享点赞奥!你的支持是我更新的动力!) 在正文之前首先想给大家引入安卓数据存储路径: 内部存储inter ...

  4. 将网站封装成APP安卓应用

    将网站封装成APP安卓应用 将网站封装成APP安卓应用我接触到的目前有三种方法,构建方法和难度也是逐步提升,不过,世上无难事,只怕有心人,干就完了,奥里给! 法一:利用一个木函封装 讲真,这个方法是我 ...

  5. 网址打包(详细图文教程!) 使用HBuilder将网址打包成app

    使用HBuilder将网址打包成app 使用工具:HBuilder 附上链接:https://www.dcloud.io/hbuilderx.html 教程目的:将封装好的项目网址打包成一个app,即 ...

  6. 本地html如何封装成app,新手适用:如何把网页快速封装成APP

    原标题:新手适用:如何把网页快速封装成APP 最近有小伙伴找到小微:小微呀,我们家有个网站,但是我们没有APP,用户会觉得我们不正规的呀.现在开发一个APP那么贵,我们不想花太多钱了,你有什么好的主意 ...

  7. Android Studio实现内容丰富的旅游App

    文章目录 一.项目概述 二.开发环境 三.项目结构 四.运行演示 五.项目总结 六.源码获取 一.项目概述 随着人们生活质量的不断提高,外出旅游的需求也日益增多,旅游肯定需要一款App来帮助游客寻找景 ...

  8. 网站可以封装成app吗?网站如何快速转app快来看看吧

    网站封装成APP就是把网页内嵌在APP内,虽然不是真的APP但也可以满足一定用户的需求.现在APICloud推出了同样的网站封装APP工具,方便有网站想快速制作app的小伙伴,一起来看看吧. 一.准备 ...

  9. html的网页怎么打包成网址,如何将网址打包成APP?(详细教程)

    随着移动时代的发展和智能手机的普及,越来越多的用户查找和浏览信息更依赖于移动端,要在互联网上做一个形象和门面,现在单单凭一个 PC 网站已经无法立足了,现在的就基本配套包括 PC 网站,公众号,小程序 ...

最新文章

  1. 【 MATLAB 】序列相关与序列卷积之间的关系
  2. 算法提高课-图论-单源最短路的扩展应用-AcWing 1137. 选择最佳线路:多源最短路、虚拟源点
  3. pytho sin(1/x)震荡间断点
  4. ios APP开发简单实例
  5. mysql 存过 if_mysql中 储存过程 if exists 该如何写呀
  6. Socket的select制作多客户端传输(Qt)
  7. java 链表 最小堆优先级队列_关于Java集合的小抄
  8. 张老师讲Python~
  9. 何为真正的 FaaS ?阿里舜天平台做了四大创新
  10. 组件通信-父组件为子组件传递数据-静态数据//动态数据 // 数据校验
  11. cuda并行编程之求解ConjugateGradient(共轭梯度迭代)丢失dll解决方式
  12. 技嘉 b360m d3h-cf efi_技嘉Geforce RTX 3080 GAMING OC 10G评测:性能入魔,方为魔鹰_显卡...
  13. 谷歌有情怀!谷歌开放大规模音频数据集 AudioSet
  14. Agenda for Mac(多功能日历管理工具)中文版
  15. 进行计算机系统管理调度监控和维护的软件是,MES车间调度监控系统软件
  16. 史上最全ASCII码对照表0-255(%d)
  17. android最强的平板,最强安卓游戏平板曝光,NVIDIA的Shield Tablet X1来了
  18. 2021年秋招面经分享·地平线【芯片设计研发工程师】
  19. oracle安装点下一步退出,学习笔记:oracle之win10安装卸载oracle 11gR2步骤及常见问题解决...
  20. CAD梦想画图中删除命令

热门文章

  1. Centos 添加新硬盘,分区格式化、挂载硬盘
  2. ruoyi框架默认的导出Excel功能代码简析
  3. 计算机的cup颗数、核数、线程数
  4. iOS设计模式四部曲(二) 结构型模式 内附Demo
  5. 计算机excel 考试操作,计算机考试操作考点列表
  6. oracle求两个字段的日期差
  7. 1650显卡学计算机,1650ti显卡属于什么档次?
  8. 五子棋游戏(JavaScript+JQuery+Canvas)
  9. C语言 switch语句来调用函数
  10. 学习使用md+Typora记笔记的笔记