1# @ohos.application.uriPermissionManager(URI权限管理)(系统接口) 2 3<!--Kit: Ability Kit--> 4<!--Subsystem: Ability--> 5<!--Owner: @duan-sizhao--> 6<!--Designer: @ccllee1--> 7<!--Tester: @lixueqing513--> 8<!--Adviser: @huipeizi--> 9 10URI权限管理模块。用于应用A授权/撤销授权URI给应用B。 11 12> **说明:** 13> 14> 本模块首批接口从API version 10 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 15> 本模块接口均为系统接口,三方应用不支持调用。 16 17 18## 导入模块 19 20 21```ts 22import { uriPermissionManager } from '@kit.AbilityKit'; 23``` 24 25 26## uriPermissionManager.grantUriPermission 27 28grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string, callback: AsyncCallback<number>): void 29 30授权URI给指定应用,授权成功后目标应用将获得该URI的文件访问权限,目标应用退出后权限将被回收。目标应用使用该URI的方法可以参考[应用文件分享](../../file-management/share-app-file.md)。使用callback异步回调。 31 32> **说明:** 33> 34> 当应用拥有ohos.permission.PROXY_AUTHORIZATION_URI权限时, 可以授权不属于自身但具有访问权限的URI。如果不具备该权限,则仅支持授权属于自身的URI。 35 36**系统接口**:此接口为系统接口。 37 38**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 39 40**需要权限**:ohos.permission.PROXY_AUTHORIZATION_URI 41 42**参数:** 43 44 | 参数名 | 类型 | 必填 | 说明 | 45 | -------- | -------- | -------- | -------- | 46 | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 | 47 | flag | [wantConstant.Flags](js-apis-app-ability-wantConstant.md#flags) | 是 | URI的读权限或写权限。 | 48 | targetBundleName | string | 是 | 被授权URI的应用包名。 | 49 | callback | AsyncCallback<number> | 是 | 回调函数。返回0表示有权限,返回-1表示无权限。 | 50 51**错误码:** 52 53 以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 54 55| 错误码ID | 错误信息 | 56| ------- | -------------------------------- | 57| 201 | Permission denied. | 58| 202 | Not System App. Interface caller is not a system app. | 59| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.| 60| 801 | Capability not supported. | 61| 16000050 | Internal error. | 62| 16000058 | Invalid URI flag. | 63| 16000059 | Invalid URI type. | 64| 16000060 | A sandbox application cannot grant URI permission. | 65 66 67**示例:** 68 69 ```ts 70 import { uriPermissionManager, wantConstant } from '@kit.AbilityKit'; 71 import { fileIo, fileUri } from '@kit.CoreFileKit'; 72 73 let targetBundleName = 'com.example.test_case1' 74 let path = 'file://com.example.test_case1/data/storage/el2/base/haps/entry_test/files/newDir'; 75 fileIo.mkdir(path, (err) => { 76 if (err) { 77 console.error(`mkdir failed, err code: ${err.code}, err msg: ${err.message}.`); 78 } else { 79 console.info(`mkdir success.`); 80 } 81 }); 82 let uri = fileUri.getUriFromPath(path); 83 uriPermissionManager.grantUriPermission(uri, wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetBundleName, 84 (error) => { 85 if (error && error.code !== 0) { 86 console.error(`grantUriPermission failed, err code: ${error.code}, err msg: ${error.message}.`); 87 return; 88 } 89 console.info(`grantUriPermission success.`); 90 }); 91 ``` 92 93 94## uriPermissionManager.grantUriPermission 95 96grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string): Promise<number> 97 98授权URI给指定应用,授权成功后目标应用将获得该URI的文件访问权限,目标应用退出后权限将被回收。目标应用使用该URI的方法可以参考[应用文件分享](../../file-management/share-app-file.md)。使用Promise异步回调。 99 100> **说明:** 101> 102> 当应用拥有ohos.permission.PROXY_AUTHORIZATION_URI权限时, 可以授权不属于自身但具有访问权限的URI。如果不具备该权限,则仅支持授权属于自身的URI。 103 104**系统接口**:此接口为系统接口。 105 106**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 107 108**需要权限**:ohos.permission.PROXY_AUTHORIZATION_URI 109 110**参数:** 111 112 | 参数名 | 类型 | 必填 | 说明 | 113 | -------- | -------- | -------- | -------- | 114 | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 | 115 | flag | [wantConstant.Flags](js-apis-app-ability-wantConstant.md#flags) | 是 | URI的读权限或写权限。 | 116 | targetBundleName | string | 是 | 被授权URI的应用包名。 | 117 118**返回值:** 119 120 | 类型 | 说明 | 121 | -------- | -------- | 122 | Promise<number> | Promise对象。返回0表示有权限,返回-1表示无权限。 | 123 124**错误码:** 125 126 以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 127 128 | 错误码ID | 错误信息 | 129 | ------- | -------------------------------- | 130 | 201 | Permission denied. | 131 | 202 | Not System App. Interface caller is not a system app. | 132 | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.| 133 | 801 | Capability not supported. | 134 | 16000050 | Internal error. | 135 | 16000058 | Invalid URI flag. | 136 | 16000059 | Invalid URI type. | 137 | 16000060 | A sandbox application cannot grant URI permission. | 138 139**示例:** 140 141 ```ts 142 import { uriPermissionManager, wantConstant } from '@kit.AbilityKit'; 143 import { fileIo, fileUri } from '@kit.CoreFileKit'; 144 import { BusinessError } from '@kit.BasicServicesKit'; 145 146 let targetBundleName = 'com.example.test_case1' 147 let path = 'file://com.example.test_case1/data/storage/el2/base/haps/entry_test/files/newDir'; 148 149 fileIo.mkdir(path, (err) => { 150 if (err) { 151 console.error(`mkdir failed, err code: ${err.code}, err msg: ${err.message}.`); 152 } else { 153 console.info(`mkdir succeed.`); 154 } 155 }); 156 let uri = fileUri.getUriFromPath(path); 157 uriPermissionManager.grantUriPermission(uri, wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetBundleName) 158 .then((data) => { 159 console.info(`Verification succeeded, data: ${JSON.stringify(data)}.`); 160 }).catch((err: BusinessError) => { 161 console.error(`Verification failed, err code: ${err.code}, err msg: ${err.message}.`); 162 }); 163 ``` 164 165## uriPermissionManager.grantUriPermission<sup>14+</sup> 166 167grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string, appCloneIndex: number): Promise<void> 168 169授权URI给指定应用,授权成功后目标应用将获得该URI的文件访问权限,目标应用退出后权限将被回收。目标应用使用该URI的方法可以参考[应用文件分享](../../file-management/share-app-file.md)。使用Promise异步回调。 170 171> **说明:** 172> 173>- 当应用拥有ohos.permission.PROXY_AUTHORIZATION_URI权限时, 可以授权不属于自身但具有访问权限的URI。如果不具备该权限,则仅支持授权属于自身的URI。 174>- 该接口支持给分身应用授权,需要指定目标应用的应用包名和分身索引。 175 176**系统接口**:此接口为系统接口。 177 178**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 179 180**需要权限**:ohos.permission.PROXY_AUTHORIZATION_URI 181 182**参数:** 183 184 | 参数名 | 类型 | 必填 | 说明 | 185 | -------- | -------- | -------- | -------- | 186 | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 | 187 | flag | [wantConstant.Flags](js-apis-app-ability-wantConstant.md#flags) | 是 | URI的读权限或写权限。 | 188 | targetBundleName | string | 是 | 被授权应用的应用包名。 | 189 | appCloneIndex | number | 是 | 被授权应用的分身索引,有效范围为[0, 1000], 取值为0时表示主应用。| 190 191**返回值:** 192 193 | 类型 | 说明 | 194 | -------- | -------- | 195 | Promise<void> | Promise对象。无返回结果的Promise对象。| 196 197**错误码:** 198 199 以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 200 201 | 错误码ID | 错误信息 | 202 | ------- | -------------------------------- | 203 | 201 | Permission denied. | 204 | 202 | Not System App. Interface caller is not a system app. | 205 | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.| 206 | 801 | Capability not supported. | 207 | 16000050 | Internal error. | 208 | 16000058 | Invalid URI flag. | 209 | 16000059 | Invalid URI type. | 210 | 16000060 | A sandbox application cannot grant URI permission. | 211 | 16000081 | Failed to obtain the target application information. | 212 213**示例:** 214 215 ```ts 216 import { AbilityConstant, UIAbility, Want, wantConstant, uriPermissionManager } from '@kit.AbilityKit'; 217 import { fileUri } from '@kit.CoreFileKit'; 218 import { BusinessError } from '@kit.BasicServicesKit'; 219 220 export default class EntryAbility extends UIAbility { 221 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 222 } 223 224 onForeground(): void { 225 let targetBundleName: string = 'com.example.demo1'; 226 let filePath: string = this.context.filesDir + "/test.txt"; 227 let uri: string = fileUri.getUriFromPath(filePath); 228 // grant uri permission to main application 229 try { 230 let appCloneIndex: number = 0; 231 uriPermissionManager.grantUriPermission(uri, wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetBundleName, 232 appCloneIndex) 233 .then(() => { 234 console.info('grantUriPermission succeeded.'); 235 }).catch((error: BusinessError) => { 236 console.error(`grantUriPermission failed. error: ${JSON.stringify(error)}.`); 237 }); 238 } catch (error) { 239 console.error(`grantUriPermission failed. error: ${JSON.stringify(error)}.`); 240 } 241 242 // grant uri permission to clone application 243 try { 244 let appCloneIndex: number = 1; 245 uriPermissionManager.grantUriPermission(uri, wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetBundleName, 246 appCloneIndex) 247 .then(() => { 248 console.info('grantUriPermission succeeded.'); 249 }).catch((error: BusinessError) => { 250 console.error(`grantUriPermission failed. error: ${JSON.stringify(error)}.`); 251 }); 252 } catch (error) { 253 console.error(`grantUriPermission failed. error: ${JSON.stringify(error)}.`); 254 } 255 } 256 } 257 258 ``` 259 260## uriPermissionManager.revokeUriPermission 261 262revokeUriPermission(uri: string, targetBundleName: string, callback: AsyncCallback<number>): void 263 264撤销授权指定应用的URI。使用callback异步回调。 265 266> **说明:** 267> 268> 允许应用撤销自身获得的其他应用URI权限,或授权给其他应用的URI权限。 269 270**系统接口**:此接口为系统接口。 271 272**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 273 274**参数:** 275 276 | 参数名 | 类型 | 必填 | 说明 | 277 | -------- | -------- | -------- | -------- | 278 | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 | 279 | targetBundleName | string | 是 | 被撤销授权uri的应用包名。 | 280 | callback | AsyncCallback<number> | 是 | 回调函数。返回0表示有权限,返回-1表示无权限。 | 281 282**错误码:** 283 284 以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 285 286 | 错误码ID | 错误信息 | 287 | ------- | -------------------------------- | 288 | 202 | Not System App. Interface caller is not a system app. | 289 | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.| 290 | 801 | Capability not supported. | 291 | 16000050 | Internal error. | 292 | 16000059 | Invalid URI type. | 293 294**示例:** 295 296 ```ts 297 import { uriPermissionManager } from '@kit.AbilityKit'; 298 299 let targetBundleName = 'com.example.test_case2'; 300 let uri = "file://com.example.test_case1/data/storage/el2/base/haps/entry_test/files/newDir"; 301 302 uriPermissionManager.revokeUriPermission(uri, targetBundleName, (error) => { 303 if (error && error.code !== 0) { 304 console.error("revokeUriPermission failed, error.code = " + error.code); 305 return; 306 } 307 console.info("revokeUriPermission success"); 308 }); 309 ``` 310 311 312## uriPermissionManager.revokeUriPermission 313 314revokeUriPermission(uri: string, targetBundleName: string): Promise<number> 315 316撤销授权指定应用的URI。使用Promise异步回调。 317 318> **说明:** 319> 320> 允许应用撤销自身获得的其他应用URI权限,或授权给其他应用的URI权限。 321 322**系统接口**:此接口为系统接口。 323 324**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 325 326**参数:** 327 328 | 参数名 | 类型 | 必填 | 说明 | 329 | -------- | -------- | -------- | -------- | 330 | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 | 331 | targetBundleName | string | 是 | 被授权URI的应用包名。 | 332 333**返回值:** 334 335 | 类型 | 说明 | 336 | -------- | -------- | 337 | Promise<number> | Promise对象。返回0表示有权限,返回-1表示无权限。 | 338 339**错误码:** 340 341 以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 342 343 | 错误码ID | 错误信息 | 344 | ------- | -------------------------------- | 345 | 202 | Not System App. Interface caller is not a system app. | 346 | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.| 347 | 801 | Capability not supported. | 348 | 16000050 | Internal error. | 349 | 16000059 | Invalid URI type. | 350 351 352**示例:** 353 354 ```ts 355 import { uriPermissionManager } from '@kit.AbilityKit'; 356 import { BusinessError } from '@kit.BasicServicesKit'; 357 358 let targetBundleName = 'com.example.test_case2'; 359 let uri = 'file://com.example.test_case1/data/storage/el2/base/haps/entry_test/files/newDir'; 360 361 uriPermissionManager.revokeUriPermission(uri, targetBundleName) 362 .then((data) => { 363 console.info(`Verification success, data: ${JSON.stringify(data)}.`); 364 }).catch((error: BusinessError) => { 365 console.error(`Verification failed, err code: ${error.code}, err msg: ${error.message}.`); 366 }); 367 ``` 368## uriPermissionManager.revokeUriPermission<sup>14+</sup> 369 370revokeUriPermission(uri: string, targetBundleName: string, appCloneIndex: number): Promise<void> 371 372撤销授权指定应用的URI。使用Promise异步回调。 373 374> **说明:** 375> 376>- 允许应用撤销自身获得的其他应用URI权限,或授权给其他应用的URI权限。 377>- 该接口支持撤销授权给分身应用的URI权限,需要指定目标应用的应用包名和分身索引。 378 379**系统接口**:此接口为系统接口。 380 381**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 382 383**参数:** 384 385 | 参数名 | 类型 | 必填 | 说明 | 386 | -------- | -------- | -------- | -------- | 387 | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 | 388 | targetBundleName | string | 是 | 被授权应用的应用包名。 | 389 | appCloneIndex | number | 是 | 被授权应用的分身索引,有效范围为[0, 1000], 取值为0时表示主应用。| 390 391**返回值:** 392 393 | 类型 | 说明 | 394 | -------- | -------- | 395 | Promise<void> | Promise对象。无返回结果的Promise对象。| 396 397**错误码:** 398 399 以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 400 401 | 错误码ID | 错误信息 | 402 | ------- | -------------------------------- | 403 | 202 | Not System App. Interface caller is not a system app. | 404 | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.| 405 | 801 | Capability not supported. | 406 | 16000050 | Internal error. | 407 | 16000059 | Invalid URI type. | 408 | 16000081 | Failed to obtain the target application information. | 409 410**示例:** 411 412 ```ts 413 414 import { AbilityConstant, UIAbility, Want, wantConstant, uriPermissionManager } from '@kit.AbilityKit'; 415 import { fileUri } from '@kit.CoreFileKit'; 416 import { BusinessError } from '@kit.BasicServicesKit'; 417 418 export default class EntryAbility extends UIAbility { 419 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 420 } 421 422 onForeground(): void { 423 let targetBundleName: string = 'com.example.demo1'; 424 let filePath: string = this.context.filesDir + "/test.txt"; 425 let uri: string = fileUri.getUriFromPath(filePath); 426 // revoke uri permission of main application 427 try { 428 let appCloneIndex: number = 0; 429 uriPermissionManager.revokeUriPermission(uri, targetBundleName, appCloneIndex) 430 .then(() => { 431 console.info('revokeUriPermission succeeded.'); 432 }).catch((error: BusinessError) => { 433 console.error(`revokeUriPermission failed. error: ${JSON.stringify(error)}.`); 434 }); 435 } catch (error) { 436 console.error(`revokeUriPermission failed. error: ${JSON.stringify(error)}.`); 437 } 438 439 // revoke uri permission of clone application 440 try { 441 let appCloneIndex: number = 1; 442 uriPermissionManager.revokeUriPermission(uri, targetBundleName, appCloneIndex) 443 .then(() => { 444 console.info('revokeUriPermission succeeded.'); 445 }).catch((error: BusinessError) => { 446 console.error(`revokeUriPermission failed. error: ${JSON.stringify(error)}.`); 447 }); 448 } catch (error) { 449 console.error(`revokeUriPermission failed. error: ${JSON.stringify(error)}.`); 450 } 451 } 452 } 453 ``` 454 455## uriPermissionManager.grantUriPermissionByKey<sup>20+</sup> 456 457grantUriPermissionByKey(key: string, flag: wantConstant.Flags, targetTokenId: number): Promise<void> 458 459通过UDMF数据唯一标识key,将当前应用的文件URI访问权限授权给目标应用,权限将在目标应用退出后回收。使用Promise异步回调。 460 461**系统接口**:此接口为系统接口。 462 463**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 464 465**设备行为差异**:该接口仅在Phone、2in1和Tablet设备中可正常调用,在其他设备中返回801错误码。 466 467**参数:** 468 469 | 参数名 | 类型 | 必填 | 说明 | 470 | -------- | -------- | -------- | -------- | 471 | key | string | 是 | 目标UDMF数据唯一标识。key必须由调用方通过[unifiedDataChannel.insertData](../apis-arkdata/js-apis-data-unifiedDataChannel.md#unifieddatachannelinsertdata)创建,且写入的数据均为有权限授权的文件URI。<br>当前仅支持SYSTEM_SHARE、PICKER和MENU类型的[UDMF数据通路](../apis-arkdata/js-apis-data-unifiedDataChannel.md#intention)的key。key的创建与使用方法详见[标准化数据通路实现数据共享](../../database/unified-data-channels.md)。| 472 | flag | [wantConstant.Flags](js-apis-app-ability-wantConstant.md#flags) | 是 | URI的读权限或写权限。支持的取值如下:<br>- FLAG_AUTH_READ_URI_PERMISSION:读权限。<br>- FLAG_AUTH_WRITE_URI_PERMISSION:写权限。 | 473 | targetTokenId | number | 是 | 目标应用的身份标识,可以通过[bundleManager.getApplicationInfo](js-apis-bundleManager-sys.md#bundlemanagergetapplicationinfo)获取。 | 474 475**返回值:** 476 477 | 类型 | 说明 | 478 | -------- | -------- | 479 | Promise<void> | Promise对象。无返回结果的Promise对象。| 480 481**错误码:** 482 483 以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 484 485 | 错误码ID | 错误信息 | 486 | ------- | -------------------------------- | 487 | 202 | Not System App. Interface caller is not a system app. | 488 | 801 | Capability not supported. | 489 | 16000050 | Internal error. | 490 | 16000058 | Invalid URI flag. | 491 | 16000060 | A sandbox application cannot grant URI permission. | 492 | 16000091 | Failed to get the file URI from the key. | 493 | 16000092 | No permission to authorize the URI. | 494 | 16000094 | The target token ID is invalid. | 495 496**示例:** 497 498 ```ts 499 // 接口调用方应用包名为com.exmaple.test 500 // ExntryAbility.ets 501 import { AbilityConstant, UIAbility, Want, wantConstant, uriPermissionManager } from '@kit.AbilityKit'; 502 import { BusinessError } from '@kit.BasicServicesKit'; 503 504 export default class EntryAbility extends UIAbility { 505 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 506 } 507 508 onForeground(): void { 509 try { 510 // 可以通过unifiedDataChannel.insertData生成key 511 let key: string = 'udmf://SystemShare/com.example.test/ap\\t5kKMYTOSHBh9\\f1@817VnBBvxI[e'; 512 // 可以通过bundleManager.getApplicationInfo接口获取targetTokenId 513 // 假设获取的targetTokenId为1001 514 let targetTokenId: number = 1001; 515 uriPermissionManager.grantUriPermissionByKey(key, 516 wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetTokenId) 517 .then(() => { 518 console.info('grantUriPermissionByKey succeeded.'); 519 }).catch((error: BusinessError) => { 520 console.error('grantUriPermissionByKey failed: ' + JSON.stringify(error)); 521 }); 522 } catch (error) { 523 console.error('grantUriPermissionByKey failed: ' + JSON.stringify(error)); 524 } 525 } 526 } 527 ``` 528 529## uriPermissionManager.grantUriPermissionByKeyAsCaller<sup>20+</sup> 530 531grantUriPermissionByKeyAsCaller(key: string, flag: wantConstant.Flags, callerTokenId: number, targetTokenId: number): Promise<void> 532 533通过UDMF数据唯一标识key,将指定应用的文件URI访问权限授权给目标应用,权限将在目标应用退出后回收。使用Promise异步回调。 534 535**系统接口**:此接口为系统接口。 536 537**需要权限:** ohos.permission.GRANT_URI_PERMISSION_AS_CALLER,仅系统应用可用。 538 539**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 540 541**设备行为差异**:该接口仅在Phone、2in1和Tablet设备中可正常调用,在其他设备中返回801错误码。 542 543**参数:** 544 545 | 参数名 | 类型 | 必填 | 说明 | 546 | -------- | -------- | -------- | -------- | 547 | key | string | 是 | 目标UDMF数据唯一标识。key必须指定应用(即callerTokenId对应的应用)通过[unifiedDataChannel.insertData](../apis-arkdata/js-apis-data-unifiedDataChannel.md#unifieddatachannelinsertdata)创建,且写入的数据均为有权限授权的文件URI。<br>当前仅支持SYSTEM_SHARE、PICKER和MENU类型的[UDMF数据通路](../apis-arkdata/js-apis-data-unifiedDataChannel.md#intention)的key。key的创建与使用方法详见[标准化数据通路实现数据共享](../../database/unified-data-channels.md)。| 548 | flag | [wantConstant.Flags](js-apis-app-ability-wantConstant.md#flags) | 是 | URI的读权限或写权限。支持的取值如下:<br>- FLAG_AUTH_READ_URI_PERMISSION:读权限。<br>- FLAG_AUTH_WRITE_URI_PERMISSION:写权限。 | 549 | callerTokenId | number | 是 | 拉起方应用的身份标识,可以通过[want](js-apis-app-ability-want.md)中的"ohos.aafwk.param.callerToken"字段获取。 | 550 | targetTokenId | number | 是 | 目标应用的身份标识,可以通过[bundleManager.getApplicationInfo](js-apis-bundleManager-sys.md#bundlemanagergetapplicationinfo)获取。 | 551 552**返回值:** 553 554 | 类型 | 说明 | 555 | -------- | -------- | 556 | Promise<void> | Promise对象。无返回结果的Promise对象。| 557 558**错误码:** 559 560 以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 561 562 | 错误码ID | 错误信息 | 563 | ------- | -------------------------------- | 564 | 201 | Permission denied. | 565 | 202 | Not System App. Interface caller is not a system app. | 566 | 801 | Capability not supported. | 567 | 16000050 | Internal error. | 568 | 16000058 | Invalid URI flag. | 569 | 16000060 | A sandbox application cannot grant URI permission. | 570 | 16000091 | Failed to get the file URI from the key. | 571 | 16000092 | No permission to authorize the URI. | 572 | 16000093 | The caller token ID is invalid. | 573 | 16000094 | The target token ID is invalid. | 574 575**示例:** 576 ```ts 577 // 拉起方应用包名为com.example.caller 578 // Index.ets 579 import { common, Want, wantConstant } from '@kit.AbilityKit'; 580 581 @Entry 582 @Component 583 struct Index { 584 @State message: string = 'Hello World'; 585 586 build() { 587 Row() { 588 Column() { 589 Text(this.message) 590 591 Button('分享文件') 592 .onClick(() => { 593 // key可以通过unifiedDataChannel.insertData生成 594 let udKey: string = 'udmf://SystemShare/com.example.caller/ap\\t5kKMYTOSHBh9\\f1@817VnBBvxI[e'; 595 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 596 let want: Want = { 597 bundleName: 'com.example.test', 598 abilityName: 'EntryAbility', 599 parameters: { 600 [wantConstant.Params.ABILITY_UNIFIED_DATA_KEY]: udKey 601 } 602 }; 603 context.startAbility(want); 604 }) 605 } 606 } 607 } 608 } 609 ``` 610 ```ts 611 // 接口调用方应用包名为com.example.test 612 // EntryAbility.ets 613 import { AbilityConstant, UIAbility, Want, wantConstant, uriPermissionManager } from '@kit.AbilityKit'; 614 import { BusinessError } from '@kit.BasicServicesKit'; 615 616 export default class EntryAbility extends UIAbility { 617 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 618 let udKey: string = want.parameters?.[wantConstant.Params.ABILITY_UNIFIED_DATA_KEY] as string; 619 let callerTokenId: number = want.parameters?.['ohos.aafwk.param.callerToken'] as number; 620 AppStorage.setOrCreate('udKey', udKey); 621 AppStorage.setOrCreate('callerTokenId', callerTokenId); 622 } 623 624 onForeground(): void { 625 try { 626 let udKey: string = AppStorage.get<string>('udKey') as string; 627 let callerTokenId: number = AppStorage.get<number>('callerTokenId') as number; 628 // 可以通过bundleManager.getApplicationInfo接口获取targetTokenId 629 // 假设获取的targetTokenId为1001 630 let targetTokenId: number = 1001; 631 632 uriPermissionManager.grantUriPermissionByKeyAsCaller(udKey, 633 wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, callerTokenId, targetTokenId) 634 .then(() => { 635 console.info('grantUriPermissionByKeyAsCaller succeeded.'); 636 }).catch((error: BusinessError) => { 637 console.error('grantUriPermissionByKeyAsCaller failed: ' + JSON.stringify(error)); 638 }); 639 } catch (error) { 640 console.error('grantUriPermissionByKeyAsCaller failed: ' + JSON.stringify(error)); 641 } 642 } 643 } 644 ``` 645 646