【每日学点鸿蒙知识】跳转三方地图、getStringSync性能、键盘避让模式等

ops/2025/1/11 11:16:35/

1、跳转三方地图导航页

类似于Android 跳转到地图APP 导航页面:

// 目标地点的经纬度和名称 
double destinationLat = 36.547901; 
double destinationLon = 104.258354; 
String destinationName = "目的地名称"; 
// 构建URI Uri uri = Uri.parse("amapuri://route/plan/?dlat=" + destinationLat + "&dlon=" + destinationLon + "&dname=" + destinationName + "&dev=0&t=0"); 
// 创建Intent并启动活动 
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addCategory(Intent.CATEGORY_DEFAULT); 
intent.setPackage("com.autonavi.minimap"); 
if (intent.resolveActivity(getPackageManager()) != null) 
{ startActivity(intent); 
} else 
{ // 提示用户未安装高德地图 Toast.makeText(this, "请先安装高德地图", Toast.LENGTH_LONG).show(); 
}

跳转花瓣地图参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/map-petalmaps-V5

import { common, Want } from '@kit.AbilityKit';
let petalMapWant: Want = {bundleName: 'com.huawei.hmos.maps.app',uri: 'maps://routes',parameters: {linkSource: 'com.other.app',destinationLatitude: 31.983015468224288,destinationLongitude: 118.78058590757131,destinationPoiId: '2031694785326435456',destinationName: '南京(雨花)国际软件外包产业园'}
}let context = getContext(this) as common.UIAbilityContext;
context.startAbility(petalMapWant);

跳转高德地图参考:https://lbs.amap.com/api/amap-mobile/gettingstarted

let want: Want = {uri: 'amapuri://route/plan?sid=BGVIS1&dlat=39.98848272&dname=B&slat=39.92848272&dlon=116.47560823&did=BGVIS2&slon=116.39560823&sname=A&t=0'
}
// this.context:一般是在 Component 组件里调用 getContext(this) as common.UIAbilityContext 获取到的 UIAbilityContext
this.context.startAbility(want, (err: BusinessError) => {if (err.code) {// 处理业务逻辑错误console.error(`startAbility failed,code is ${err.code},message is ${err.message}`);return}// 执行正常业务console.info('startAbility succeed')
})

2、限制输入框最大字节数

TextArea 输入框可以通过maxLength设置最大输入字符数,但是如何设置最大输入的字节数?utf-8每个字符占用字节数量不一致,无法直接转换,Android EditText
提供了setFilters方式:

InputFilter[] inputFilters = new InputFilter[1];  
inputFilters[0] = new ByteLengthInputFilter(MSG_LENGTH_LIMIT_BYTES);  
mEditText.setFilters(inputFilters);public class ByteLengthInputFilter implements InputFilter {  private final int mMax;  private final Charset mCharset;  private final CharsetDecoder mCharsetDecoder;...
}

鸿蒙目前没有提供这种机制,期待后面版本迭代更新。

3、getStringSync性能问题

使用系统提供的getStringSync耗时有点高,要几毫秒,必须使用异步的回调的方式吗:

static getStringSync(context: common.Context | undefined, resource: Resource): string {  let rscManager = (context ?? getContext() as common.UIAbilityContext).resourceManager;  return rscManager.getStringSync(resource)  
}

可以改成rscManager.getStringSync(resource.id),使用id方式可以减少到40us。

4、如何设置键盘的避让模式

可以设置键盘避让模式,默认是KeyboardAvoidMode.OFFSET,:

this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE)

5、调用NAPI 中的C 方法报错:Cannot read property encodeLame of undefined

创建Native C++模块,直接运行Add Demo没有问题,但是使用预编译的MP3编码器的SO 后,调用所有的NAPI 方法都报错:Cannot read property encodeLame of undefined,不依赖MP3 SO库Add 方法可以调用成功。MP3 SO库没有问题:

