鸿蒙开发5.0【Picker的受限权限适配方案】

news2024/12/25 8:58:02

Picker由系统独立进程实现,应用可以通过拉起Picker组件,用户在Picker上选择对应的资源(如图片、文档等),应用可以获取Picker返回的结果。

类型受限权限使用的picker
音频ohos.permission.READ_AUDIO,ohos.permission.WRITE_AUDIOAudioViewPicker
文件ohos.permission.READ_DOCUMENT,ohos.permission.WRITE_DOCUMENTDocumentViewPicker
照片ohos.permission.READ_IMAGEVIDEO,ohos.permission.WRITE_IMAGEVIDEOPhotoViewPicker
联系人ohos.permission.READ_CONTACTSContacts Picker
相机ohos.permission.CAMERACamera Picker
扫码ohos.permission.CAMERA扫码Picker
卡证识别ohos.permission.CAMERA卡证识别Picker
文档扫描ohos.permission.CAMERA文档扫描Picker

目前支持的Picker组件有:

  • 音频Picker(AudioViewPicker):选择、保存音频文件。
  • 文件Picker(DocumentViewPicker):选择、保存文档文件。
  • 照片Picker(PhotoViewPicker):选择、保存图片文件。
  • 联系人Picker(Contacts Picker):选择联系人。
  • 相机Picker (Camera Picker):拍照、录制。
  • 扫码Picker:扫码。
  • 卡证识别Picker:识别并提取卡证信息。
  • 文档扫描Picker:拍摄文档并转化为高清扫描件。
  • 投播组件Picker:可用于将音视频资源投放到其它设备播放。

音频Picker

使用音频Picker(AudioViewPicker)可访问、保存用户公共目录的音频文件。

  • 在应用需要申请权限ohos.permission.READ_AUDIO以访问用户公共目录的音频文件时,可以使用FilePicker中的AudioViewPicker替代

    async function example13() {
      try {
        let audioSelectOptions = new picker.AudioSelectOptions();
        let audioPicker = new picker.AudioViewPicker();
        audioPicker.select(audioSelectOptions).then((audioSelectResult: Array<string>) => {
          console.info('AudioViewPicker.select successfully, audioSelectResult uri: ' + JSON.stringify(audioSelectResult));
        }).catch((err: BusinessError) => {
          console.error('AudioViewPicker.select failed with err: ' + JSON.stringify(err));
        });
      } catch (error) {
        let err: BusinessError = error as BusinessError;
        console.error('AudioViewPicker failed with err: ' + JSON.stringify(err));
      }
    }
    
  • 在应用需要申请权限ohos.permission.WRITE_AUDIO以修改用户公共目录的音频文件时,可以使用FilePicker中的AudioViewPicker替代

    async function example16() {
      try {
        let audioSaveOptions = new picker.AudioSaveOptions();
        audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3'];
        let audioPicker = new picker.AudioViewPicker();
        audioPicker.save(audioSaveOptions).then((audioSaveResult: Array<string>) => {
          console.info('AudioViewPicker.save successfully, audioSaveResult uri: ' + JSON.stringify(audioSaveResult))
        }).catch((err: BusinessError) => {
          console.error('AudioViewPicker.save failed with err: ' + JSON.stringify(err));
        });
      } catch (error) {
        let err: BusinessError = error as BusinessError;
        console.error('AudioViewPicker failed with err: ' + JSON.stringify(err));
      }
    }
    
  • save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。使用fs.openSync接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。最后再将通过fs.read读取到selecturi的音频文件的buffer,再通过fd使用fs.writeSync接口将buffer写入这个音频文件,编辑修改完成后关闭fd。

    Button('写入音频')
      .backgroundColor('#0D9FFB')
      .fontSize(20)
      .fontColor('#FFFFFF')
      .fontWeight(FontWeight.Normal)
      .align(Alignment.Center)
      .type(ButtonType.Capsule)
      .width('90%')
      .height(40)
      .margin({ top: 5, bottom: 5 })
      .onClick(() => {
        let file = fs.openSync(selecturi, fs.OpenMode.READ_WRITE)
        let file1 = fs.openSync(saveuri, fs.OpenMode.READ_WRITE)
        let arrayBuffer = new ArrayBuffer(5120000);
        fs.read(file.fd, arrayBuffer)
        fs.writeSync(file1.fd, arrayBuffer);
        fs.close(file1)
        fs.close(file)
      })
    

文件Picker

