• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 授权持久化(C/C++)
2<!--Kit: Core File Kit-->
3<!--Subsystem: FileManagement-->
4<!--Owner: @lvzhenjie; @hongjin-li_admin-->
5<!--Designer: @chenxi0605; @JerryH1011-->
6<!--Tester: @leiyuqian-->
7<!--Adviser: @foryourself-->
8
9## 场景介绍
10
11应用通过Picker获取临时授权,临时授权在应用退出后或者设备重启后会清除。如果应用重启或者设备重启后需要直接访问之前已访问过的文件,则对文件进行[持久化授权](file-persistPermission.md#场景介绍)。FileShare提供了支持基于uri的文件及目录授予持久化权限、权限激活、权限查询等方法。
12
13## 接口说明
14
15接口的详细介绍请参见[API参考](../reference/apis-core-file-kit/capi-oh-file-share-h.md)。
16
17| 接口名称 | 描述 |
18| -------- | -------- |
19| OH_FileShare_PersistPermission(const FileShare_PolicyInfo *policies, unsigned int policyNum, FileShare_PolicyErrorResult **result, unsigned int *resultNum) | 对所选择的多个文件或目录uri持久化授权。 |
20| OH_FileShare_RevokePermission(const FileShare_PolicyInfo *policies, unsigned int policyNum, FileShare_PolicyErrorResult **result, unsigned int *resultNum) | 对所选择的多个文件或目录uri取消持久化授权。 |
21| OH_FileShare_ActivatePermission(const FileShare_PolicyInfo *policies, unsigned int policyNum, FileShare_PolicyErrorResult **result, unsigned int *resultNum) | 使能多个已经永久授权过的文件或目录uri。 |
22| OH_FileShare_DeactivatePermission(const FileShare_PolicyInfo *policies, unsigned int policyNum, FileShare_PolicyErrorResult **result, unsigned int *resultNum) | 取消使能授权过的多个文件或目录uri。 |
23| OH_FileShare_CheckPersistentPermission(const FileShare_PolicyInfo *policies, unsigned int policyNum, bool **result, unsigned int *resultNum) | 校验所选择的多个文件或目录uri的持久化权限结果。 |
24| OH_FileShare_ReleasePolicyErrorResult(FileShare_PolicyErrorResult *errorResult, unsigned int resultNum) | 释放FileShare_PolicyErrorResult内存。 |
25
26## 约束与限制
27
28- 使用文件分享的相关接口,需确认设备具有以下系统能力:SystemCapability.FileManagement.AppFileService.FolderAuthorization29
30- 在调用文件分享的相关接口前,需要申请权限:"ohos.permission.FILE_ACCESS_PERSIST",申请方式请参考[访问控制-申请应用权限](../security/AccessToken/determine-application-mode.md)。
31
32## 开发步骤
33
34以下步骤描述了如何使用`FileShare`提供的Native API接口。
35
36**添加动态链接库**
37
38CMakeLists.txt中添加以下lib。
39
40```txt
41target_link_libraries(sample PUBLIC libohfileshare.so)
42```
43
44**头文件**
45
46```c++
47#include <filemanagement/fileshare/oh_file_share.h>
48#include <iostream>
49```
501. 创建FileShare_PolicyInfo实例,调用OH_FileShare_PersistPermission接口,设置uri的持久化授权,接口入参policyNum最大上限为500。
51    ```c++
52    static const uint32_t POLICY_NUM = 2;
53    char strTestPath1[] = "file://com.example.fileshare/data/storage/el2/base/files/test1.txt";
54    char strTestPath2[] = "file://com.example.fileshare/data/storage/el2/base/files/test2.txt";
55    FileShare_PolicyInfo policy[POLICY_NUM] = {
56        {strTestPath1, static_cast<unsigned int>(strlen(strTestPath1)), FileShare_OperationMode::READ_MODE},
57        {strTestPath2, static_cast<unsigned int>(strlen(strTestPath2)), FileShare_OperationMode::WRITE_MODE}};
58    FileShare_PolicyErrorResult* result = nullptr;
59    uint32_t resultNum = 0;
60    auto ret = OH_FileShare_PersistPermission(policy, POLICY_NUM, &result, &resultNum);
61    if (ret != ERR_OK) {
62        if (ret == ERR_EPERM && result != nullptr) {
63            for(uint32_t i = 0; i < resultNum; i++) {
64                std::cout << "error uri: " <<  result[i].uri << std::endl;
65                std::cout << "error code: " <<  result[i].code << std::endl;
66                std::cout << "error message: " << result[i].message << std::endl;
67            }
68        }
69    }
70    OH_FileShare_ReleasePolicyErrorResult(result, resultNum);
71    ```
722. 调用OH_FileShare_ActivatePermission接口,激活启用已授权过的uri,接口入参policyNum最大上限为500。
73    ```c++
74    auto ret = OH_FileShare_ActivatePermission(policy, POLICY_NUM, &result, &resultNum);
75    if (ret != ERR_OK) {
76        if (ret == ERR_EPERM && result != nullptr) {
77            for(uint32_t i = 0; i < resultNum; i++) {
78                std::cout << "error uri: " <<  result[i].uri << std::endl;
79                std::cout << "error code: " <<  result[i].code << std::endl;
80                std::cout << "error message: " << result[i].message << std::endl;
81            }
82        }
83    }
84    OH_FileShare_ReleasePolicyErrorResult(result, resultNum);
85    ```
863. 调用OH_FileShare_DeactivatePermission接口,停止已启用授权过uri的访问权限,接口入参policyNum最大上限为500。
87    ```c++
88    auto ret = OH_FileShare_DeactivatePermission(policy, POLICY_NUM, &result, &resultNum);
89    if (ret != ERR_OK) {
90        if (ret == ERR_EPERM && result != nullptr) {
91            for(uint32_t i = 0; i < resultNum; i++) {
92                std::cout << "error uri: " <<  result[i].uri << std::endl;
93                std::cout << "error code: " <<  result[i].code << std::endl;
94                std::cout << "error message: " << result[i].message << std::endl;
95            }
96        }
97    }
98    OH_FileShare_ReleasePolicyErrorResult(result, resultNum);
99    ```
1004. 调用OH_FileShare_RevokePermission接口,撤销已经授权的uri持久化权限,接口入参policyNum最大上限为500。
101    ```c++
102    auto ret = OH_FileShare_RevokePermission(policy, POLICY_NUM, &result, &resultNum);
103    if (ret != ERR_OK) {
104        if (ret == ERR_EPERM && result != nullptr) {
105            for(uint32_t i = 0; i < resultNum; i++) {
106                std::cout << "error uri: " <<  result[i].uri << std::endl;
107                std::cout << "error code: " <<  result[i].code << std::endl;
108                std::cout << "error message: " << result[i].message << std::endl;
109            }
110        }
111    }
112    OH_FileShare_ReleasePolicyErrorResult(result, resultNum);
113    ```
1145. 调用OH_FileShare_CheckPersistentPermission接口,检查uri持久化权限,接口入参policyNum最大上限为500。
115    ```c++
116    bool *result = nullptr;
117    auto ret = OH_FileShare_CheckPersistentPermission(policy, POLICY_NUM, &result, &resultNum);
118    if (result != nullptr && resultNum > 0) {
119        for(uint32_t i = 0; i < resultNum && resultNum <= POLICY_NUM; i++) {
120            std::cout << "uri: " <<  policy[i].uri << std::endl;
121            std::cout << "result: " <<  result[i] << std::endl;
122        }
123    }
124    std::cout << "retCode: " <<  ret << std::endl;
125    free(result);
126    ```