flutter鸿蒙适配问题

59 阅读1分钟

今天在flutter鸿蒙适配过程中遇到一个问题,获取不到定位权限。 权限插件是在pubspec.ymal文件中通过dependency_overrides集成的

dependency_overrides:
  permission_handler:
    git:
      url: https://gitcode.com/CPF-Flutter/flutter_permission_handler.git
      path: permission_handler

申请权限代码如下

requestPermissions() async {
    Map<Permission, PermissionStatus> statuses = await [      Permission.location,      Permission.storage,    ].request();
    debugPrint(' 测试测试 :${statuses[Permission.location].toString()}');
  }

但是打印内容如下

image.png

相同的代码我又测了iOS端显示如下

image.png

后来让AI分析一遍路径才发现是鸿蒙端权限没声明。 怪我鸿蒙原生不够熟😂😂😂,当然按理说这种配置问题应该报错才对啊。。

具体怎么申明也查了AI具体如下

在鸿蒙项目对应模块(如 entry)的 src/main/module.json5 文件中,将 requestPermissions 部分修改为如下格式:

json5

"requestPermissions": [
  // 其他权限声明...
  {
    "name": "ohos.permission.APPROXIMATELY_LOCATION",
    "reason": "$string:app_locate_reason", // 重点:引用一个字符串资源
    "usedScene": {
      // 填写你的 Ability 名称,通常是 "EntryAbility"
      "abilities": ["EntryAbility"],
      // "inuse" 表示仅在前台使用时授权,"always" 表示始终允许
      "when": "inuse"
    }
  }
]

1. reason 字段:声明权限原因

reason 字段用于向用户解释为什么你的应用需要这个权限。它的值必须是引用 $string:xxx 的形式,不可以直接写字符串

  • 配置步骤:

    1. 打开模块路径下的 src/main/resources/base/element/string.json 文件。

    2. 在 "strings" 数组内,添加如下配置项:

      json

      {
          "name": "app_locate_reason",
          "value": "用于为您提供附近的服务和精准信息" // 请根据你的实际场景填写
      }
      
    3. 如果需要支持英文,请在 resources/zh/element/ 和 resources/en/element/ 等对应国际化文件夹下的 string.json 中,配置相同 name 但不同 value 的键值对

2. usedScene 字段:描述使用场景

usedScene 对象用于声明权限的使用场景,其中 when 字段的取值如下:

  • "inuse" : 表示仅在前台使用时授权,对应 iOS 的 "While Using"。
  • "always" : 表示始终允许,对应 iOS 的 "Always"。如果选择 always,通常需要额外配合后台定位权限 ohos.permission.LOCATION_IN_BACKGROUND