• 作者:老汪软件技巧
  • 发表时间:2024-08-24 21:07
  • 浏览量:

1 前言

“我的位置”功能在表象上或许给人以简单之感,但从专业角度深入剖析,其蕴含着极为可观的信息量与巨大潜力。此功能绝非仅仅局限于作为一个单纯显示用户当前所处地点的标识,而确切地说是连接用户与周边世界、实现个性化服务的关键纽带。无论是在日常出行导航领域,还是社交互动方面;无论是便捷的生活服务范畴,还是丰富的旅游体验场景,“我的位置”在各个领域的应用程序中均发挥着至关重要的专业作用。其背后所涉及的技术原理、丰富的应用场景以及对用户生活产生的深远影响,均值得专业人士进行深入探讨与研究。

2 不同类型应用中的使用场景2.1 导航类应用2.2 社交类应用2.3 生活服务类应用2.4 旅游类应用

当然,“我的位置” 这项功能的应用绝不仅仅局限于上文所提及的那些场景。实际上,它在更多的领域中同样能够发挥出至关重要的作用。比如在救援行动中,当人们遭遇紧急情况时,准确的 “我的位置” 信息可以迅速传递给救援人员,使得救援行动能够更加高效地展开。无论是在山区的迷路救援、海上的遇险救助,还是城市中的突发事件应对,“我的位置” 都能成为连接受困者与救援力量的关键纽带,为生命的救援争取宝贵的时间。它如同黑暗中的一盏明灯,为处于困境中的人们指引着希望的方向,让救援行动更加精准、及时、有效。

3 前期准备3.1 配置Client ID

实际应用开发中,当你打算使用地图服务(Map Kit)时,首先需要在AppGallery Connect平台上创建相应的应用。在创建完成后,要准确地获取“项目设置 > 常规 > 应用”的Client ID,这里需要特别注意的是,一定不能获取项目的Client ID,两者有着明确的区分。获取正确的Client ID之后,接下来要在工程entry模块的module.json5文件中进行特定的操作。具体而言,就是要在这个文件中新增metadata,将其配置为name属性设置为client_id,value属性为获取到的Client ID值。

{
  "module": {
    ...
    "metadata": [
      {
        "name": "client_id",
        "value": "xxxxxx"
      }
    ]
  }
}

3.2 开通地图服务

当完成Client ID的配置工作后,接下来还需要在AppGallery Connect平台该应用的“项目设置 > API管理”板块中打开地图服务开关。

3.3 添加公钥指纹

除了满足以上两个条件,还需要为应用添加公钥指纹,才能够确保地图服务(Map Kit)在应用中正常使用和发挥其强大的功能。

位置解析失败__解析地址错误是什么意思

4 开发步骤

目前有两种方式可用于在地图上显示我的位置。推荐采用安全控件LocationButton方式,此方式能够临时获取精准定位权限,无需进行权限弹框授权确认。另一种方式则是申请授权方式,该方式需要动态向用申请设备位置信息ohos.permission.LOCATION和设备模糊位置信息ohos.permission.APPROXIMATELY_LOCATION两个权限。

4.1 使用安全控件方式

安全控件是一种可融入应用页面,实现用户点击自动授权,而无需弹窗授权。相较于动态申请权限方式,安全控件可基于场景化授权,简化开发者和用户的操作,优点如下:

位置控件(LocationButton)是目前系统提供的安全控件之一,该控件对应精准定位特权。应用集成位置控件后,用户点击该控件,无论应用是否申请过或者被授予精准定位权限,都会在本次前台期间获得精准定位的授权,可以调用位置服务获取精准定位。

使用LocationButton可使用默认创建带有图标、文本、背景的位置按钮,也可以通过创建指定LicationButtonOptions元素的位置按钮。

// 默认创建带有图标、文本、背景的位置按钮
LocationButton()
// 创建包含指定元素的位置按钮
LocationButton(option: LocationButtonOptions)
/**
 * 指定元素的位置按钮
 */
declare interface LocationButtonOptions {
    /**
     * 设置位置按钮的图标风格。
     * 不传入该参数表示没有图标,icon和text至少存在一个。
     * LocationIconStyle.FULL_FILLED	填充样式图标
     * LocationIconStyle.LINES	线条样式图标
     */
    icon?: LocationIconStyle;
    /**
     * 设置位置按钮的文本描述。
     * 不传入该参数表示没有文字描述,icon和text至少存在一个。
     * LocationDescription.CURRENT_LOCATION	当前位置
     * LocationDescription.ADD_LOCATION	添加位置
     * LocationDescription.SELECT_LOCATION	选择位置
     * LocationDescription.SHARE_LOCATION	共享位置
     * LocationDescription.SEND_LOCATION	发送位置
     * LocationDescription.LOCATING	定位
     * LocationDescription.LOCATION 位置
     * LocationDescription.SEND_CURRENT_LOCATION	发送实时位置
     * LocationDescription.RELOCATION	重定位
     * LocationDescription.PUNCH_IN	大卡定位
     * LocationDescription.CURRENT_POSITION	所在位置
     */
    text?: LocationDescription;
    /**
     * 设置位置按钮的背景样式。
     * 不传入该参数,系统默认提供Capsule类型按钮。
     * ButtonType.Capsule	胶囊型按钮
     * ButtonType.Circle	圆形按钮
     * ButtonType.Normal	普通按钮
     */
    buttonType?: ButtonType;
}

LocationButton组件不支持通用属性,仅支持安全控件通用属性,如设置安全控件上图标尺寸iconSize();设置安全控件上图标和文字分布的方向layoutDirection();设置绝对定位,设置安全控件的左上角相对于父容器左上角的便宜位置position();设置安全控件相对于自身布局位置的坐标偏移offset()等,具体可参见安全控件通用属性。

LocationButton组件不支持通用事件,仅支持onClick(event: (event: ClickEvent, result: LocationButtonOnClickResult) => void)事件。

/**
 * 位置权限的授权结果
 */
declare enum LocationButtonOnClickResult {
    /**
     * 位置按钮点击后授权成功。
     */
    SUCCESS = 0,
    /**
     * 位置按钮点击后位置权限授权失败。
     */
    TEMPORARY_AUTHORIZATION_FAILED = 1
}

使用安全控件LocationButton可以在点击安全控件后,开启“我的位置”功能。

LocationButton()
  .onClick((event: ClickEvent, result: LocationButtonOnClickResult) => {
    console.log(`[LearningMapKit]位置权限的授权结果:${result}`);
    this.myLocationBtnStatus = true;
    // 启用我的位置图层
    this.mapController?.setMyLocationEnabled(true);
    // 启用我的位置按钮
    this.mapController?.setMyLocationControlsEnabled(true);
  })

4.2 使用用户授权方式

使用用户授权方式,需要先申请ohos.permission.LOCATION和ohos.permission.APPROXIMATELY_LOCATION

权限。