本文原创发布在华为开发者联盟社区,欢迎前往原帖“答开发者问”之HarmonyOS技术问题解析 第19期 ,直接与知识贡献者进行交流。
本期问题如下:
4、如何判断H5页面是通过HarmonyOS的webview打开的?
向所有参与社区互助的开发者致以最诚挚的感谢!
若您在开发中遇到技术问题,欢迎前往问答-我要提问题进行提问。更快得到问题答案的秘诀我们为您整理好了,点击链接即可获取:提问小技巧
答开发者问系列汇总:“答开发者问”系列汇总(持续更新中...)
问题一:如何判断 USB 设备是否是存储设备?
使用 usbManager.getDevices 获取所有的 USB 设备信息,那么如何判断是否是存储设备呢,是通过 USBEndpoint 类型中的 type 字段吗?端点为 2 代表批量传输端点,也就是存储设备的意思吗?
解决方案:
端点类型(endpoint.type=2)仅表示该端点支持批量传输,但并非 U 盘的独占特征(其他设备如打印机也可能使用批量传输)。
通过判断
USBDevice.clazz === 8且USBInterface.clazz === 8来识别 U 盘等存储设备,而非依赖端点类型字段。
操作步骤:
1. 调用usbManager.getDevices() 获取设备列表。
2. 遍历设备列表,检查每个设备的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盘类设备"); } } }}原链接:
如何识别判断USB设备是U盘这样的存储设备-华为开发者问答 | 华为开发者联盟 (huawei.com)
问题二:如何读取 rawfile 目录下.db 文件中的数据?
如何读取 rawfile 目录下.db 文件中的数据?
解决方案:
参考读写rawfile目录下的文件和如何读取本地/预制数据库。
1. 将 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}.`); }}2. 通过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;}原链接:
怎么读取rawfile里面的.db文件中的数据?-华为开发者问答 | 华为开发者联盟 (huawei.com)
问题三:如何开发锁屏卡片?
锁屏卡片的开发文档没有详细的教程,只有一些配置信息,不知道怎么去开发。
解决方案:
锁屏卡片 UI 开发可以参考ArkTS卡片开发文档,卡片开发好后按照锁屏卡片开发指导文档中的步骤申请锁屏卡片开放能力并在 form_config.json 配置文件中配置 renderingMode 和 supportDimensions 字段即可。
注意:
锁屏卡片只支持 1*1、1*2 尺寸的卡片;
锁屏卡片不推荐展示用户个人隐私敏感数据,具体界面约束请参考卡片内容设计;
原链接:
锁屏卡片的开发文档没有详情的教程,不知道怎么开发?-华为开发者问答 | 华为开发者联盟 (huawei.com)
问题四:如何判断 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包含特定的字符?-华为开发者问答 | 华为开发者联盟 (huawei.com)
问题五:使用云函数开发作为后端,需要备案吗?
应用后端服务器只做了一次 ai 大模型的 api 调用,也可以把大模型 api 调用改到 app 中,这样应用就“没有自己服务器”了,但还是联网调用了大模型 api。请问这种方式,或者是使用云函数开发作为后端,app 还需要在工信部备案么?
解决方案:
审核时会检查应用功能联网情况,如果断网情况下不影响使用的,可以算单机,无需备案;
如果功能需要联网实现,是需要备案的。
可参考APP备案补充指引(含无需备案的场景,此外其他均需要正常备案),APP备案FAQ。





