应用文件分享功能介绍

应用文件分享功能介绍

HarmonyOS
2024-05-20 22:15:02
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

应用间通常需要将应用内文件传递给其他应用,以达到数据传递的作用,这个示例是基于uri实现的分享功能。应用可分享单个文件,通过ohos.app.ability.wantConstant的wantConstant.Flags接口以只读或读写权限授权给其他应用。应用可通过ohos.file.fs的open()接口打开URI,并进行读写操作。

核心代码解释

首页使用fs.listFileSync获取当前应用沙箱文件夹下的文件,同时,可通过router.pushUrl跳转进入文件详情页面。详情页面将路由携带过来的文件内容展示出来,并在详情页面提供分享按钮,点击分享按钮调用startAbility拉起被分享应用。最后在接受方应用完成文件接收处理。

列出所有文件夹名字:

getFileList(filesDir: string = this.filesDir) { 
  class options { 
    recursion:boolean//false 
    listNum: number//0 
    filter:innerParams //{ suffix: ['.txt','.png']} 
  
    constructor(r:boolean,l:number,f:string[]) { 
      this.recursion = r 
      this.listNum = l 
      this.filter = new innerParams(f) 
    } 
  }; 
  class innerParams { 
    suffix:string[] 
  
    constructor(tuple:string[]) { 
      this.suffix = tuple 
    } 
  } 
  //列出文件夹下所有文件名 
  let filenames = fs.listFileSync(filesDir,new options(false,0,['.txt','.png'])); 
  console.info('filenames',filenames) 
  Logger.info(TAG, 'listFile succeed'); 
  for (let i = 0; i < filenames.length; i++) { 
    Logger.info(TAG, 'filename: %s', filenames[i]); 
    let filename = filenames[i]; 
    this.fileNameList[i] = filename; 
    let filePath = filesDir + '/' + filename; 
    this.filePathDir = filesDir; 
    if (filename.indexOf('.') != -1) { 
      //获取文件详细属性信息 
      let sta = fs.statSync(filePath); 
      this.fileSizeList[i] = sta.size; 
      this.fileInfoList[i] = JSON.stringify(sta.size) + 'B'; 
    } else { 
      let subFilenames = fs.listFileSync(filePath, new options(false,0,['.txt','.png'])); 
      let subFileStr:string = AppStorage.Get('subFilenames')||''; 
      this.fileInfoList[i] = JSON.stringify(subFilenames.length) + subFileStr; 
    } 
  } 
}

首页列表渲染:

 List({ space: 12, initialIndex: 0 }) { 
                  ForEach(this.fileNameList, (item:string, index) => { 
                    ListItem() { 
                      Row() { 
                        Image($r('app.media.ic_docs')) 
                          .width('5%') 
                          .height(22) 
                          .margin({ left: '3%', right: 0 }) 
  
                        Text('item' + item) 
                          .fontSize(16) 
                          .fontFamily('HarmonyHeiTi-Medium') 
                          .fontColor('#182431') 
                          .lineHeight(22) 
                          .fontWeight(500) 
                          .textAlign(TextAlign.Start) 
                          .width('60%') 
                          .margin({ left: 19, right: 0 }) 
  
                        Text(this.fileInfoList[index]) 
                          .fontSize(14) 
                          .fontFamily('HarmonyHeiTi-Medium') 
                          .lineHeight(19) 
                          .fontColor('#182431') 
                          .textAlign(TextAlign.End) 
                          .opacity(0.6) 
                          .width('22%') 
                          .margin({ left: '12%', right: 0 }) 
                      } 
                      .padding({right: '3%' }) 
                      .borderRadius(24) 
                      .width('100%') 
                      .height(64) 
                      .backgroundColor('#FFFFFF') 
                    } 
                    .onClick(() => { 
                      class routerParams { 
                        fileName:string 
                        fileContent:string 
                        path:string 
                        constructor(str:string,fileContent:string,path:string) { 
                          this.fileName = str 
                          this.fileContent = fileContent 
                          this.path = path 
                        } 
                      } 
                        let filePath = this.filesDir + '/' + item; 
                        let index = filePath.indexOf('.'); 
  
                        let fileTestDirPath = this.filePathDir + '/' + item; 
                        let content = ''; 
                        let myUri = ''; 
  
                        if (fs.accessSync(fileTestDirPath) && this.dirFlag) { 
                          content = this.fileFs.getFileContent(fileTestDirPath); 
                          myUri = fileUri.getUriFromPath(fileTestDirPath); 
                          router.pushUrl({ 
                            url: 'pages/Show', 
                            params: new routerParams(item,content,fileTestDirPath) 
                          }, router.RouterMode.Standard); 
                        } else { 
                          content = this.fileFs.getFileContent(filePath); 
                          myUri = fileUri.getUriFromPath(filePath); 
                          router.pushUrl({ 
                            url: 'pages/Show', 
                            params: new routerParams(item,content,filePath) 
                          }, router.RouterMode.Standard); 
                        } 
  
                    }) 
                  }) 
                } 
                .margin({ top: '1%', left: 12, right: 12 }) 
                .listDirection(Axis.Vertical) // 排列方向 
                .id('sandboxFileList') 
                .edgeEffect(EdgeEffect.Spring) // 滑动到边缘无效果 
                .scrollBar(BarState.Auto) 
                .alignListItem(ListItemAlign.Center)

