《鸿蒙/Harmony | 开发日志》选择文件或拍照功能

news/2024/9/20 3:57:49/文章来源:https://www.cnblogs.com/xakoy/p/18418756

鸿蒙选择文件或拍照的功能,有直接可以用的 API,而且和Android相比,最大的好处,是不需要向用户索要文件权限。

不需要索要权限的原因是,鸿蒙的权限改动升级的非常大,以前 Android的权限逻辑是,你授予了文件或图库的权限后,代码是可以在后台获取你所有的文件。这一点也是非常大的安全隐患。所以我自己用Android APP根本不敢随便授权那些 APP 给照片权限的,万一人家后台暗戳戳的扫码你的敏感图片,用户根本不知道的。

(这个权限的痛点,也是我使用最大的痛点。迫不及待的想升级鸿蒙。)

但是现在鸿蒙的文件权限逻辑是,没有办法可以直接获取文件库的权限,只有拉起的选择文件的界面,选择了几个文件,那么 APP 的代码就只能临时获取这几个文件的权限,APP 关闭再重新打开后,这些权限都消失了(当然有别的方式,可以存取这些临时的权限,网盘类的 APP 必须要这样),必须再次打开选择界面了。

选择文件 / 照片

一般在 APP 中选择文件大概分类三类

  1. 照片 + 拍照
  2. 视频 + 录像
  3. 文件(各种类型的文件、浏览器下载的文件等)

在鸿蒙中,这几类是不同的。

照片和视频,属性媒体类,而文件是系统文件类 。这上面三种都是需要调用不同的 API 来文件的。虽然获取文件的方式根据上面的类别不同调用的 API 不同,但是获取后文件的处理,是一样的。

照片 + 拍照

效果:

可以使用访问提供的 Picker API,选择照片并且自带拍照功能,参考官方文档《使用Picker选择媒体库资源》

const options = new photoAccessHelper.PhotoSelectOptions();
options.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
options.maxSelectNumber = 1; // 获取多少张const picker = new photoAccessHelper.PhotoViewPicker()
const result = await picker.select(options)const uris = result.photoUris;if (uris.length == 0) {return null // 没有选择文件
}const imgURI = uris[0] // 获取的文件

在这里注意一下。官方文档描述了一段:

select返回的uri权限是只读权限,可以根据结果集中uri进行读取文件数据操作。注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri,使用类似一个按钮去触发打开文件。

文件 + 浏览器下载

访问自带选择文件的API《【鸿蒙官方文档】选择用户文件》,调用出来的界面,特别像 PC 端,浏览器打开的选择文件,可以多选,如下图:

const options = new picker.DocumentSelectOptions();
// 选择文档的最大数目(可选)
options.maxSelectNumber = 5;const documentViewPicker = new picker.DocumentViewPicker(uiAbilityContext);const uris = await documentViewPicker.select(options)if (uris.length == 0) {return null // 没有选择文件
}const fileURI = uris[0] // 获取的文件

在这里注意一下。官方文档描述了一段:

注意

1、使用picker获取的select()返回的uri权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。

2、如果想要获取持久化权限(仅在2in1设备上生效),请参考文件持久化授权访问。

3、开发者可以根据结果集中uri做进一步的处理。建议定义一个全局变量保存uri。

多选的效果图:

选择视频 + 拍摄

目前官方文档提供了两种选择视频的方式。

  1. 使用《Picker选择媒体库资源》
  2. 使用《文件选择器》

在实践过程中,推荐还是第一种比较方便,第二种只能获取 APP 当前自带有权限的目录,如果没有传递授权目录,就会没有视频可以选,也没有拍摄的功能。

第一种和照片的接口一样,只是修改一下参数即可:

const options = new photoAccessHelper.PhotoSelectOptions();
options.MIMEType = photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE; // 过滤选择媒体文件类型为视频
options.maxSelectNumber = 1;const picker = new photoAccessHelper.PhotoViewPicker()
const result = await picker.select(options)

效果如下图:

根据上一步获取到的uri,获取文件详细信息

可以使用《文件管理 API》和《文件URI API》来获取文件的信息。根据上面官方提示需要使用单独的按钮触发,才能去用api去打开文档。但是我本人实验过,是可以直接使用api来获取文件的信息的。

获取文件的名称

《文件URI API》可以简单的获取文件的名称。

import { fileUri } from '@kit.CoreFileKit';//imgURI 是上一步获取的文件uri file://media/xxx
let fileUriObject = new fileUri.FileUri(imgURI);
console.info("The name of FileUri is " + fileUriObject.name);

获取文件的大小

这个需要使用《文件管理 API》来获取。stat方法获取。注意直接调用stat方法传入上面的 imgURI的话,会报错,文件不存在。需要先使用open方法,获取文件的fd信息,在把fd传给stat方法,才能成功获取信息。

import { fileIo as fs } from '@kit.CoreFileKit';const file = await fs.open(imgURI) 
const stat = await fs.stat(file.fd)  // file.fd 是个数字类似 153 这样的。不用明白这数字是干嘛的console.log(stat.size)