使用文件Picker(DocumentViewPicker)可访问、保存公共目录中非媒体类型的文件。

  • 在应用需要申请权限ohos.permission.READ_DOCUMENT以访问用户公共目录中非媒体类型的文件时,可以使用FilePicker中的DocumentViewPicker替代

    async function example07() {
      try {
        let documentSelectOptions = new picker.DocumentSelectOptions();
        let documentPicker = new picker.DocumentViewPicker();
        documentPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => {
          console.info('DocumentViewPicker.select successfully, documentSelectResult uri: ' + JSON.stringify(documentSelectResult));
        }).catch((err: BusinessError) => {
          console.error('DocumentViewPicker.select failed with err: ' + JSON.stringify(err));
        });
      } catch (error) {
        let err: BusinessError = error as BusinessError;
        console.error('DocumentViewPicker failed with err: ' + JSON.stringify(err));
      }
    }
    
  • 在应用需要申请权限ohos.permission.WRITE_DOCUMENT以修改用户公共目录中非媒体类型的文件时,可以使用FilePicker中的DocumentViewPicker替代

    async function example10() {
      try {
        let documentSaveOptions = new picker.DocumentSaveOptions();
        documentSaveOptions.newFileNames = ['DocumentViewPicker01.txt'];
        let documentPicker = new picker.DocumentViewPicker();
        documentPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
          console.info('DocumentViewPicker.save successfully, documentSaveResult uri: ' + JSON.stringify(documentSaveResult));
        }).catch((err: BusinessError) => {
          console.error('DocumentViewPicker.save failed with err: ' + JSON.stringify(err));
        });
      } catch (error) {
        let err: BusinessError = error as BusinessError;
        console.error('DocumentViewPicker failed with err: ' + JSON.stringify(err));
      }
    }
    
  • save返回的uri权限是读写权限,可以根据结果集中uri进行文件读写等操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。使用fs.openSync接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_WRITE。最后通过fd使用fs.writeSync接口对这个文件进行编辑修改,编辑修改完成后关闭fd。

    Button('写入文件')
      .backgroundColor('#0D9FFB')
      .fontSize(20)
      .fontColor('#FFFFFF')
      .fontWeight(FontWeight.Normal)
      .align(Alignment.Center)
      .type(ButtonType.Capsule)
      .width('90%')
      .height(40)
      .margin({ top: 5, bottom: 5 })
      .onClick(() => {
        let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
        console.info('file fd: ' + file.fd);
        let writeLen = fs.writeSync(file.fd, 'hello, world');
        console.info('write data to file succeed and size is:' + writeLen);
        fs.closeSync(file);
      })
    

照片Picker

