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