详情页面展示

onPageShow() { 
    this.myFileContent = this.fileFs.getFileContent(this.path); 
    this.myFileSize = fs.statSync(this.path).size; 
  } 
  
  build() { 
    Column() { 
      // 第一行 
      Row() { 
        // 后退箭头 
        Row() { 
          Image($r('app.media.ic_back')) 
            .focusable(true) 
            .focusOnTouch(true) 
            .width(25) 
            .height(25) 
            .id('back') 
            .align(Alignment.Start) 
            .onClick(() => { 
              router.back(); 
            }) 
        } 
        .margin({ right: '5%' }) 
  
        // 文件名及信息 
        Column() { 
          Row() { // 文件名 
            Text(this.myFileName) 
              .focusable(true) 
              .focusOnTouch(true) 
              .fontSize(20) 
              .fontFamily('HarmonyHeiTi-Bold') 
              .fontColor('#182431') 
              .textAlign(TextAlign.Start) 
              .fontWeight(700) 
              .lineHeight(28) 
              .maxLines(1) 
              .textOverflow({ overflow: TextOverflow.Ellipsis }) 
          } 
          .align(Alignment.Start) 
          .margin({ top: '0.4%', bottom: '0.3%' }) 
          .width('100%') 
  
          Row() { // 文件大小 
            Text('size: ' + JSON.stringify(this.myFileSize) + 'B') 
              .focusable(true) 
              .focusOnTouch(true) 
              .opacity(0.6) 
              .fontFamily('HarmonyHeiTi') 
              .fontSize(14) 
              .fontColor('#182431') 
              .textAlign(TextAlign.Start) 
              .lineHeight(19) 
              .fontWeight(400) 
          } 
          .margin({ top: '0.3%', bottom: '0.5%' }) 
          .align(Alignment.Start) 
          .width('100%') 
        } 
        .width('45%') 
  
        // 右边两个图标 
        Row() { 
          Image($r('app.media.ic_share')) 
            .focusable(true) 
            .focusOnTouch(true) 
            .width(25) 
            .height(25) 
            .id('share') 
            .margin({ right: '5%' }) 
            .onClick(() => { 
              console.log(this.path); 
              let file = fs.openSync(this.path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 
              let context = getContext(this); 
              this.fileFs.implicitStartAbility(context, this.myFileName, this.myFileSize, file.fd, this.path); 
              // this.example() 
            }) 
        } 
        .height('100%') 
        .width('50%') 
        .padding({ right: '6%' }) 
        .justifyContent(FlexAlign.End) 
      } 
      .height('7.4%') 
      .width('100%') 
  
  
      // Scroll(this.scroller) { 
        // TextArea的行容器 
        Row() { 
          if(this.myFileName.indexOf('png')==-1){ 
            TextArea({ text: this.myFileContent }) 
              .id('textArea') 
              .fontSize(16) 
              .fontColor('#182431') 
              .opacity(this.opacityValue) 
              .fontWeight(400) 
              .align(Alignment.Center) 
              .textAlign(TextAlign.Start) 
              .backgroundColor('#f1f3f5') 
              .fontFamily('HarmonyHeiTi') 
              .focusable(false) 
              .focusOnTouch(true) 
              .defaultFocus(false) 
              .padding({ 
                top: 8, 
                right: 0, 
                left: 0, 
                bottom: 8 
              }) // 默认为top: 8 vp, right: 16 vp, bottom: 8 vp, left: 16 vp,需要更改 
          }else{ 
            Image(this.myFileContent) 
              .width(200) 
              .height(200) 
          } 
  
        } 
        .padding({ top: 8 }) 
        .height('50%') 
      } 
      .margin({ top: 8 }) 
  }

获取文件内容:

getFileContent(path: string): string { 
    let resultPut = ''; 
    try { 
      if(path.indexOf('png')==-1){ 
        let file = fs.openSync(path, fs.OpenMode.READ_WRITE); 
        let buf = new ArrayBuffer(BUFFER_SIZE); 
        let num = fs.readSync(file.fd, buf); 
        resultPut = bufferToString(buf); 
        fs.closeSync(file); 
      }else{ 
        let sta = fs.statSync(path) 
        if(sta.size>4019){ 
          resultPut = picMaxContent 
        }else { 
          resultPut = picMinContent 
        } 
      } 
  
      return resultPut; 
    } catch (e) { 
      return resultPut; 
    } 
  }

拉起被分享应用

implicitStartAbility(context, fileName: string, fileSize: number, fileFd: number, filePath: string): void { 
    let myUri: string = fileUri.getUriFromPath(filePath); 
    let mode = wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION; 
    let want: Want = { 
      action:  "ohos.want.action.viewData",//    ohos.want.action.sendData ohos.want.action.viewData 
      flags: mode, 
      type: fileName.indexOf('png')!=-1?'image/png':'text/plain',//text/plain   image/* 
      uri: myUri 
    }; 
    console.log("want",want) 
    context.startAbility(want).then((data) => { 
    }).catch((err) => { 
    }); 
  }

接收方配置:

 "skills": [ 
          { 
            "actions": [ 
              "ohos.want.action.viewData" 
            ], 
            "uris": [ 
              { 
                "scheme": "file", 
                "type": "image/png" 
              }, 
              { 
                "scheme": "file", 
                "type": "text/plain" 
              } 
            ] 
          } 
        ]

在ability中接收参数

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 
    AppStorage.SetOrCreate('path', want.uri); 
  } 
  onNewWant(want, launchParams) { 
    AppStorage.Link('path').set(want.uri); 

实现效果:

适配版本信息

IDE:DevEco Studio 4.0.3.600

SDK:HarmoneyOS 4.0.0.42

分享
微博
QQ
微信
回复
2024-05-22 16:07:32
相关问题
ArkTS应用文件分享报错,code:16000050
2124浏览 • 1回复 待解决
HarmonyOS 应用文件分享-读写权限咨询
306浏览 • 1回复 待解决
分享沙箱文件,应用分享单个文件
895浏览 • 1回复 待解决
HarmonyOS 分享功能如何实现?
54浏览 • 1回复 待解决
鸿蒙如何实现分享功能
17422浏览 • 2回复 待解决
应用调用系统分享框失败
272浏览 • 1回复 待解决
HarmonyOS如何使用系统分享图片、文件
351浏览 • 1回复 待解决
HarmonyOS @style详细介绍
406浏览 • 1回复 待解决
图片边框borderImage介绍
956浏览 • 1回复 待解决
NAPI介绍(九) - gdb调试
510浏览 • 1回复 待解决
如何将图片文本视频分享给其他应用
750浏览 • 1回复 待解决