使用照片Picker(PhotoViewPicker)可访问、保存公共目录的图片或视频文件。

  • 在应用需要申请权限ohos.permission.READ_IMAGEVIDEO以访问用户公共目录的图片或视频文件时,可以使用PhotoViewPicker替代

    async function example01() {
      try {
        let photoSelectOptions = new picker.PhotoSelectOptions();
        photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
        photoSelectOptions.maxSelectNumber = 5;
        let photoPicker = new picker.PhotoViewPicker();
        photoPicker.select(photoSelectOptions).then((photoSelectResult: picker.PhotoSelectResult) => {
          console.info('PhotoViewPicker.select successfully, photoSelectResult uri: ' + JSON.stringify(photoSelectResult));
        }).catch((err: BusinessError) => {
          console.error('PhotoViewPicker.select failed with err: ' + JSON.stringify(err));
        });
      } catch (error) {
        let err: BusinessError = error as BusinessError;
        console.error('PhotoViewPicker failed with err: ' + JSON.stringify(err));
      }
    }
    
  • 在应用需要申请权限ohos.permission.WRITE_IMAGEVIDEO以保存用户公共目录的图片或视频文件时,可以使用安全控件替代

    @Entry
    @Component
    struct Index {
      @State message: string = 'Hello World'
      @State saveButtonOptions: SaveButtonOptions = {
        icon: SaveIconStyle.FULL_FILLED,
        text: SaveDescription.SAVE_IMAGE,
        buttonType: ButtonType.Capsule
      } // 设置安全控件按钮属性
    
      build() {
        Row() {
          Column() {
            Text(this.message)
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
            SaveButton(this.saveButtonOptions)// 创建安全控件按钮
              .onClick(async (event, result: SaveButtonOnClickResult) => {
                if (result == SaveButtonOnClickResult.SUCCESS) {
                  try {
                    let context = getContext();
                    let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
                    // 需要确保fileUri对应的资源存在
                    let fileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg';
                    let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest =
                      photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, fileUri);
                    await phAccessHelper.applyChanges(assetChangeRequest);
                    console.info('createAsset successfully, uri: ' + assetChangeRequest.getAsset().uri);
                  } catch (err) {
                    console.error(`create asset failed with error: ${err.code}, ${err.message}`);
                  }
                } else {
                  console.error('SaveButtonOnClickResult create asset failed');
                }
              })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
    

联系人Picker

使用联系人Picker(Contacts Picker)可读取联系人数据。

在应用需要申请权限ohos.permission.READ_CONTACTS以读取联系人数据时,可以使用Contacts Picker替代

async function demo() {
  contact.selectContacts((err: BusinessError, data) => {
    if (err) {
      console.log(`selectContacts callback: err->${JSON.stringify(err)}`);
      return;
    }
    console.log(`selectContacts callback: success data->${JSON.stringify(data)}`);
  });
}

相机Picker

使用相机Picker (Camera Picker)可实现拍照、录制。

在应用需要申请权限ohos.permission.CAMERA以使用相机时,可以使用Camera Picker替代

async function demo1() {
  try {
    let pickerProfile: picker.PickerProfile = {
      cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK
    };
    let pickerResult: picker.PickerResult = await picker.pick(mContext,
      [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO], pickerProfile);
    console.log("the pick pickerResult is:" + JSON.stringify(pickerResult));
  } catch (error) {
    let err = error as BusinessError;
    console.error(`the pick call failed. error code: ${err.code}`);
  }
}

扫码Picker

使用扫码Picker可调用相机,实现默认界面扫码。

在应用需要申请权限ohos.permission.CAMERA以使用相机扫码时,可以使用扫码Picker替代

// 定义扫码参数options
let options: scanBarcode.ScanOptions = {
  scanTypes: [scanCore.ScanType.ALL],
  enableMultiMode: true,
  enableAlbum: true
};
// 可调用getContext接口获取当前页面关联的UIAbilityContext
scanBarcode.startScanForResult(getContext(this), options).then((result: scanBarcode.ScanResult) => {
  // 收到扫码结果后返回
  hilog.info(0x0001, '[Scan CPSample]', `Succeeded in getting ScanResult by promise with options, result is ${JSON.stringify(result)}`);
}).catch((error: BusinessError) => {
  hilog.error(0x0001, '[Scan CPSample]',
    `Failed to get ScanResult by promise with options. Code:${error.code}, message: ${error.message}`);
});

卡证识别Picker

使用卡证识别Picker可调用相机,识别各类证件并提取卡证信息。

在应用需要申请权限ohos.permission.CAMERA以使用相机识别卡证时,可以使用卡证识别Picker替代

Stack({ alignContent: Alignment.Top }) {
  CardRecognition({
    // 此处选择身份证类型作为示例
    supportType: CardType.CARD_ID,
    callback: ((params: CallbackParam) => {
      hilog.info(0x0001, TAG, `params code: ${params.code}`)
      hilog.info(0x0001, TAG, `params cardType: ${params.cardType}`)
      hilog.info(0x0001, TAG, `params cardInfo front: ${JSON.stringify(params.cardInfo?.front)}`)
      hilog.info(0x0001, TAG, `params cardInfo back: ${JSON.stringify(params.cardInfo?.back)}`)
    })
  })

文档扫描Picker

使用文档扫描Picker可调用相机,拍摄文档并转化为高清扫描件。

@Component
struct DocDemoPage {
  @State docImageUris: string[] = []
  private docScanConfig = new DocumentScannerConfig()

  aboutToAppear() {
    this.docScanConfig.supportType = [DocType.DOC, DocType.SHEET]
    this.docScanConfig.isGallerySupported = true
    this.docScanConfig.editTabs = []
    this.docScanConfig.maxShotCount = 3
    this.docScanConfig.defaultFilterId = FilterId.ORIGINAL
    this.docScanConfig.defaultShootingMode = ShootingMode.MANUAL
    this.docScanConfig.isShareable = true
    this.docScanConfig.originalUris = []
  }

  build() {
    Stack({ alignContent: Alignment.Top }) {
      DocumentScanner({
        scannerConfig: this.docScanConfig,
        onResult: (code: number, saveType: SaveOption, uris: string[]) => {
          hilog.info(0x0001, TAG, `result code: ${code}, save: ${saveType}`)
          uris.forEach(uriString => {
            hilog.info(0x0001, TAG, `uri: ${uriString}`)
          })
          this.docImageUris = uris
        }
      })
        .size({ width: '100%', height: '100%' })
    }
    .width('100%')
    .height('100%')
  }
}

投播组件Picker

使用投播组件Picker,可用于将音视频资源投放到其它设备播放。

@Component
struct Index {
  private onStateChange(state: AVCastPickerState) {
    if (state == AVCastPickerState.STATE_APPEARING) {
      console.log('The picker starts showing.')
    } else if (state == AVCastPickerState.STATE_DISAPPEARING) {
      console.log('The picker finishes presenting.')
    }
  }

  build() {
    Row() {
      Column() {
        AVCastPicker({ normalColor: Color.Red, activeColor: Color.Blue, onStateChange: this.onStateChange })
          .width('40vp')
          .height('40vp')
          .border({ width: 1, color: Color.Red })
      }.height('50%')
    }.width('50%')
  }
}

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无人机设计与控制】 四轴飞行器的位移控制

摘要 本文介绍了一种四轴飞行器的位移控制方法&#xff0c;并通过Simulink模型进行仿真和验证。该方法通过PID控制器对飞行器的位移进行精确调节&#xff0c;以实现飞行器在三维空间中的稳定定位和路径跟踪。通过参数调节&#xff0c;能够适应不同的飞行任务需求&#xff0c;确…

UnLua环境搭建

一、环境搭建 1、下载UnLua工程&#xff1a;https://github.com/Tencent/UnLua 2、复制Plugins/UnLua目录下的插件到自己的项目中 3、重新生成自己的VS工程 4、打开VS工程的项目名.Build.cs文件&#xff0c;引用UnLua插件,重新编译工程 PublicDependencyModuleNames.AddRan…

【Nacos】Nacos快速上手使用(注册中心)【详解】

文章目录 1.基本介绍2. 使用Nacos服务注册中心2.1创建Nacos提供者集群 8001&#xff0c;80022.2创建Nacos消费者集群 8887 1.基本介绍 Nacos(Dynamic Naming and Configuration Service)是服务中心的另外一种实现。从注册中心的功能实现角度&#xff0c;与Eureka等价&#xff…

HumanNeRF:Free-viewpoint Rendering of Moving People from Monocular Video 翻译

HumanNeRF&#xff1a;单目视频中运动人物的自由视点绘制 引言。我们介绍了一种自由视点渲染方法- HumanNeRF -它适用于一个给定的单眼视频ofa人类执行复杂的身体运动&#xff0c;例如&#xff0c;从YouTube的视频。我们的方法可以在任何帧暂停视频&#xff0c;并从任意新的摄…

Python批量读取身份证信息录入系统和重命名

前言 大家好&#xff0c; 如果你对自动化处理身份证图片感兴趣&#xff0c;可以尝试以下操作&#xff1a;从身份证图片中快速提取信息&#xff0c;填入表格并提交到网页系统。如果你无法完成这个任务&#xff0c;我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。…

教师节送什么礼物给老师好 送礼送什么显高档又实用

教师节送什么礼物给老师好 送礼送什么显高档又实用 教师节即将到来&#xff0c;许多学生和家长都在思考如何表达对老师的感激之情。选择一份合适的礼物不仅能够表达心意&#xff0c;还能让老师感受到学生的关心和尊重。那么&#xff0c;送什么礼物给老师既显高档又实用呢&#…

字节跳动笔试题:自动校对程序:解决王大锤的拼写错误

字节跳动面试题:自动校对程序:解决王大锤的拼写错误 引言问题描述数据范围输入输出描述算法与数据结构伪代码C 代码实现代码解释测试用例边界情况复杂度分析结论后记引言 王大锤,一个出版社的编辑,每天面对海量的英文稿件,不胜其烦。然而,凭借他蓝翔技校挖掘机和程序设计…

[情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!

目录 前言&#xff1a; 一、说话的真实程度分级 二、说谎动机分级&#xff1a;善意谎言、中性谎言、恶意谎言 三、小心&#xff1a;所谓真相&#xff1a;只说对自己有利的真相 四、小心&#xff1a;所谓真相&#xff1a;就是别人想让你知道的真相 五、小心&#xff1a;所…

Redis 事务:支持回滚吗?深入解析

今天我们要来探讨一个关于 Redis 事务的重要问题&#xff1a;Redis 事务支持回滚吗&#xff1f;这个问题在 Redis 的使用中经常被提及&#xff0c;对于正确理解和使用 Redis 事务至关重要。那么&#xff0c;让我们一起深入解析这个问题吧&#xff01; 一、Redis 事务简介 在了…

Linux命令分享 三 (ubuntu 16.04)

1、‘>’ >>输出重定向 用法&#xff1a;命令 参数 > 文件 ls > a.txt ‘>’ 将一个命令的结果不输出到屏幕上&#xff0c;输出到文件中&#xff0c;如果文件不存在就创建文件&#xff0c;如果存在就覆盖文件。 ls >> a.txt ‘>>’ 如果文件不存…

数据结构与算法02 - 复杂度

1、空间复杂度 空间复杂度指的是临时占用存储空间大小的量度&#xff1b;空间复杂度计算的是变量的个数&#xff0c;也采用大O渐进表示法&#xff1b;由于函数在运行的时候所需要的栈空间&#xff08;存储参数、局部变量、一些寄存器信息等&#xff09;在编译器已经确定好了&a…

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN&#xff1a;在生物医学自然语言处理中&#xff0c;NER和NEN是关键任务&#xff0c;它们使得从生物医学文献中自动提取实体&#xff08;如疾病…

modelsim仿真流程

modelsim仿真流程 1、建立工程 project new "../prj" test.mpf2、添加rtl文件 project addfile "../test.v" verilog3、建立仿真库 vlib work4、编译rtl到仿真库中 vlog -sv -sv09compat defineT133 incdir"../rtl" test.v -work work5、加载…

【Python】6.基础语法(6)文件

文章目录 1. 文件是什么2. 文件路径3. 文件操作3.1 打开文件3.2 关闭文件3.3 写文件3.4 读文件 4. 关于中文的处理5. 使用上下文管理器 1. 文件是什么 变量是把数据保存到内存中。如果程序重启/主机重启, 内存中的数据就会丢失。 要想能让数据被持久化存储, 就可以把数据存储…

openGauss 之索引回表

一. 前言 ​ 在openGauss中如果表有索引信息&#xff0c;查询的谓词条件中又包含索引列&#xff0c;openGauss支持通过索引信息快速拿到需要访问元组的位置信息&#xff0c;然后直接到该位置上取出元组数据&#xff0c;称之为回表查询。如下所示&#xff0c;利用索引索引…

JS中this指向问题

首先&#xff0c;this的绑定和定义的位置无关&#xff0c;它的指向只和调用方式有关&#xff0c;this只有在运行时才知道指向谁。 一&#xff0c;默认绑定 默认绑定&#xff0c;也可以说是独立函数调用&#xff0c;这时this指向window。 function foo() {console.log(this) …

DataGrip数据迁移

第一步 第二步 第三步 第四步 选择你刚刚到处的文件即可

海信发布以旧换新举措,补贴力度、补贴链路、服务体验全面升级

9月7日&#xff0c;由中国家用电器商业协会主办的“海信全国十城联动以旧换新”发布会在北京举行。 据「TMT星球」了解&#xff0c;活动以“品质换新就选海信”为主题&#xff0c;旨在贯彻政府加大消费品以旧换新的战略部署&#xff0c;为我国家电行业绿色化、智能化、高端化高…

知名AIGC人工智能专家培训讲师唐兴通谈AI大模型数字化转型数字新媒体营销与数字化销售

在过去的二十年里&#xff0c;中国企业在数字营销领域经历了一场惊心动魄的变革。从最初的懵懂无知到如今的游刃有余&#xff0c;这一路走来&#xff0c;既有模仿学习的艰辛&#xff0c;也有创新突破的喜悦。然而&#xff0c;站在人工智能时代的门槛上&#xff0c;我们不禁要问…

最厉害顶尖新媒体营销专家培训讲师唐兴通谈数字营销社群营销私域运营大客户销售AIGC大模型创新思维数字化转型商业模式短视频内容社私域数字经济人工智能

​数字人工智能时代的营销进化&#xff1a;从临摹到自我革新 引言&#xff1a;从模仿到变革的时代拐点 中国企业在过去的几十年里&#xff0c;经历了从电子商务的初兴到搜索引擎营销&#xff0c;再到微博、微信以及短视频等多种数字营销形式的迅速发展。在这个过程中&#xf…