HarmonyOS鸿蒙Next中App内如何判断是否安装其他地图类软件?以及跳转

HarmonyOS鸿蒙Next中App内如何判断是否安装其他地图类软件?以及跳转 App内如何判断是否安装百度地图App、高德地图App,如果安装地图App,App内点击按钮可以打开百度地图App、高德地图App、系统的地图App,跳转时代入地址快捷导航。

3 回复

【背景知识】

【解决方案】

  • 在entry模块的module.json5文件中配置querySchemes属性:
{
  "module": {
    "querySchemes": [
      "baidumap",
      "amapuri",
      "qqmap",
      "maps"
    ]
  }
}
  • 由于每个应用自定义的拉起导航菜单的界面可能是各不相同,因此界面实现不做深究,这里以自定义弹窗为例。创建自定义弹窗,在弹窗里面定义一个数组mapWays用来存放导航的所有跳转方式,然后通过canOpenLink这个API判断百度地图、高德地图、腾讯地图以及系统自带的地图应用是否可用,如果可用就把对应的跳转方式添加到数组mapWays中,示例代码如下:
@State mapWays: Array<string> = []

aboutToAppear(): void {
    if (bundleManager.canOpenLink('baidumap://map/direction')) {
      this.mapWays.push('百度地图')
    }
    if (bundleManager.canOpenLink('amapuri://com.amap.hmapp')) {
      this.mapWays.push('高德地图')
    }
    if (bundleManager.canOpenLink('qqmap://map/routeplan')) {
      this.mapWays.push('腾讯地图')
    }
    if (bundleManager.canOpenLink('maps://navigation')) {
      this.mapWays.push('地图')
    }
  }
  • 在需要弹出导航菜单的页面中,首先初始化自定义弹窗,然后构造每种方式的Want对象,最后根据对应的跳转方式使用startAbility实现对应的跳转,示例代码如下:
// 自定义弹窗组件
@CustomDialog
struct SelectMapDialog {
  // 弹窗控制器,用于关闭弹窗
  private controller: CustomDialogController;
  private navApps: Array<string> = [];

  build() {
    Column() {
      // 应用列表
      List() {
        ForEach(this.navApps, (app: string) => {
          ListItem() {
            // 应用名称
            Button(app, { type: ButtonType.Normal })
              .backgroundColor(Color.White)
              .fontColor('#ff5176cb')
              .width('100%')
              .margin({ bottom: 2 })
              .onClick(() => {
                // 用户选择了某个应用
                this.itemClick(app);
                this.controller.close();
              })
          }
        }, (app: string) => app)
      }
      .alignListItem(ListItemAlign.Center)
      .borderRadius(5)
      .width('80%')

      // 取消按钮
      Button('取消', { type: ButtonType.Normal })
        .backgroundColor(Color.White)
        .fontColor('#ff5176cb')
        .width('80%')
        .margin({ top: 20 })
        .borderRadius(5)
        .onClick(() => {
          this.controller.close();
        })
    }
    .width('100%')
    .height(this.navApps.length * 50 + 60) 
    .backgroundColor('#00aaaaaa')
  }

  private itemClick: (app: string) => void = () => {
  };
}
// 地图选择框
selectMapDialog: CustomDialogController = new CustomDialogController({
    builder: SelectMapDialog({
      navApps: this.mapWays,
      itemClick: (item: string) => {
        this.naviMapGuide(item, this.latitude, this.longitude, this.destination)
      }
    }),
    alignment: DialogAlignment.Bottom,
    customStyle: true
  })

// 根据选择的地图,拉起对应的地图app,并且规划路径
naviMapGuide(item: string, latitude: number, longitude: number, destination: string) {
    let baiduWant: Want = {
      uri: `baidumap://map/direction?destination=latlng:${latitude},${longitude},|name:${destination}&mode=driving`
    }
    let qqWant: Want = {
      uri: `qqmap://map/routeplan?type=drive&from=我的位置&to=${destination}&tocoord=${latitude},${longitude}`
    }
    let gaodeWant: Want = {
      uri: `amapuri://route/plan?dlat=${latitude}&dlon=${longitude}&dname=${destination}&t=0sourceApplication=测试应用`
    }
    let petalWant: Want = {
      uri: `https://www.petalmaps.com/navigation/?daddr=${latitude},${longitude}(${destination})&type=drive&utm_source=测试应用`

    }
    if (item === '百度地图') {
      this.context.startAbility(baiduWant)
    } else if (item === '高德地图') {
      this.context.startAbility(gaodeWant)
    } else if (item === '腾讯地图') {
      this.context.startAbility(qqWant)
    } else if (item === '地图') {
      this.context.startAbility(petalWant)
    }
    if (this.selectMapDialog != undefined) {
      this.selectMapDialog.close()
    }
  }

更多关于HarmonyOS鸿蒙Next中App内如何判断是否安装其他地图类软件?以及跳转的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,通过BundleManager查询设备已安装应用列表,过滤地图类应用。使用getBundleInfo检查包信息,识别地图应用特征。跳转时调用UIAbilityContextstartAbility方法,传入目标应用包名与Ability名称,通过隐式Want启动目标地图应用。需在module.json5中声明所需权限。

在HarmonyOS Next中,可以通过以下方式判断是否安装第三方地图应用并实现跳转导航功能:

  1. 检测应用是否安装

    • 使用BundleManager查询设备上已安装的应用包名,例如:
      • 高德地图:com.autonavi.minimap
      • 百度地图:com.baidu.BaiduMap
    • 通过getBundleInfo()方法检查对应包名是否存在
  2. 实现应用跳转

    • 使用Want对象配置跳转参数:
    let wantInfo = {
      bundleName: "目标包名",
      abilityName: "目标Ability",
      uri: "geo:地址参数" // 或各地图厂商特定URI格式
    };
    
    • 调用startAbility()触发跳转
  3. 各地图URI格式示例

    • 高德地图:amapuri://route/plan/?dlat=纬度&dlon=经度&dname=地址名称
    • 百度地图:baidumap://map/direction?destination=地址
    • 系统地图:geo:纬度,经度?q=地址
  4. 完整处理流程

    • 先检测已安装的地图应用
    • 在界面中显示可用的地图选项
    • 用户选择后构造对应URI并跳转

注意:需要提前在module.json5中声明相关权限,并确保目标地址参数经过正确的URL编码处理。

回到顶部