本文原创发布在华为开发者联盟社区,欢迎前往原帖“答开发者问”之HarmonyOS技术问题解析 第19期 ,直接与知识贡献者进行交流。
本期问题如下:
1、如何判断USB设备是否是存储设备?
2、如何读取rawfile目录下.db文件中的数据?
3、如何开发锁屏卡片?
4、如何判断H5页面是通过HarmonyOS的webview打开的?
5、使用云函数开发作为后端,需要备案吗?
向所有参与社区互助的开发者致以最诚挚的感谢! 若您在开发中遇到技术问题,欢迎前往问答-我要提问题进行提问。 更快得到问题答案的秘诀我们为您整理好了,点击链接即可获取:提问小技巧
答开发者问系列汇总: “答开发者问”系列汇总(持续更新中…)
问题一:如何判断USB设备是否是存储设备?
使用usbManager.getDevices获取所有的USB设备信息,那么如何判断是否是存储设备呢,是通过USBEndpoint类型中的type字段吗?端点为2代表批量传输端点,也就是存储设备的意思吗?
解决方案:
- 端点类型(endpoint.type=2)仅表示该端点支持批量传输,但并非U盘的独占特征(其他设备如打印机也可能使用批量传输)。
- 通过判断 USBDevice.clazz === 8 且 USBInterface.clazz === 8 来识别U盘等存储设备,而非依赖端点类型字段。
操作步骤:
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目录下的文件和如何读取本地/预制数据库。
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}.`); } }
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。
原链接:
云函数开发作为后端,还需要备案吗?-华为开发者问答 | 华为开发者联盟 (huawei.com)




