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