“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第19期
“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第19期
本期问题如下:
4、如何判断H5页面是通过HarmonyOS的webview打开的?
向所有参与社区互助的开发者致以最诚挚的感谢! **特别感谢本期优质答复贡献者:**@Fpark、@华夏 社区的蓬勃发展,离不开每一位积极参与者的贡献。本期“答开发者问”栏目,精选自广大热心开发者针对提问帖所贡献的众多优质答复之中。它们不仅是智慧与经验的璀璨结晶,更是“众人拾柴火焰高”这一真理的生动体现。在此,我们由衷地感谢每一位热心参与、乐于分享的开发者,是你们的热情与智慧,让这个社区充满了生机与活力,每一次的解答都是对技术探索精神的最好诠释。同时,我们也诚挚邀请更多的开发者加入到这场智慧碰撞的盛宴中来。无论是抛出难题寻求解答,还是慷慨解囊分享经验,您的每一份参与都将为鸿蒙开发者社区注入新的活力,推动我们共同前行,在技术的海洋中扬帆远航。 若您在开发中遇到技术问题,欢迎前往问答-我要提问题进行提问。 更快得到问题答案的秘诀我们为您整理好了,点击链接即可获取:提问小技巧
往期回顾: “答开发者问”系列汇总(持续更新中…)
问题一:如何判断USB设备是否是存储设备?
使用usbManager.getDevices获取所有的USB设备信息,那么如何判断是否是存储设备呢,是通过USBEndpoint类型中的type字段吗?端点为2代表批量传输端点,也就是存储设备的意思吗?
解决方案:
- 端点类型(endpoint.type=2)仅表示该端点支持批量传输,但并非U盘的独占特征(其他设备如打印机也可能使用批量传输)。
- 通过判断
USBDevice.clazz === 8且USBInterface.clazz === 8来识别U盘等存储设备,而非依赖端点类型字段。
操作步骤:
- 调用
usbManager.getDevices()获取设备列表。 - 遍历设备列表,检查每个设备的
clazz字段:
let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
for (let device of devicesList) {
if (device.clazz === 8) { // 设备类代码为8(Mass Storage Class)
console.info("发现大容量存储设备(如U盘)");
// 可进一步检查接口信息确认
let interfaces = device.configs[0]?.interfaces;
for (let iface of interfaces) {
if (iface.clazz === 8) { // 接口类代码同样为8
console.info("确认是U盘类设备");
}
}
}
}
原链接:
问题二:如何读取rawfile目录下.db文件中的数据?
如何读取rawfile目录下.db文件中的数据?
解决方案:
参考读写rawfile目录下的文件和如何读取本地/预制数据库。
- 将db文件推送到数据存储沙箱路径:/data/app/el2/100/database/(bundleName)/entry/rdb/。实现方式为使用文件管理接口打开本地数据库,读取其内容并写入沙箱路径下的db文件中:
import { fileIo } from '@kit.CoreFileKit';
import { relationalStore } from '@kit.ArkData';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 在EntryAbility中获取Context,保存到AppStorage,然后在工具类中使用AppStorage获取
let context = AppStorage.get('context') as UIContext;
let UiAbilityContent = context.getHostContext() as common.UIAbilityContext;
let RDBDirectory = UiAbilityContent.databaseDir;
let resource = UiAbilityContent.resourceManager;
function initDatabase() {
// 创建数据库沙箱目录
try {
let dirPath = RDBDirectory + '/entry';
fileIo.mkdirSync(dirPath);
dirPath = dirPath + '/rdb';
fileIo.mkdirSync(dirPath);
} catch (error) {
console.error(`创建rdbPath目录失败,错误码: ${error.code}, 消息: ${error.message}.`);
}
// 设置数据库名称
let dbName: string = 'Objective.db';
// 读取rawfile目录下的数据库文件
try {
let content = resource.getRawFileContentSync(dbName);
let cFile = RDBDirectory + '/entry/rdb/' + dbName;
let cacheFile = fileIo.openSync(cFile, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
fileIo.write(cacheFile.fd, content.buffer);
fileIo.closeSync(cacheFile.fd);
} catch (error) {
console.error(`获取原始文件描述符失败,错误码: ${error.code}, 消息: ${error.message}.`);
}
}
- 通过getRdbStore获取保存在沙箱路径下的db文件:
async function getRDB(): Promise<relationalStore.RdbStore | undefined> {
let result: relationalStore.RdbStore | undefined = undefined;
const STORE_CONFIG: relationalStore.StoreConfig = {
name: 'Objective.db',
securityLevel: relationalStore.SecurityLevel.S1
};
await relationalStore.getRdbStore(UiAbilityContent, STORE_CONFIG).then((rdbStore: relationalStore.RdbStore) => {
result = rdbStore;
console.info('获取RdbStore成功。');
}).catch((err: BusinessError) => {
console.error(`获取RdbStore失败,错误码: ${err.code}, 消息: ${err.message}`);
});
return result;
}
原链接:
问题三:如何开发锁屏卡片?
锁屏卡片的开发文档没有详细的教程,只有一些配置信息,不知道怎么去开发。
解决方案: 锁屏卡片UI开发可以参考ArkTS卡片开发文档,卡片开发好后按照锁屏卡片开发指导文档中的步骤申请锁屏卡片开放能力并在form_config.json配置文件中配置renderingMode和supportDimensions字段即可。 注意:
- 锁屏卡片只支持
1*1、1*2尺寸的卡片; - 锁屏卡片不推荐展示用户个人隐私敏感数据,具体界面约束请参考卡片内容设计;
原链接:
问题四:如何判断H5页面是通过HarmonyOS的webview打开的?
如何判断H5页面是通过HarmonyOS的webview打开的,userAgent是否包含特定字符?
解决方案: HarmonyOS的webview自带的userAgent 如下:
Mozilla/5.0 (Phone; OpenHarmony 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 ArkWeb/4.1.6.1 Mobile
只需要判断是否包含OpenHarmony字符串即可。
原链接:
怎么判断H5页面是通过鸿蒙的webview打开的,userAgent包含特定的字符?
问题五:使用云函数开发作为后端,需要备案吗?
应用后端服务器只做了一次ai大模型的api调用,也可以把大模型api调用改到app中,这样应用就“没有自己服务器”了,但还是联网调用了大模型api。 请问这种方式,或者是使用云函数开发作为后端,app还需要在工信部备案么?
解决方案:
- 审核时会检查应用功能联网情况,如果断网情况下不影响使用的,可以算单机,无需备案;
- 如果功能需要联网实现,是需要备案的。
可参考APP备案补充指引(含无需备案的场景,此外其他均需要正常备案),APP备案FAQ。
原链接:
更多关于“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第19期的实战教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next基于分布式架构,支持一次开发多端部署,采用ArkTS语言开发。其内核为鸿蒙内核,不依赖Linux或AOSP。系统提供ArkUI声明式框架,支持Stage模型应用开发。开发者需使用DevEco Studio IDE及配套SDK进行开发。
更多关于“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第19期的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
本期“答开发者问”汇总了五个HarmonyOS Next开发中的常见问题,并提供了清晰的解决方案。
问题一:如何判断USB设备是否是存储设备?
核心方法是检查设备的类代码(class code)。通过 usbManager.getDevices() 获取设备列表后,遍历并判断设备的 clazz 字段是否为 8(即大容量存储设备类,Mass Storage Class)。同时,建议进一步检查设备接口的 clazz 字段是否也为 8 以作确认。依赖端点类型(endpoint.type=2)来判断是不准确的,因为批量传输端点并非存储设备独有。
问题二:如何读取rawfile目录下.db文件中的数据? 由于关系型数据库(RDB)无法直接读取rawfile中的.db文件,需要先将文件复制到应用沙箱路径。主要步骤为:
- 使用
resourceManager.getRawFileContentSync读取rawfile中的.db文件内容。 - 在应用数据库目录(如
/data/app/.../database/(bundleName)/entry/rdb/)创建同名文件,并将内容写入。 - 之后即可通过
relationalStore.getRdbStore正常打开并操作该数据库。
问题三:如何开发锁屏卡片? 锁屏卡片的UI开发与普通ArkTS卡片开发流程基本一致,可参考ArkTS卡片开发文档。关键区别在于配置:
- 需要在项目的
form_config.json配置文件中,为对应卡片设置"renderingMode": "lockscreen"并配置支持的尺寸(仅限1*1和1*2)。 - 必须按照官方指南,为应用申请“锁屏卡片开放能力”。
- 设计时需注意,锁屏卡片不应展示用户隐私敏感信息。
问题四:如何判断H5页面是通过HarmonyOS的webview打开的?
可以通过检测浏览器的 User-Agent 字符串来实现。HarmonyOS的WebView内核(ArkWeb)的User-Agent中包含特定的 “OpenHarmony” 标识符。在H5页面中,只需检查 navigator.userAgent 是否包含该字符串即可判定。
问题五:使用云函数开发作为后端,需要备案吗? 是否需要备案取决于应用功能的实现方式。根据工信部规定,如果应用的核心功能或主要服务必须依赖网络(包括调用云端API、云函数等)才能实现,则需要进行APP备案。如果应用在断网状态下所有功能仍可正常使用,则可被视为单机应用,无需备案。因此,若您的大模型API调用是应用的必要功能,无论其部署在自有服务器、云函数还是直接封装在App中调用第三方API,通常都需要完成备案。

