• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&lt;number&gt;): 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&lt;number&gt; | 是 | 回调函数。返回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&lt;number&gt;
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&lt;number&gt; | 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&lt;void&gt;
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&lt;void&gt; | 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&lt;number&gt;): 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&lt;number&gt; | 是 | 回调函数。返回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&lt;number&gt;
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&lt;number&gt; | 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&lt;void&gt;
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&lt;void&gt; | 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&lt;void&gt;
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&lt;void&gt; | 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&lt;void&gt;
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&lt;void&gt; | 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