如何分享用户目录文件
==========

#### 问题现象

使用[选择器](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-picker)[保存用户文件](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/save-user-file)获得URI，通过URI写入文本内容生成文件。[系统分享](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/system-share-overview)分享此文件URI，无法拉起面板分享文件，应该如何正确分享用户目录下的文件？

#### 背景知识

*   [通过分享面板发起分享](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/share-mobilephone-app-share)：宿主应用构造分享数据、构造[ShareController](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/share-system-share#section147001858124512)以及注册分享面板状态监听。
*   [授权持久化](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/file-persistpermission)：应用通过Picker获取临时授权，临时授权在应用退出后或者设备重启后会清除。如果应用重启或者设备重启后需要直接访问之前已访问过的文件，则对文件进行持久化授权。

#### 解决方案

无法拉起面板分享文件的原因是，应用通过Picker获取URI仅有临时授权，无法进行分享，需要对文件使用[fileShare.persistPermission](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-fileshare#filesharepersistpermission11)进行持久化授权。

步骤一：申请[ohos.permission.FILE\_ACCESS\_PERSIST](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/restricted-permissions#ohospermissionfile_access_persist)受限权限，参考步骤[申请受限开放权限](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/restricted-permissions)。

步骤二：使用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%')
  }
}