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.FolderAuthorization。 29 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 ```