$ ls -la
total 1648
drwxr-xr-x@ 7 shen  staff     224  8 12 23:29 .
drwxr-xr-x@ 6 shen  staff     192  8 12 23:29 ..
-rw-r--r--@ 1 shen  staff  484466  8 12 23:29 libmp3lame.a
-rwxr-xr-x@ 1 shen  staff    1007  8 12 23:29 libmp3lame.la
lrwxr-xr-x@ 1 shen  staff      19  8 12 23:29 libmp3lame.so -> libmp3lame.so.0.0.0
lrwxr-xr-x@ 1 shen  staff      19  8 12 23:29 libmp3lame.so.0 -> libmp3lame.so.0.0.0
-rwxr-xr-x@ 1 shen  staff  348448  8 12 23:29 libmp3lame.so.0.0.0

依赖方式:

add_library(lame SHARED IMPORTED)  
set_target_properties(lame  PROPERTIES  IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lame/libs/${OHOS_ARCH}/libmp3lame.so)  add_library(audio_engine SHARED napi_init.cpp)  
target_link_libraries(audio_engine PUBLIC libace_napi.z.so lame)

问题原因:不能直接将libmp3lame.so.0.0.0 重命名为libmp3lame.so后使用,要使用libmp3lame.so.0。
当前应用的so是IDE侧打包带入的,允许应用通过 libxxx.so.x的方式提供so,如果需要同时带入两个版本的 so,real name 与 so name 名字要相同,明确到主版本号libxxx.x,不需要带上 .y.z;所以目前libxxx.so是能够使用的,libxxx.3.1以及libxxx.so.3.1.0需要改成libxxx.x的形式使用。然后需要在CMakeLists.txt文件中重新配置并编译。
参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-ndk-36-V5


http://www.ppmy.cn/ops/149146.html

相关文章

【Linux 之一 】Linux常用命令汇总

Linux常用命令 ./catcd 命令chmodclearcphistoryhtoplnmkdirmvpwdrmtailunamewcwhoami 我从2021年4月份开始才开始真正意义上接触Linux,最初学习时是一脸蒙圈,啥也不会,啥也不懂,做了很多乱七八糟,没有条理的笔记。不知…

易于使用和学习的编程语言Arc(list)入门手册

Arc是一种Lisp方言的编程语言。它是由Paul Graham开发的,旨在简化Lisp的语法和语义,使其更易于使用和学习。Arc的设计目标是提供一种简洁而强大的编程语言,适用于快速开发Web应用程序。它具有动态类型、自动内存管理和强大的元编程能力。Arc还…

赛车微型配件订销管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 赛车微型配件行业通常具有产品多样性、需求不确定性、市场竞争激烈等特点。配件供应商需要根据市场需求及时调整产品结构和库存,同时要把握好供应链管理和销售渠道。传统的赛车微型配件订销管理往往依赖于人工经验和简单的数据分析,效率低下且容易…

多模态人工智能在零售业的未来:通过GPT-4 Vision和MongoDB实现智能产品发现

多模态人工智能在零售业的未来:通过GPT-4 Vision和MongoDB实现智能产品发现 引言 想象一下,顾客在购物时只需上传一张他们所期望的服装或产品的照片,几分钟内便能收到来自他们最喜欢的商店的个性化推荐。这就是多模态人工智能在零售领域所带…

Dart语言的语法糖

Dart语言的语法糖 Dart是一种由Google开发的现代编程语言,广泛应用于移动应用、Web开发以及服务端编程。作为一门优雅且高效的语言,Dart不仅强调可读性和简洁性,还提供了多种语法糖,使得开发者能够以更简洁的方式表达复杂的逻辑和…

《鸿蒙系统AI技术:筑牢复杂网络环境下的安全防线》

在当今数字化时代,复杂网络环境给智能系统带来了诸多安全挑战,而鸿蒙系统中的人工智能技术却展现出强大的安全保障能力,为用户在复杂网络环境中的安全保驾护航。 微内核架构:安全基石 鸿蒙系统采用微内核架构,将核心…

计算机网络之---物理层设备

什么是物理层设备 物理层设备是指负责数据在物理媒介上传输的硬件设备,它们主要处理数据的转换、信号的传输与接收,而不涉及数据的内容或意义。常见的物理层设备包括网卡、集线器、光纤收发器、调制解调器等。 物理层设备有哪些 1、网卡(N…

maven发包because “server“ is null

出现 [ERROR] Failed to execute goal org.sonatype.central:central-publishing-maven-plugin:0.4.0:publish (injected-central-publishing) on project com.sedi.snowflake: Execution injected-central-publishing of goal org.sonatype.central:central-publishing-maven-…