本博客根据 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}`)
}
}
}