目录

如何分享用户目录文件

问题现象

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

背景知识

解决方案

无法拉起面板分享文件的原因是,应用通过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%')
  }
}