回复
#过年不停更# 利用鸿蒙JavaUI 框架的 WebView 加载本地页面 原创
宇宙之一粟
发布于 2022-2-16 18:56
浏览
0收藏
春节不停更,此文正在参加「星光计划-春节更帖活动」
在上一篇文章中,我们介绍了 Ability 组件,这一篇文章我们将了解一下 WebView 组件,然后介绍一下如何读取一个本地页面。
WebView的使用方法
WebView 提供了将网页集成到应用程序中的能力。
WebView 派生于通用组件 Component。如果需要在自己的应用中嵌入Web页面,可以通过 WebView 组件进行开发。WebView 组件派生于通用组件 Component,可以像通用组件一样使用。
WebView组件构建
- 在"resources/base/layout/ability_main.xml"文件中创建WebView,示例代码如下:
<ohos.agp.components.webengine.WebView
ohos:id="$+id:webview"
ohos:height="match_parent"
ohos:width="match_parent">
</WebView>
- 在"slice/MainAbilitySlice.java"文件中通过如下方式获取WebView对象,示例代码如下:
WebView webview = (WebView) findComponentById(ResourceTable.Id_webview);
WebView加载本地Web页面
将本地的 HTML 文件放在 “resources/rawfile/” 目录下,在本教程中命名为 BingDwenDwen.html
。在 HarmonyOS 系统中,WebView 要访问本地 Web 文件,需要通过 DataAbility 的方式进行访问,DataAbility 的具体使用方法可以参考开发DataAbility。
在"entry/src/main/config.json"中完成 DataAbility 的声明,示例代码如下:
{
"app": {
"bundleName": "com.yuzhou1su.bingdwendwen",
"vendor": "yuzhou1su",
"version": {
"code": 1000000,
"name": "1.0.0"
}
},
"deviceConfig": {},
"module": {
"package": "com.yuzhou1su.bingdwendwen",
"name": ".MyApplication",
"mainAbility": "com.yuzhou1su.bingdwendwen.MainAbility",
"deviceType": [
"phone"
],
"distro": {
"deliveryWithInstall": true,
"moduleName": "entry",
"moduleType": "entry",
"installationFree": true
},
"abilities": [
{
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
],
"name": "com.yuzhou1su.bingdwendwen.DataAbility",
"type": "data",
"uri": "dataability://com.yuzhou1su.bingdwendwen.DataAbility"
}
]
}
}
实现我们刚刚定义的 DataAbility,然后通过实现 openRawFile(Uri uri, String mode) 方法,完成 WebView 对本地 Web 页面的访问,示例代码如下:
public class DataAbility extends Ability {
...
@Override
public RawFileDescriptor openRawFile(Uri uri, String mode) throws FileNotFoundException {
if (uri == null) {;
return super.openRawFile(uri, mode);
}
String path = uri.getEncodedPath();
int splitIndex = path.indexOf('/', 1);
String providerName = Uri.decode(path.substring(1, splitIndex));
String rawFilePath = Uri.decode(path.substring(splitIndex + 1));
RawFileDescriptor rawFileDescriptor = null;
try {
rawFileDescriptor = getResourceManager().getRawFileEntry(rawFilePath).openRawFileDescriptor();
} catch (IOException e) {
// 异常处理
}
return rawFileDescriptor;
}
}
通过dataability协议加载资源文件或本地文件。
在"slice/MainAbilitySlice.java"中声明需要访问的文件路径,通过webview.load(String url)方法加载本地Web页面,可以通过WebConfig类的对象对WebView访问DataAbility的能力进行配置,示例代码如下:
package com.yuzhou1su.bingdwendwen;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.global.resource.RawFileDescriptor;
import ohos.utils.net.Uri;
import java.io.*;
public class DataAbility extends Ability {
private static final String PLACEHOLDER_RAW_FILE = "/rawfile/";
private static final String PLACEHOLDER_LOCAL_FILE = "/local/";
private static final String ENTRY_PATH_PREFIX = "entry/resources";
@Override
public void onStart(Intent intent) {
super.onStart(intent);
}
@Override
public RawFileDescriptor openRawFile(Uri uri, String mode) throws FileNotFoundException {
if (uri == null) {
return super.openRawFile(uri, mode);
}
String path = uri.getEncodedPath();
final int splitIndex = path.indexOf('/', 1);
final String providerName = Uri.decode(path.substring(1, splitIndex));
String rawFilePath = Uri.decode(path.substring(splitIndex + 1));
RawFileDescriptor rawFileDescriptor = null;
try {
rawFileDescriptor = getResourceManager().getRawFileEntry(rawFilePath).openRawFileDescriptor();
} catch (IOException e) {
// 处理异常
}
return rawFileDescriptor;
}
}
参考资料:
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-2-17 01:00:17修改
赞
1
收藏
回复
相关推荐