1# @ohos.application.uriPermissionManager(URI权限管理)(系统接口)
2
3URI权限管理模块。用于应用A授权/撤销授权URI给应用B。
4
5> **说明:**
6>
7> 本模块首批接口从API version 10 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8> 本模块接口均为系统接口,三方应用不支持调用。
9
10
11## 导入模块
12
13
14```ts
15import { uriPermissionManager } from '@kit.AbilityKit';
16```
17
18
19## uriPermissionManager.grantUriPermission
20
21grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string, callback: AsyncCallback<number>): void
22
23授权URI给指定应用,授权成功后目标应用将获得该URI的文件访问权限,目标应用退出后权限将被回收。目标应用使用该URI的方法可以参考[应用文件分享](../../file-management/share-app-file.md)。使用callback异步回调。
24
25> **说明:**
26>
27> 当应用拥有ohos.permission.PROXY_AUTHORIZATION_URI权限时, 可以授权不属于自身但具有访问权限的URI。如果不具备该权限,则仅支持授权属于自身的URI。
28
29**系统接口**:此接口为系统接口。
30
31**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
32
33**需要权限**:ohos.permission.PROXY_AUTHORIZATION_URI
34
35**参数:**
36
37  | 参数名 | 类型 | 必填 | 说明 |
38  | -------- | -------- | -------- | -------- |
39  | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 |
40  | flag | [wantConstant.Flags](js-apis-app-ability-wantConstant.md#flags) | 是 | URI的读权限或写权限。 |
41  | targetBundleName | string | 是 | 被授权URI的应用包名。 |
42  | callback | AsyncCallback<number> | 是 | 回调函数。返回0表示有权限,返回-1表示无权限。 |
43
44**错误码:**
45
46  以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。
47
48| 错误码ID | 错误信息 |
49| ------- | -------------------------------- |
50| 201 | Permission denied. |
51| 202 | Not System App. Interface caller is not a system app. |
52| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.|
53| 16000050 | Internal error. |
54| 16000058 | Invalid URI flag. |
55| 16000059 | Invalid URI type. |
56| 16000060 | A sandbox application cannot grant URI permission. |
57
58
59**示例:**
60
61  ```ts
62  import { uriPermissionManager, wantConstant } from '@kit.AbilityKit';
63  import { fileIo, fileUri } from '@kit.CoreFileKit';
64
65  let targetBundleName = 'com.example.test_case1'
66  let path = "file://com.example.test_case1/data/storage/el2/base/haps/entry_test/files/newDir";
67  fileIo.mkdir(path, (err) => {
68    if (err) {
69      console.log("mkdir error" + err.message);
70    } else {
71      console.log("mkdir succeed");
72    }
73  });
74  let uri = fileUri.getUriFromPath(path);
75  uriPermissionManager.grantUriPermission(uri, wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetBundleName, (result) => {
76    console.log("result.code = " + result.code);
77  });
78  ```
79
80
81## uriPermissionManager.grantUriPermission
82
83grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string): Promise<number>
84
85授权URI给指定应用,授权成功后目标应用将获得该URI的文件访问权限,目标应用退出后权限将被回收。目标应用使用该URI的方法可以参考[应用文件分享](../../file-management/share-app-file.md)。使用Promise异步回调。
86
87> **说明:**
88>
89> 当应用拥有ohos.permission.PROXY_AUTHORIZATION_URI权限时, 可以授权不属于自身但具有访问权限的URI。如果不具备该权限,则仅支持授权属于自身的URI。
90
91**系统接口**:此接口为系统接口。
92
93**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
94
95**需要权限**:ohos.permission.PROXY_AUTHORIZATION_URI
96
97**参数:**
98
99  | 参数名 | 类型 | 必填 | 说明 |
100  | -------- | -------- | -------- | -------- |
101  | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 |
102  | flag | [wantConstant.Flags](js-apis-app-ability-wantConstant.md#flags) | 是 | URI的读权限或写权限。 |
103  | targetBundleName | string | 是 | 被授权URI的应用包名。 |
104
105**返回值:**
106
107  | 类型 | 说明 |
108  | -------- | -------- |
109  | Promise<number> | Promise对象。返回0表示有权限,返回-1表示无权限。 |
110
111**错误码:**
112
113  以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。
114
115  | 错误码ID | 错误信息 |
116  | ------- | -------------------------------- |
117  | 201 | Permission denied. |
118  | 202 | Not System App. Interface caller is not a system app. |
119  | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.|
120  | 16000050 | Internal error. |
121  | 16000058 | Invalid URI flag. |
122  | 16000059 | Invalid URI type. |
123  | 16000060 | A sandbox application cannot grant URI permission. |
124
125**示例:**
126
127  ```ts
128  import { uriPermissionManager, wantConstant } from '@kit.AbilityKit';
129  import { fileIo, fileUri } from '@kit.CoreFileKit';
130  import { BusinessError } from '@kit.BasicServicesKit';
131
132  let targetBundleName = 'com.example.test_case1'
133  let path = "file://com.example.test_case1/data/storage/el2/base/haps/entry_test/files/newDir";
134
135  fileIo.mkdir(path, (err) => {
136    if (err) {
137      console.log("mkdir error" + err.message);
138    } else {
139      console.log("mkdir succeed");
140    }
141  });
142  let uri = fileUri.getUriFromPath(path);
143  uriPermissionManager.grantUriPermission(uri, wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetBundleName)
144    .then((data) => {
145      console.log('Verification succeeded.' + data);
146    }).catch((error: BusinessError) => {
147    console.log('Verification failed.');
148  });
149  ```
150
151## uriPermissionManager.grantUriPermission<sup>14+</sup>
152
153grantUriPermission(uri: string, flag: wantConstant.Flags, targetBundleName: string, appCloneIndex: number): Promise&lt;void&gt;
154
155授权URI给指定应用,授权成功后目标应用将获得该URI的文件访问权限,目标应用退出后权限将被回收。目标应用使用该URI的方法可以参考[应用文件分享](../../file-management/share-app-file.md)。使用Promise异步回调。
156
157> **说明:**
158>
159>- 当应用拥有ohos.permission.PROXY_AUTHORIZATION_URI权限时, 可以授权不属于自身但具有访问权限的URI。如果不具备该权限,则仅支持授权属于自身的URI。
160>- 该接口支持给分身应用授权,需要指定目标应用的应用包名和分身索引。
161
162**系统接口**:此接口为系统接口。
163
164**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
165
166**需要权限**:ohos.permission.PROXY_AUTHORIZATION_URI
167
168**参数:**
169
170  | 参数名 | 类型 | 必填 | 说明 |
171  | -------- | -------- | -------- | -------- |
172  | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 |
173  | flag | [wantConstant.Flags](js-apis-app-ability-wantConstant.md#flags) | 是 | URI的读权限或写权限。 |
174  | targetBundleName | string | 是 | 被授权应用的应用包名。 |
175  | appCloneIndex | number | 是 | 被授权应用的分身索引,有效范围为[0, 1000], 取值为0时表示主应用。|
176
177**返回值:**
178
179  | 类型 | 说明 |
180  | -------- | -------- |
181  | Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。|
182
183**错误码:**
184
185  以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。
186
187  | 错误码ID | 错误信息 |
188  | ------- | -------------------------------- |
189  | 201 | Permission denied. |
190  | 202 | Not System App. Interface caller is not a system app. |
191  | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.|
192  | 16000050 | Internal error. |
193  | 16000058 | Invalid URI flag. |
194  | 16000059 | Invalid URI type. |
195  | 16000060 | A sandbox application cannot grant URI permission. |
196  | 16000081 | Get target application info failed. |
197
198**示例:**
199
200  ```ts
201  import { AbilityConstant, UIAbility, Want, wantConstant, uriPermissionManager } from '@kit.AbilityKit';
202  import { fileUri } from '@kit.CoreFileKit';
203  import { BusinessError } from '@kit.BasicServicesKit';
204
205  export default class EntryAbility extends UIAbility {
206    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
207    }
208
209    onForeground(): void {
210      let targetBundleName: string = 'com.example.demo1';
211      let filePath: string = this.context.filesDir + "/test.txt";
212      let uri: string = fileUri.getUriFromPath(filePath);
213      // grant uri permission to main application
214      try {
215        let appCloneIndex: number = 0;
216        uriPermissionManager.grantUriPermission(uri, wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetBundleName,
217          appCloneIndex)
218          .then(() => {
219            console.log('grantUriPermission succeeded.');
220          }).catch((error: BusinessError) => {
221          console.error(`grantUriPermission failed. error: ${JSON.stringify(error)}.`);
222        });
223      } catch (error) {
224        console.error(`grantUriPermission failed. error: ${JSON.stringify(error)}.`);
225      }
226
227      // grant uri permission to clone application
228      try {
229        let appCloneIndex: number = 1;
230        uriPermissionManager.grantUriPermission(uri, wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION, targetBundleName,
231          appCloneIndex)
232          .then(() => {
233            console.log('grantUriPermission succeeded.');
234          }).catch((error: BusinessError) => {
235          console.error(`grantUriPermission failed. error: ${JSON.stringify(error)}.`);
236        });
237      } catch (error) {
238        console.error(`grantUriPermission failed. error: ${JSON.stringify(error)}.`);
239      }
240    }
241  }
242
243  ```
244
245## uriPermissionManager.revokeUriPermission
246
247revokeUriPermission(uri: string, targetBundleName: string, callback: AsyncCallback&lt;number&gt;): void
248
249撤销授权指定应用的URI。使用callback异步回调。
250
251> **说明:**
252>
253> 允许应用撤销自身获得的其他应用URI权限,或授权给其他应用的URI权限。
254
255**系统接口**:此接口为系统接口。
256
257**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
258
259**参数:**
260
261  | 参数名 | 类型 | 必填 | 说明 |
262  | -------- | -------- | -------- | -------- |
263  | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 |
264  | targetBundleName | string | 是 | 被撤销授权uri的应用包名。 |
265  | callback | AsyncCallback&lt;number&gt; | 是 | 回调函数。返回0表示有权限,返回-1表示无权限。 |
266
267**错误码:**
268
269  以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。
270
271  | 错误码ID | 错误信息 |
272  | ------- | -------------------------------- |
273  | 202 | Not System App. Interface caller is not a system app. |
274  | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.|
275  | 16000050 | Internal error. |
276  | 16000059 | Invalid URI type. |
277
278**示例:**
279
280  ```ts
281  import { uriPermissionManager } from '@kit.AbilityKit';
282
283  let targetBundleName = 'com.example.test_case2';
284  let uri = "file://com.example.test_case1/data/storage/el2/base/haps/entry_test/files/newDir";
285
286  uriPermissionManager.revokeUriPermission(uri, targetBundleName, (result) => {
287    console.log("result.code = " + result.code);
288  });
289  ```
290
291
292## uriPermissionManager.revokeUriPermission
293
294revokeUriPermission(uri: string, targetBundleName: string): Promise&lt;number&gt;
295
296撤销授权指定应用的URI。使用Promise异步回调。
297
298> **说明:**
299>
300> 允许应用撤销自身获得的其他应用URI权限,或授权给其他应用的URI权限。
301
302**系统接口**:此接口为系统接口。
303
304**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
305
306**参数:**
307
308  | 参数名 | 类型 | 必填 | 说明 |
309  | -------- | -------- | -------- | -------- |
310  | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 |
311  | targetBundleName | string | 是 | 被授权URI的应用包名。 |
312
313**返回值:**
314
315  | 类型 | 说明 |
316  | -------- | -------- |
317  | Promise&lt;number&gt; | Promise对象。返回0表示有权限,返回-1表示无权限。 |
318
319**错误码:**
320
321  以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。
322
323  | 错误码ID | 错误信息 |
324  | ------- | -------------------------------- |
325  | 202 | Not System App. Interface caller is not a system app. |
326  | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.|
327  | 16000050 | Internal error. |
328  | 16000059 | Invalid URI type. |
329
330
331**示例:**
332
333  ```ts
334  import { uriPermissionManager } from '@kit.AbilityKit';
335  import { BusinessError } from '@kit.BasicServicesKit';
336
337  let targetBundleName = 'com.example.test_case2';
338  let uri = "file://com.example.test_case1/data/storage/el2/base/haps/entry_test/files/newDir";
339
340  uriPermissionManager.revokeUriPermission(uri, targetBundleName)
341    .then((data) => {
342      console.log('Verification succeeded.' + data);
343    }).catch((error: BusinessError) => {
344    console.log('Verification failed.');
345  });
346  ```
347## uriPermissionManager.revokeUriPermission<sup>14+</sup>
348
349revokeUriPermission(uri: string, targetBundleName: string, appCloneIndex: number): Promise&lt;void&gt;
350
351撤销授权指定应用的URI。使用Promise异步回调。
352
353> **说明:**
354>
355>- 允许应用撤销自身获得的其他应用URI权限,或授权给其他应用的URI权限。
356>- 该接口支持撤销授权给分身应用的URI权限,需要指定目标应用的应用包名和分身索引。
357
358**系统接口**:此接口为系统接口。
359
360**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
361
362**参数:**
363
364  | 参数名 | 类型 | 必填 | 说明 |
365  | -------- | -------- | -------- | -------- |
366  | uri | string | 是 | 指向文件的URI,scheme固定为"file",参考[FileUri](../apis-core-file-kit/js-apis-file-fileuri.md#constructor10)。 |
367  | targetBundleName | string | 是 | 被授权应用的应用包名。 |
368  | appCloneIndex | number | 是 | 被授权应用的分身索引,有效范围为[0, 1000], 取值为0时表示主应用。|
369
370**返回值:**
371
372  | 类型 | 说明 |
373  | -------- | -------- |
374  | Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。|
375
376**错误码:**
377
378  以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。
379
380  | 错误码ID | 错误信息 |
381  | ------- | -------------------------------- |
382  | 202 | Not System App. Interface caller is not a system app. |
383  | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types.|
384  | 16000050 | Internal error. |
385  | 16000059 | Invalid URI type. |
386  | 16000081 | Get target application info failed. |
387
388**示例:**
389
390  ```ts
391
392  import { AbilityConstant, UIAbility, Want, wantConstant, uriPermissionManager } from '@kit.AbilityKit';
393  import { fileUri } from '@kit.CoreFileKit';
394  import { BusinessError } from '@kit.BasicServicesKit';
395
396  export default class EntryAbility extends UIAbility {
397    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
398    }
399
400    onForeground(): void {
401      let targetBundleName: string = 'com.example.demo1';
402      let filePath: string = this.context.filesDir + "/test.txt";
403      let uri: string = fileUri.getUriFromPath(filePath);
404      // revoke uri permission of main application
405      try {
406        let appCloneIndex: number = 0;
407        uriPermissionManager.revokeUriPermission(uri, targetBundleName, appCloneIndex)
408          .then(() => {
409            console.log('revokeUriPermission succeeded.');
410          }).catch((error: BusinessError) => {
411          console.error(`revokeUriPermission failed. error: ${JSON.stringify(error)}.`);
412        });
413      } catch (error) {
414        console.error(`revokeUriPermission failed. error: ${JSON.stringify(error)}.`);
415      }
416
417      // revoke uri permission of clone application
418      try {
419        let appCloneIndex: number = 0;
420        uriPermissionManager.revokeUriPermission(uri, targetBundleName, appCloneIndex)
421          .then(() => {
422            console.log('revokeUriPermission succeeded.');
423          }).catch((error: BusinessError) => {
424          console.error(`revokeUriPermission failed. error: ${JSON.stringify(error)}.`);
425        });
426      } catch (error) {
427        console.error(`revokeUriPermission failed. error: ${JSON.stringify(error)}.`);
428      }
429    }
430  }
431  ```