# 如何分享用户目录文件

#### 问题现象

使用选择器保存用户文件获得URI，通过URI写入文本内容生成文件。系统分享分享此文件URI，无法拉起面板分享文件，应该如何正确分享用户目录下的文件？

#### 背景知识

*   通过分享面板发起分享：宿主应用构造分享数据、构造ShareController以及注册分享面板状态监听。
*   授权持久化：应用通过Picker获取临时授权，临时授权在应用退出后或者设备重启后会清除。如果应用重启或者设备重启后需要直接访问之前已访问过的文件，则对文件进行持久化授权。

#### 解决方案

无法拉起面板分享文件的原因是，应用通过Picker获取URI仅有临时授权，无法进行分享，需要对文件使用fileShare.persistPermission进行持久化授权。

步骤一：申请ohos.permission.FILE\_ACCESS\_PERSIST受限权限，参考步骤申请受限开放权限。

步骤二：使用fileShare.persistPermission获取授权持久化权限的URI，再通过ShareController拉起分享面板。

```
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
import { fileShare, picker } from '@kit.CoreFileKit';
import { uniformTypeDescriptor } from '@kit.ArkData';

@Entry
@Component
struct Index {

  private async shareUserFile(): Promise<void> {
    let uiContext: UIContext = this.getUIContext();
    let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
    // 创建文件管理器选项实例
    const documentSelectOptions = new picker.DocumentSelectOptions();
    // 创建文件选择器实例。
    const documentViewPicker = new picker.DocumentViewPicker(context);
    // 用户选择目标文件夹，用户选择与文件类型相对应的文件夹，即可完成文件保存操作。保存成功后，返回保存文档的URI。
    let uri = (await documentViewPicker.select(documentSelectOptions))[0];

    if (canIUse('SystemCapability.FileManagement.AppFileService.FolderAuthorization')) {
      let policies: Array<fileShare.PolicyInfo> = [{
        uri: uri,
        operationMode: fileShare.OperationMode.READ_MODE,
      }];
      fileShare.persistPermission(policies).then(() => {
        console.info('persistPermission successfully');
        let data: systemShare.SharedData = new systemShare.SharedData({
          utd: uniformTypeDescriptor.UniformDataType.TEXT,
          uri: uri
        });
        // 构建ShareController
        let controller: systemShare.ShareController = new systemShare.ShareController(data);
        // 注册分享面板关闭监听
        controller.on('dismiss', () => {
          console.info('Share panel closed');
          // 分享结束，可处理其他业务。
        });
        console.info('Start  controller.show');
        controller.show(context, {
          previewMode: systemShare.SharePreviewMode.DETAIL,
          selectionMode: systemShare.SelectionMode.SINGLE
        });
      }).catch((err: BusinessError<Array<fileShare.PolicyErrorResult>>) => {
        console.error(`persistPermission failed with error message:  ${err.message} , error code: ${err.code}`);
      });
    }
  }

  build() {
    RelativeContainer() {
      Text('选择文件分享')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.shareUserFile();
        })
    }
    .height('100%')
    .width('100%')
  }
}
```