鸿蒙应用框架开发【选择并查看文档与媒体文件】 本地数据与文件 ...

打印 上一主题 下一主题

主题 956|帖子 956|积分 2868

选择并查看文档与媒体文件

先容

应用使用@ohos.file.picker、@ohos.file.fs等接口,实现了picker拉起文档编辑生存、拉起系统相册图片查看、拉起视频并播放的功能。
效果预览


使用阐明:

  • 在首页,应用表现查看最近打开文件功能的跳转按钮,点击后进入文件管理页面,可以通过最近页面,查看最近打开的文件。通过点击右上方的三个按钮,可以分别实现新建文档、选择图片或视频并打开预览、选择文档并打开的功能。
  • 在查看文档界面,点击右上方左一按钮,可以实现当前文档另存为的功能;点击右上方中间的按钮,开启文档的编辑功能,textArea变成可编辑状态,用户输入数据后点击右上方第三个按钮,可以将当前文档内容进行生存操作(系统文档没有生存权限)。
  • 在查看图片界面,picker拉起系统相册的图片,用户至多可选择三张图片查看,点击图片可以切换所表现的图片名及大小信息。
  • 在查看视频界面,picker拉起系统相册的视频,用户至多可选择三个视频查看,点击视频播放并且可以表现的视频名及大小信息。