参考

  1. 《【鸿蒙官方文档】使用Picker选择媒体库资源》
  2. 《【鸿蒙官方文档】选择用户文件》
  3. 《【鸿蒙官方文档】文件管理 API》
  4. 《【鸿蒙官方文档】文件URI API》

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EF使用

EF命令使用问题描述: PM> Add-Migration InitialCreate Add-Migration : 无法将“Add-Migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 + Add-Migration InitialCr…

hackmyvm Hades5变量劫持提权

在这个目录下有个./uid的程序分别运行./uid 和 id 发现我们在 uid一行是有不一样的我们猜测 在./uid里面他先用chown把我们的 uid改写成了anthea 然后运行id 然后再把我们的uid改回andromeda 那么我们怎么拿到这个anthea的权限呢这里就需要用到变量劫持的思想 如果我们把 id 这…

SPDIF接口介绍

SPDIF接口介绍 S/PDIF接口规范详解 S/PDIF是sony和philips在80年代为一般家用器材所定制出来的一种数字讯号传输接口,基本上是以AES/EBU(也称AES3)专业用数字接口为参考然后做了一些小变动而成的家用版本。 可以使用成本较低的硬件来实现数字讯号传输。为了定制一个统一的接口…

通过 NSSM 把 FastAPI+Celery+Flower 注册成 3个Windos 服务

通过 NSSM 把 FastAPI+Celery+Flower 注册成 3个Windos 服务 什么是 nssm? 是一个服务封装程序,它可以将普通exe程序封装成服务,实现开机自启动,同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大。nssm官网 nssm 常用命令 nssm install servername /…

zblogPHP后台时一切正常,但登出后再次登录提示“错误原因:登录失败;帐户和密码都是对的

当使用 Z-Blog PHP 后台时,如果登出后再次登录提示“错误原因:登录失败”,即使确认账户和密码输入正确,可能的原因包括 cookie 问题、缓存问题、数据库问题或配置问题等。以下是一些排查和解决此类问题的方法: 1. 清除浏览器缓存和 cookie问题描述:浏览器缓存或 cookie 可…

想成为Admineloper?Salesforce全新职业解析,机会就在眼前!

每个Salesforce管理员在思考自己的职业生涯时,可能都会想到:下一步是往架构师,或者开发,还是咨询的方向发展。无论哪种职业规划,都需要培养新的技能。 由于角色职责、团队、客户需求等的变化,许多管理员在晋升之前就开始培养这种新技能。管理员可能需要学习Apex或利用现有…

zblog静态分类目录访问出现403错误

当使用 Z-Blog 静态化分类目录后出现 403 错误,这通常意味着服务器拒绝了访问请求,可能是由于权限设置不当、Web 服务器配置错误或其他安全限制导致的。以下是针对不同情况的一些常见解决方案。 1. 检查文件和目录权限问题描述:文件或目录权限设置不正确可能导致 403 错误。…

zblog建站设置静态化以后网页出现403错误

当使用 Z-Blog 建站并设置了静态化后,如果遇到 403 错误,这通常表示服务器拒绝了请求,可能是由于权限设置不当、Web 服务器配置错误或其他安全限制导致的。以下是针对不同 Web 服务器(如 Apache 和 Nginx)的一些常见解决方案。 对于 Apache 服务器 1. 检查文件和目录权限问…

代码随想录算法训练营,9月18日 | 77.组合,216.组合总和III,17.电话号码的字母组合

回溯算法理论基础: 1.回溯是递归的副产品,有递归就有回溯。 2.回溯的本质是穷举,想让回溯法高效些,可以加一些剪枝的操作 3.组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集…

火山引擎数智平台:高性能ChatBI的技术解读和落地实践

导读:大模型能力的发展和成熟,催生出新一代智能化 BI—— ChatBI,即通过自然语言处理(NLP)与大型语言模型(LLMs)的结合,极大简化数据分析过程,提高效率并降低分析门槛。火山引擎数智平台旗下智能数据洞察产品 DataWind 近期上线 ChatBI 能力,提供智能修复、多语法适用…

zblog php404页面,图文详解zblogphp如何自定义404错误页面?zblogphp设置404的方法

在 Z-Blog PHP 中自定义 404 错误页面是一个相对简单的过程。以下是详细的步骤,帮助你完成自定义 404 页面的工作。 1. 创建 404 页面模板 步骤 1:创建 404 页面模板文件在你的 Z-Blog PHP 主题目录下创建一个名为 404.php 的文件。 打开这个文件并编写你的 404 页面模板代码…

思通数科开源产品:免费的AI视频监控卫士安装指南

准备运行环境: 确保您的服务器或计算机安装了Ubuntu 18.04 LTS操作系统。 按照产品要求,安装以下软件:Python 3.9 Java JDK 1.8 MySQL 5.5 Redis 2.7 Elasticsearch 8.14 FFmpeg 4.1.1 RabbitMQ 3.13.2 Minio (2024-07-26T20版本)接着,下载开源软件,并运行Python端、Jav…