HarmonyOS 鸿蒙Next中拓展信息读取
HarmonyOS 鸿蒙Next中拓展信息读取 如何解决fs接口无法读取媒体文件扩展信息问题
3 回复
【背景知识】
如果使用的是photoAccessHelper.getAssets这个接口前提是需要申请ohos.permission.READ_IMAGEVIDEO权限,如果不申请,无法获取对应的的信息。但是可以通过fs.openSync后,间接区分文件类型,并获取图片缩略图,视频时长等信息。
【解决方案】
可以按照下面方式来获取文件的拓展信息:
1.获取到url后,使用使用fs.openSync接口,通过uri打开这个文件得到fd:
let file = fs.openSync(selectUris[0], fs.OpenMode.READ_ONLY);
2.目前没有直接判断文件类型的方法,可以通过截取文件后缀的方式判断是图片还是视频:
getPathExtension(url) {
const lastDotIndex = url.lastIndexOf('.');
if (lastDotIndex < 0) {
return ''; // 没有找到扩展名
}
return url.slice(lastDotIndex + 1);
}
3.通过后缀区分图片和视频后,分别获取相关信息。
- 图片: 将图片转为pixelmap之后使用getImageInfo等接口获取图片相关信息:
// 根据文件fd创建imagSource
const imageSource: image.ImageSource = image.createImageSource(file.fd);
// 完成后关闭fd
fs.closeSync(file);
let decodingOptions: image.DecodingOptions = {
editable: true,
desiredPixelFormat: 3,
}
// 创建pixelMap
imageSource.createPixelMap(decodingOptions).then(async (pixelMap1: image.PixelMap) => {
// pixelMap1的信息可以在这里获取
});
- 视频: 获取视频元数据可使用AVMetadataExtractor中的fetchmetadata获取,参考代码如下:
import image from '@ohos.multimedia.image';
import { fileIo } from '@kit.CoreFileKit';
import fileIO from '@ohos.fileio';
import { media } from '@kit.MediaKit';
let context = getContext(this)
let filesDir = context.filesDir
let filePath = filesDir + "/" + "video.mp4"
@Entry
@Component
struct GetVideoInfoFromSandbox {
@State message: string = 'Hello World';
@State pixelMap: image.PixelMap | undefined = undefined;
build() {
Column({ space: 10 }) {
Text("把视频保存到沙箱")
.fontSize(50)
.backgroundColor(Color.Blue)
.fontWeight(FontWeight.Bold)
.onClick(async () => {
let value = await context.resourceManager.getRawFileContent('video.mp4')
console.info(`${value.buffer.byteLength}`)
let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
// 将rawfile目录下的文件写入沙箱路径
fileIo.writeSync(file.fd, value.buffer)
fileIo.closeSync(file.fd)
})
Text("获取视频文件宽高")
.fontSize(50)
.backgroundColor(Color.Green)
.fontWeight(FontWeight.Bold)
.onClick(async () => {
// 创建AVMetadataExtractor实例
let avMetadataExtractor = await media.createAVMetadataExtractor();
avMetadataExtractor.fdSrc = fileIo.openSync(filePath);
// 获取媒体元数据
let metadata = await avMetadataExtractor.fetchMetadata()
// 打印宽高数据
console.info(`metadata.videoWidth:${metadata.videoWidth}`)
console.info(`metadata.videoHeight:${metadata.videoHeight}`)
})
}
.width("100%")
.height("100%")
.justifyContent(FlexAlign.Center)
}
}
更多关于HarmonyOS 鸿蒙Next中拓展信息读取的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,拓展信息读取主要通过@ohos.file.securityLabel
模块实现。该模块提供数据安全分级标签管理功能,支持读取文件或数据的敏感级别标签。开发者可使用getSecurityLabel
接口获取文件的安全标签信息,返回结果包含数据级别和权限类型等属性。系统会根据应用权限动态控制可访问的标签范围,确保数据安全合规访问。读取操作需在配置文件声明ohos.permission.READ_SECURITY_LABEL
权限。