HarmonyOS NEXT鸿蒙开发:同应用跨设备数据同步-申请权限 作者:马育民 • 2025-12-18 17:29 • 阅读:10007 本博客根据 [HarmonyOS NEXT鸿蒙开发:申请user_grant权限封装模块](https://www.malaoshi.top/show_1GW2O6eNJjE3.html "HarmonyOS NEXT鸿蒙开发:申请user_grant权限封装模块") 修改 # 配置权限 在应用配置文件中声明必要权限,否则无法访问分布式设备和同步数据 ### 局域网内设备同步 跨设备同步,需要向用户申请 `DISTRIBUTED_DATASYNC` 权限 鸿蒙分布式软总线的核心是 **近距离设备直连**,即:同一 **Wi-Fi 局域网内** 的设备(如手机 + 平板连同一路由器)、或 **通过蓝牙配对的设备**,同步数据时走 **“设备间直连通道”**,**不经过公网,因此无需 INTERNET 权限** 必须添加下面权限: ```json { "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 { // 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 { 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}`) } } } ``` 原文出处:http://malaoshi.top/show_1GW2QinZffWU.html