详细实现



  • 拉起picker选择文件、拉起picker生存文件、拉起picker选择图片或视频的功能封装在Index.ets,源码参考:[Index.ets]
  1. /*
  2. * Copyright (c) 2024 Huawei Device Co., Ltd.
  3. * Licensed under the Apache License, Version 2.0 (the 'License');
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. *     http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an 'AS IS' BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. import { router } from '@kit.ArkUI';
  16. import { picker } from '@kit.CoreFileKit';
  17. import { BusinessError } from '@kit.BasicServicesKit';
  18. import Logger from '../common/Logger';
  19. import MediaFileUri from '../media/MediaFileUri';
  20. import { Constants } from '../common/Constants';
  21. const MAX_SELECT_NUM = 3; // 选择媒体文件的最大数目
  22. const TAG = 'pickerIndex';
  23. @Entry
  24. @Component
  25. struct Index {
  26.   @State uri: string = 'Hello World';
  27.   @State filename: string = '';
  28.   @State sizeFile: number = 0;
  29.   @State log: string = '';
  30.   @State imageFlagCur: number = 0;
  31.   @StorageLink('fileSizeList') fileSizeList: Array<number> = [];
  32.   @StorageLink('fileNameList') fileNameList: Array<string> = [];
  33.   @StorageLink('fileUriList') fileUriList: Array<string> = [];
  34.   @StorageLink('imageNames') imageNames: Array<string> = [];
  35.   mediaFileUri: MediaFileUri = new MediaFileUri();
  36.   scroller: Scroller = new Scroller();
  37.   authorizeBundleName: string = 'com.open.file.uri.demo';
  38.   // 拉起picker选择文件
  39.   async callFilePickerSelectFile(): Promise<void> {
  40.     try {
  41.       let DocumentSelectOptions = new picker.DocumentSelectOptions();
  42.       let documentPicker = new picker.DocumentViewPicker();
  43.       documentPicker.select(DocumentSelectOptions).then((DocumentSelectResult) => {
  44.         Logger.info(TAG,
  45.           'DocumentViewPicker.select successfully, DocumentSelectResult uri: ' + JSON.stringify(DocumentSelectResult));
  46.         let editFlag = false;
  47.         if (DocumentSelectResult !== null && DocumentSelectResult !== undefined) {
  48.           DocumentSelectResult.forEach((value) => {
  49.             this.uri = value;
  50.             editFlag = true;
  51.             Logger.info(TAG, `select file uri: ${this.uri}`);
  52.           })
  53.         }
  54.         if (editFlag) {
  55.           this.getFilenameByUri(this.uri);
  56.         }
  57.       }).catch((err: BusinessError) => {
  58.         Logger.error(TAG, 'DocumentViewPicker.select failed with err: ' + JSON.stringify(err));
  59.       });
  60.     } catch (err) {
  61.       Logger.error(TAG, 'DocumentViewPicker failed with err: ' + JSON.stringify(err));
  62.     }
  63.   }
  64.   // 拉起picker保存文件
  65.   async callFilePickerSaveFile(): Promise<void> {
  66.     try {
  67.       let DocumentSaveOptions = new picker.DocumentSaveOptions();
  68.       DocumentSaveOptions.newFileNames = ['MyDocument_01.txt'];
  69.       let documentPicker = new picker.DocumentViewPicker();
  70.       documentPicker.save(DocumentSaveOptions).then((DocumentSaveResult) => {
  71.         Logger.info(TAG,
  72.           'DocumentViewPicker.save successfully, DocumentSaveResult uri: ' + JSON.stringify(DocumentSaveResult));
  73.         if (DocumentSaveResult !== null && DocumentSaveResult !== undefined) {
  74.           this.uri = DocumentSaveResult[0];
  75.           Logger.info(TAG, `save file uri: ${this.uri}`);
  76.         }
  77.         this.getFilenameByUri(this.uri);
  78.       }).catch((err: BusinessError) => {
  79.         Logger.error(TAG, 'DocumentViewPicker.save failed with err: ' + JSON.stringify(err));
  80.       });
  81.     } catch (err) {
  82.       Logger.error(TAG, 'DocumentViewPicker failed with err: ' + err);
  83.     }
  84.   }
  85.   async getFilenameByUriForMedia(myUris: string[]) {
  86.     router.pushUrl({
  87.       url: 'pages/ViewMedia',
  88.       params: {
  89.         uris: myUris
  90.       }
  91.     }, router.RouterMode.Standard);
  92.   }
  93.   async getFilenameByUri(myUri: string): Promise<void> {
  94.     // 获取文件名称
  95.     this.filename = (myUri.split('/').pop()) as string;
  96.     router.pushUrl({
  97.       url: 'pages/EditFile',
  98.       params: {
  99.         fileName: this.filename,
  100.         myUri: myUri
  101.       }
  102.     }, router.RouterMode.Standard);
  103.   }
  104.   // 拉起picker选择图片/视频
  105.   async callFilePickerSelectImage(): Promise<void> {
  106.     let array: string[];
  107.     try {
  108.       // 设置photoPicker的参数
  109.       let PhotoSelectOptions = new picker.PhotoSelectOptions();
  110.       // 过滤选择媒体文件类型
  111.       PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE;
  112.       // 选择媒体文件的最大数目
  113.       PhotoSelectOptions.maxSelectNumber = MAX_SELECT_NUM;
  114.       let mediaFlag = false;
  115.       // 使用图库选择器对象前,需要先创建PhotoViewPicker实例
  116.       let photoPicker = new picker.PhotoViewPicker();
  117.       photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult) => {
  118.         // 日志中记录成功信息
  119.         Logger.info(TAG,
  120.           'PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
  121.         // 接口采用callback异步返回形式,返回PhotoSelectResult对象,故进行下一步操作前要先判断是否已经成功返回PhotoSelectResult对象了
  122.         if (PhotoSelectResult !== null && PhotoSelectResult !== undefined) {
  123.           // PhotoSelectResult为返回的结果集。
  124.           // 其中包含Array<string>类型的photoUris,为返回图库选择后的媒体文件的uri数组;还包含boolean类型的isOriginalPhoto,指示返回图库选择后的媒体文件是否为原图。
  125.           // 声明变量array,其取值为PhotoSelectResult中的数组。
  126.           array = PhotoSelectResult['photoUris'];
  127.           array.forEach((value) => {
  128.             this.uri = value;
  129.             mediaFlag = true;
  130.             Logger.info(TAG, `select image/video uri: ${this.uri}`);
  131.           })
  132.         }
  133.         if (mediaFlag) {
  134.           this.getFilenameByUriForMedia(array);
  135.         }
  136.       }).catch((err: BusinessError) => {
  137.         Logger.error(TAG, 'PhotoViewPicker.select failed with err: ' + JSON.stringify(err));
  138.       });
  139.     } catch (err) {
  140.       Logger.error(TAG, 'PhotoViewPicker failed with err: ' + err);
  141.     }
  142.   }
  143.   aboutToDisappear(): void {
  144.     this.fileNameList = [];
  145.     this.fileSizeList = [];
  146.     this.fileUriList = [];
  147.   }
  148.   onPageShow(): void {
  149.     this.mediaFileUri.getAllFiles();
  150.   }
  151.   build() {
  152.     Scroll(this.scroller) {
  153.       Row() {
  154.         Column() {
  155.           Row() {
  156.             Column() {
  157.               Text($r('app.string.last_open'))
  158.                 .fontFamily('HarmonyHeiTi-Bold')
  159.                 .fontSize($r('app.float.text_font_size_30'))
  160.                 .fontWeight(Constants.TEXT_FONT_WIGHT)
  161.                 .textAlign(TextAlign.Start)
  162.                 .fontColor($r('app.color.text_font_color'))
  163.                 .lineHeight($r('app.float.first_line_height'))
  164.                 .width(Constants.SEVENTY_PERCENT)
  165.                 .height($r('app.float.first_line_height'
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表