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