
鸿蒙HarmonyOS经典FAQ
文章平均质量分 69
汇总鸿蒙开发中ArkTS语言、ArkUI框架、DevEco编译平台、元服务等多方面经典问题及解决思路。
这货就是木子全呀
这个作者很懒,什么都没留下…
展开
-
【HarmonyOS NEXT】【音频和视频】
WebView策略:目前不支持主动设置流类型,由WebView根据是否有音频输入自动设置为Music或VoiceCommunication类型(有播放流、无录制流,则默认为Music类型;若应用以静音状态开始播放音频(或视频),并且希望静音阶段不影响其他音频,当后续解除静音的时候,再以正常策略申请音频焦点,则可以调用静音并发播放模式的相关接口。(1)应用在启动播放或录制之前,需要根据音频的用途,使用合适的音频流类型,即正确指定StreamUsage或SourceType;接口,设置默认发声设备。原创 2025-01-07 10:42:50 · 1024 阅读 · 0 评论 -
【HarmonyOS NEXT】【图形游戏】如何主动关闭CPU访问窗口缓冲区数据降低功耗
当前操作系统的窗口缓冲区默认使用CPU访问,这样具有较好的兼容性,但GPU访问窗口缓冲区的能效通常更优,使用CPU访问的能效开销较大。当开发者确定应用无需CPU访问时可手动关闭该能力,提高应用能效。如果开发者确认应用不需要使用CPU访问窗口缓冲区数据,应用可在首次获取窗口句柄 (OnSurfaceCreatedCB) 时关闭CPU访问能力,由硬件平台选择最佳的图像格式以提高能效降低功耗。通常自绘制应用在生产缓冲区内容时,会默认使用CPU访问能力。此时由于CPU访问缓冲区效率较低,性能开销较大。原创 2025-01-07 10:41:53 · 158 阅读 · 0 评论 -
【HarmonyOS NEXT】【编译构建】文件没有默认导出,但可以默认导入的场景说明
此场景编译时不报错,原因是编译时的配置文件中开启了allowSyntheticDefaultImports选项,不仅允许没有默认导出的声明文件让另一文件默认导入,还兼容从那些使用 CommonJS(require)导出模块的库中导入默认导出(default exports),例如可以import default默认导入类似react这样的三方库。声明文件没有默认导出,使用 import xxx from ‘module’ 在另一文件默认导入,编译不报错。原创 2025-01-07 10:40:04 · 218 阅读 · 0 评论 -
【HarmonyOS NEXT】DevEco Studio
检查napi_init.cpp文件的RegisterEntryModule函数中是否调用了napi_module_register函数。检查napi_init.cpp文件的Init函数中是否初始化了napi_property_descriptor变量。修改生成NAPI函数的函数参数或返回值类型。原创 2024-12-31 10:12:10 · 400 阅读 · 0 评论 -
【HarmonyOS NEXT】打开工程时左侧目录树不显示
modules文件夹下的iml文件定义了详细的工程模块结构信息,modules.xml定义了工程模块结构文件的位置。删除modules文件夹后根据modules.xml无法找到对应的iml文件。当用户删除工程目录下的.idea/modules文件夹或者.idea/modules文件夹不存在时,如下图所示。需要关闭工程,在文件管理器中删除工程的modules.xml,重新通过IDE打开工程,工程目录树才可以恢复。重新打开工程,左侧目录树不显示,如下图所示。原创 2024-12-31 10:11:27 · 342 阅读 · 0 评论 -
【HarmonyOS NEXT】如何保存网络图片到相册
可以使用安全控件中的保存控件,免去权限申请和权限请求等环节,获得临时授权,保存对应图片。需要申请权限:ohos.permission.INTERNET。原创 2024-12-31 10:10:56 · 254 阅读 · 0 评论 -
【HarmonyOS NEXT】如何同时获取屏幕方向orientation和系统规避区avoidAreaChange信息
接口监听窗口系统规避区域的变化,在callback中获取avoidAreaChange信息,并通过Display实例获取屏幕方向orientation等信息。以折叠屏形态变化时触发为示例,可以在EntryAbility.ets文件中通过。原创 2024-12-24 10:45:40 · 314 阅读 · 0 评论 -
【HarmonyOS NEXT】如何解决Finalizer方法中执行JS代码崩溃问题
Finalizer中,只进行和JS对象生命周期绑定的原生对象的清理,不调用JSVM API。如需实现JS对象生命周期结束后执行一段JS代码的功能,可在Finalizer方法中,将相关代码的执行加入到外层事件循环队列中,等待下次事件循环时调用相关代码,从而实现时间序列上的先后顺序。目前JSVM注册的Finalizer方法中不允许JS代码的执行,在上述崩溃调用栈中,Finalizer方法中调用了OH_JSVM_CallFunction执行了JS代码。原创 2024-12-24 09:54:49 · 226 阅读 · 0 评论 -
【HarmonyOS NEXT】Deveco Studio_应用调试
导致该问题的可能原因为电脑GPU不兼容,或在云桌面的场景下使用DevEco Studio。项,关闭窗口并重启DevEco Studio即可。在DevEco Studio中。,在弹出的窗口中搜索。原创 2024-12-20 16:11:57 · 181 阅读 · 0 评论 -
【HarmonyOS NEXT】Deveco Studio_编译构建7
用下面命令查看es2abc和动态库文件的签名组信息,如果两个文件,一个有签名信息,一个没有签名信息,或者都有签名信息,但是签名信息中属性’TeamIdentifier’的值是不一样的,那就说明问题是签名组不一致导致的,可以使用"解决方案"提供的方式处理。进入sdk中es2abc所在目录:[DevEco-Studio安装目录]/Contents/sdk/default/openharmony/ets/build-tools/ets-loader/bin/ark/build-mac/bin。原创 2024-12-20 16:11:15 · 499 阅读 · 0 评论 -
【HarmonyOS NEXT】Deveco Studio_编译构建6
由于获取SDK的方式是从网络上下载,mac的安全设置会给可执行文件添加来源于网络的标识(com.apple.quarantine),导致无法执行。被编译文件中某函数内部有大量object literal, array iteral和string,导致item的数量超过了上限(65536)。常见于图片中的两种错误同时出现,且仅在Linux系统出现,win/mac不报错。执行命令删除可执行文件的com.apple.quarantine标识。排查相关文件,将存在上述原因的函数进行拆分。解决引用中的大小写问题。原创 2024-12-20 16:08:19 · 298 阅读 · 0 评论 -
【HarmonyOS NEXT】Deveco Studio_编译构建5
通过上述步骤,您可以定位和解决 unknown type name 问题。在使用 CMake、Ninja 和 LLVM 编译 C++ 项目时,确保所有头文件正确包含并设置正确的头文件路径是关键。如果问题依旧存在,详细的编译输出日志通常能提供更多线索,帮助您找到具体的原因。在编译HarmonyOS C++ 项目时,遇到"unknown type name"错误通常表示编译器无法识别某个类型。这可能是因为类型未定义、未包含相关的头文件,或者包含的头文件路径不正确。或手动删除模块下.cxx目录。原创 2024-12-20 16:07:26 · 293 阅读 · 0 评论 -
【HarmonyOS NEXT】Deveco Studio_编译构建4
如果文件中不包含export关键字,该文件将视作全局命名空间的一部分,相当于两个文件实质为同一个文件。请添加export关键字使其成为独立命名空间,或者将声明的内容添加到自定义的命名空间中。部分三方包由npm迁移而来,其开发环境为node, 其中的require语法arkcompiler不完全支持,出现运行报错情况。HSP会生成.d.ts声明文件,由于原始文件中未注明类型,导致生成的.d.ts文件缺少类型注解。报错位置添加类型注解。原创 2024-12-20 16:06:22 · 284 阅读 · 0 评论 -
【HarmonyOS NEXT】Deveco Studio_编译构建3
在使用 CMake、Ninja 和 LLVM 编译 C++ 项目时,确保所有源文件和库文件正确包含在项目中,并正确配置编译和链接选项是关键。如果问题依旧存在,详细的编译和链接输出日志通常能提供更多线索,帮助您找到具体的原因。这通常是因为源文件没有正确编译或链接,或者因为缺少必要的库文件。CMake 和 Ninja 通常会处理这个问题,但在手动编译时可能会出现问题。可使用sdk中内置的nm工具:sdk/default/openharmony/native/llvm/bin/llvm-nm。原创 2024-12-20 16:04:57 · 365 阅读 · 0 评论 -
【HarmonyOS NEXT】Deveco Studio_编译构建2
A:proxyData标识模块提供的数据代理列表,只允许entry和feature配置,不同的proxyData中配置的URI不可重复。遇到此问题,检查模块间是否配置了相同uri的proxyData。签名用的公私钥对不匹配,使用私钥签名后,用公钥验签失败。使用高版本JDK生成密钥对(p12),再使用低版本的JDK执行签名命令时,会因为不兼容导致解析p12失败,从而签名失败。A:请检查当前使用的JDK版本和生产密钥对使用的JDK版本,使用版本匹配的JDK执行签名命令。证书文件解析失败,找不到证书的OID。原创 2024-12-20 16:03:46 · 353 阅读 · 0 评论 -
【HarmonyOS NEXT】Deveco Studio_编译构建1
比如将har模块产物里的so文件拷贝到entry模块的libs目录下,这时har模块里有一个libhar.so,entry模块里也有一个libhar.so,再配置entry依赖har,构建entry就会出现报错。基于上面的例子,可以在entry的build-profile.json5中添加配置select选中har模块中的so文件,package选中包名为“har”的模块, include选中“libhar.so”文件。在引用’xxx’目录时,明确写明引用到’xxx/Index’文件。原创 2024-12-20 15:58:38 · 825 阅读 · 0 评论 -
【HarmonyOS NEXT】投播后支持哪些控制功能
投播成功后,目前在本端支持的功能有:播放、暂停、下一首/曲、上一首/曲、快进、快退、进度控制、音量控制。对端大屏设备支持的功能有:播放、暂停、下一首/曲、上一首/曲、快进、快退、进度控制。暂不支持清晰度切换、音轨切换、倍速、弹幕等功能。原创 2024-12-17 14:59:50 · 164 阅读 · 0 评论 -
【HarmonyOS NEXT】投播成功后,本端应用内该如何显示
应用在感知到设备连接成功后,本端的客户端界面一般要适配为遥控器状态,以达成更好的投播体验。原创 2024-12-17 14:58:44 · 146 阅读 · 0 评论 -
【HarmonyOS NEXT】应用内如何进行输出设备的选择
系统当前未直接提供切换输出设备的接口,但是提供了投播组件来支持设备的切换。开发者可以集成AVCastPicker嵌入在应用界面内实现设备切换。AVCastPicker支持一些自定义能力来满足应用对界面一致性的诉求。原创 2024-12-17 14:57:08 · 224 阅读 · 0 评论 -
【HarmonyOS NEXT】如何自定义投播组件
图标默认颜色、选中后的颜色、组件深浅色的适配、以及组件内元素的自定义。实现步骤,可以参考链接。原创 2024-12-17 14:56:05 · 177 阅读 · 0 评论 -
【HarmonyOS NEXT】系统是否支持DLNA设备投屏
系统当前同时支持Cast+协议和DLNA协议的设备进行资源投播。应用可以在创建AVSession的时候,传入需要发现和过滤的协议类型,来匹配应用期望的投屏设备。参考开发步骤中的第二步:设置媒体资源信息。原创 2024-12-17 14:55:10 · 270 阅读 · 0 评论 -
【HarmonyOS NEXT】如何做到连续投播
对于切换剧集(同一电视剧不同集或预告、花絮等)的场景,为了方便用户,此时不应该结束投播,应获取到下一集的播放URL,继续自动投播下一集。应用在收到上一资源结束的回调,或者判断播放进度距离结束还有较短时间内(比如5秒),需要准备下一个资源,以达成连续投播的效果。原创 2024-12-17 14:54:20 · 90 阅读 · 0 评论 -
【HarmonyOS NEXT】如何在播控中心显示歌词
开发者需要在创建AVSession后,把完整的歌词内容设置到AVMetadata中。歌词格式为标准的lyric格式,暂不支持其他格式的歌词类型。原创 2024-12-17 14:53:33 · 187 阅读 · 0 评论 -
【HarmonyOS NEXT】能否定制播控中心界面上显示的控制元素
audio类型,播控中心的控制。原创 2024-12-17 14:43:06 · 187 阅读 · 0 评论 -
【HarmonyOS NEXT】为什么接入播控后,播控中心部分按钮是灰色的,不可点击
系统的播控中心会根据应用是否注册对应的控制命令,在界面中呈现对应的元素是否可以控制。应用根据自己支持的能力,按需注册;推荐使用支持播控中心内的元素,以达成较好的体验。原创 2024-12-17 14:41:52 · 189 阅读 · 0 评论 -
【HarmonyOS NEXT】应用如何更新进度条
应用如果期望在播控中心内支持进度显示和控制,需要将资源的时长信息设置给AVSession,同时需要注册seek的回调接口来响应系统的进度控制。应用更新进度条,可以在倍速、播放状态发生变化时更新,不需要实时更新,可以节约一些系统资源。原创 2024-12-17 14:40:55 · 188 阅读 · 0 评论 -
【HarmonyOS NEXT】如何响应播控中心的播放模式切换
应用在创建AVSession后,要监听系统切换播放模式的接口来处理播控中心的控制命令。目前支持四种播放模式:顺序播放,随机播放,单曲循环,列表循环。应用在收到回调时,会同时获取一个当前的播放模式,应用可以自行决定下一个播放模式,然后把新的播放模式设置给AVSession。原创 2024-12-17 14:39:37 · 229 阅读 · 0 评论 -
【HarmonyOS NEXT】在display.on(‘change‘)监听回调中,无法使用Window实例获取更新后的窗口大小
由于旋转完后display的更新时间早于window的更新时间(display旋转时直接宽高互换,提前可预知;window要等ArkUI布局完成才能确定窗口大小,耗时长),故在display触发变化时获取窗口信息会存在时序问题(窗口信息还未更新完成,此时使用Window实例获取到的还是原来的宽高)。应用可以通过display.on(‘change’)接口监听显示设备变化,在callback中通过Display实例获取屏幕的width、height、orientation等信息。原创 2024-12-16 14:56:13 · 236 阅读 · 0 评论 -
【HarmonyOS NEXT】如何获取状态管理框架代理前的原始对象
使用getTarget接口获取状态管理框架代理前的原始对象。原创 2024-12-16 14:53:48 · 103 阅读 · 0 评论 -
【HarmonyOS NEXT-FAQ】ArkTS
ArkTS 正则对于pattern为非基本多语言平面(Basic Multilingual Plane, BMP)的字符且不带/u参数时无法匹配,若需要匹配非BMP字符,需带上/u参数。ArkTS对于该正则无法匹配,因此不会替换。原创 2024-12-16 14:49:48 · 161 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之ArkTS语言(线程模型和并发-2)
同时,ArkTS提供了TaskPool并发API,类似GCD的线程池能力,可以执行任务,而且不需要开发者进行线程生命周期管理。Task会被调度到有限数量的工作线程执行,多个task会共享这些工作线程(ArkTS引擎实例),系统会根据负载情况扩容/缩容工作线程的数量,充分发挥硬性性能。ArkTS的多线程是基于事件共享实现的,其数据交换是基于事件进行传递对象,不会出现类似Java的内存共享型多线程出现的多线程操作同一个数据的情况,所以不存在线程安全的问题。可以,TaskPool动态加载能力跟主线程能力一致。原创 2024-09-06 09:47:58 · 1062 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之ArkTS语言(线程模型和并发-1)
JS线程的I/O异步操作,会在I/O线程执行,JS线程可以同时执行其他操作,不存在阻塞等待问题。同时,ArkTS提供了TaskPool并发API,类似GCD的线程池能力,可以执行任务,而且不需要开发者进行线程生命周期管理。在ArkTS中使用Worker创建线程,Worker线程在主线程中创建,与主线程相互独立,但不能直接操作UI,最多可以创建64个Worker线程。HarmonyOS提供的异步I/O调用均分发到I/O线程池,不会阻塞应用线程,因此不需要独占线程调用I/O,所需的线程数量远小于其他操作系统。原创 2024-09-06 09:47:04 · 1217 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之ArkTS语言(ArkTS-4)
在hvigor->hvigor-config.json5中"logging": { //"level": "info" }的注释取消 ,改为debug,改完后的结果为"logging": { "level": "debug" },在编译时就可以看到编译的详细过程。目录:build/default/cache/default/default@CompileArkTS/esmodule/release/obfuscation/nameCache.json。原创 2024-09-06 09:46:18 · 1123 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之ArkTS语言(ArkTS-3)
TaskPool:TaskPool自行管理生命周期,无需关心任务负载高低,TaskPool最多为cpu online个数 - 1,8核通常为7个,根据负载扩缩容,外部无法控制和超出,如果同时启用超过,则会等待。不支持在TS文件中调用ArkTS文件,对于某些在ArkTS中禁用的语法,例如:with语句等,可以考虑在TS文件中进行编写,再在ArkTS文件中调用的方式实现。ArkTS是静态类型,而解构是依赖于结构兼容性的动态特性并且解构声明中的名称必须和解构对象中的属性名称一致,因此不支持解构。原创 2024-09-06 09:45:15 · 1048 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之ArkTS语言(ArkTS-2)
ArkTS基于兼容了TS语法,继承了TS的所有特性,当前,ArkTS在TS的基础上主要扩展了声明式UI能力,让开发者能够以更简洁、更自然的方式开发高性能应用。推荐用ArKTS开发UI相关内容,TS可以用来开发业务逻辑相关内容。ts文件不支持调用ets文件中定义的方法。ets调用ts文件中定义的方法,可以使用ES6中import引入及export导出的语法,将ts文件中的方法进行export导出,在ets文件中import引入该方法进行调用。原创 2024-09-06 09:44:29 · 1337 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之ArkTS语言(ArkTS-1)
区别如下:自定义构建函数(@Builder)更轻量,其作为UI元素抽象的方法,实现和调用相较于自定义组件比较简洁。在自定义组件中,可以定义成员函数/变量、自定义组件生命周期等。而自定义构建函数(@Builder)不支持定义状态变量和自定义生命周期。在自定义组件中,可直接通过状态变量的改变,来驱动UI的刷新。而自定义构建函数(@Builder)默认的按值参数传递方式不支持动态改变组件,当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新,要实现UI动态刷新需要。原创 2024-09-06 09:43:58 · 682 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之应用框架(ArkUI-17)
可以使用promptAction结合ComponentContent实现自定义分享弹窗。原创 2024-09-05 10:45:10 · 452 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之应用框架(ArkUI-16)
比如一个自定义的Component,有20个@State修饰的变量,每个State都定义了相关更新接口,外部某个时机,会批量更新这些State,调用每个State的更新接口,会不会导致频繁更新Component组件,导致性能问题?同时对多个State接口更新不会导致性能问题,因为每个@State都要有去更新UI的能力,一次性批量的修改不会导致一个组件被反复刷多次,在一个Vsync内,对同一个组件的多次标脏只刷新一次。如果状态变量数量过多会影响自定义组件创建耗时。原创 2024-09-05 10:44:40 · 529 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之应用框架(ArkUI-15)
Text组件绑定bindSelectionMenu自定义菜单,长按弹出自定义菜单,使用closeSelectionMenu关闭自定义菜单,文本选中状态不会取消。该场景下要取消选中状态可以使用selection重新设置选中区域,在调用closeSelectionMenu关闭自定义菜单时重新设置selection的start、end即可取消选中状态。原创 2024-09-05 10:42:33 · 537 阅读 · 0 评论 -
【HarmonyOS NEXT】FAQ之应用框架(ArkUI-14)
目前策略是不支持自定义图标。原创 2024-09-05 10:42:01 · 507 阅读 · 0 评论