HarmonyOS NEXT鸿蒙开发:同应用跨设备数据同步-申请权限

本博客根据 HarmonyOS NEXT鸿蒙开发:申请user_grant权限封装模块 修改

配置权限

在应用配置文件中声明必要权限,否则无法访问分布式设备和同步数据

局域网内设备同步

跨设备同步,需要向用户申请 DISTRIBUTED_DATASYNC 权限

鸿蒙分布式软总线的核心是 近距离设备直连,即:同一 Wi-Fi 局域网内 的设备(如手机 + 平板连同一路由器)、或 通过蓝牙配对的设备,同步数据时走 “设备间直连通道”,不经过公网,因此无需 INTERNET 权限

必须添加下面权限:

{
  "module": {
    "package": "com.your.app.package",
    "reqPermissions": [
      {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC", // 分布式数据同步核心权限
        "reason": "$string:distributed_datasync_reason",
        "usedScene": {
          "abilities": ["EntryAbility"], // 关联的Ability
          "when": "always"
        }
      }
    ]
  }
}

在 \resources\base\element\string.json 添加申请权限原因:

{
  "name": "distributed_datasync_reason",
  "value": "需要分布式存储权限"
}

跨局域网 / 远程同步(需要 INTERNET)

若需实现 “不在同一局域网的设备同步”(如手机在家、平板在公司),鸿蒙会通过华为账号关联的云同步服务中转数据:
数据先上传到华为云,再同步到远端设备,此时必须申请 INTERNET 权限;
此外,若你的应用本身有网络请求(如接口调用、云备份),也需主动声明该权限。

根据情况需要,添加下面权限:

ohos.permission.INTERNET

向用户申请授权

同时需要在应用 首次启动 时 弹窗向用户申请授权

第一次启动申请权限

第一次启动申请权限,在 EntryAbility.ets 中加上下面代码:

async onWindowStageCreate(windowStage: window.WindowStage): Promise<void> {
  // Main window is created, set main page for this ability
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

  windowStage.loadContent('pages/Index', async (err) => {
    if (err.code) {
      hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
      return;
    }
    // 第一次启动申请权限
    const pg = 'ohos.permission.DISTRIBUTED_DATASYNC'
    const reason = '需要使用分布式数据库权限'
    const cpg = await checkPermissionGrant(pg)
    if(cpg){
      console.log(TAG,` 检测授予 ${pg} 授权`)
    }else{
      // 申请所有权限
      // requestAllPermissionsFromUser(getContext())
      // 只分布式数据同步权限
      try {
        const uiContext = windowStage.getMainWindowSync().getUIContext()
        requestPermissionFromUserAndShow(pg,reason,uiContext)

      }catch (err) {
        console.error(TAG,`getMainWindowSync() 报错!code:${err.code},message:${err.message}`)
      }
    }
    hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
  });
}

二次申请权限

第一次运行申请权限,如果拒绝,在首页中,二次申请权限

在 Index.ets 中,加上下面代码

async aboutToAppear(): Promise<void> {
  const pg = 'ohos.permission.DISTRIBUTED_DATASYNC'
  const reason = '需要使用分布式数据库权限'
  await LoginKVStoreUtils.init(this.getUIContext().getHostContext()!)
  const cpg = await checkPermissionGrant(pg)
  if(cpg){
    console.log(TAG,` 检测授予 ${pg} 授权`)
  }else{
    // 二次申请
    try {
      const context = this.getUIContext().getHostContext()
      if (context != null) {
        const rpos = await requestPermissionOnSetting(pg, context)
        if (!rpos) {
          try {
            this.getUIContext().getPromptAction().showToast({
              message: reason, // 提示文本
              duration: 2000, // 显示时长(毫秒),默认1500ms,范围[1500, 3000]
              bottom: 100 // 距离屏幕底部的距离(像素)
            });
          } catch (error) {
            console.error(TAG, "promptAction.showToast() 报错!")
          }
        }
      }

    }catch (err) {
      console.error(TAG,`getMainWindow() 报错!code:${err.code},message:${err.message}`)
    }
  }
}

原文出处:/show_1GW2QinZffWU.html