HarmonyOS 鸿蒙Next 如何根据URI获取到视频文件的绝对路径,或者直接获取到视频文件的绝对路径
HarmonyOS 鸿蒙Next 如何根据URI获取到视频文件的绝对路径,或者直接获取到视频文件的绝对路径 APP的本地视频数据读取是在native层使用C的文件操作进行的,使用Uri无法访问到文件,需要获取文件的绝对路径。
目前我使用photoAccessHelper可以获取到类似file:///media/Photo/47/xx/xx.mp4这样的uri,应该根据Uri获取到文件的绝对路径。
尝试过拼接成/storage/media/100/local/files/Photo/47/xx/xx.mp4也是无法获取到文件的。
或者要如何直接获取到文件的绝对路径呢。
rawfile下的资源会打成一个hap包,没有对外暴露的文件路径,且没有获取文件绝对路径的api, 获取rawfile下的资源全球化子系统有接口getRawFileContentSync: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-resource-manager-V5#getrawfilecontentsync10 native侧: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/rawfile-guidelines-0000001820880449-V5#ZH-CN_TOPIC_0000001881259997__ 接口说明 如果需要通过沙箱路径或绝对路径获取rawfile资源,就只能先将rawfile下资源拷贝进应用沙箱目录再进行操作。 应用沙箱路径和真实物理路径的对应关系可参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/app-sandbox-directory-V5#应用沙箱路径和真实物理路径的对应关系 相册里的视频资源也是需要先转存到应用沙箱目录,然后在获取文件的路径。 可参考: 1、获取保存图片或者视频的沙箱路径filePath 2、转换后获取uri: let uri = fileuri.getUriFromPath(filePath); 以同步方法获取文件URI链接: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-fileuri-V5#fileurigeturifrompath 参考示例:
import picker from '@ohos.multimedia.cameraPicker'
import camera from '@ohos.multimedia.camera';
import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';
import fileuri from '@ohos.file.fileuri';
import fs from '@ohos.file.fs';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
let context = getContext(this) as common.Context;
class CameraPosition {
cameraPosition: camera.CameraPosition
saveUri: string
constructor(cameraPosition: camera.CameraPosition, saveUri: string) {
this.cameraPosition = cameraPosition
this.saveUri = saveUri
}
}
let pathDir = getContext().filesDir;
//沙箱路径地址
console.log('保存路径为'+pathDir)
let filePath = pathDir + '/picture.jpg'
fs.createRandomAccessFileSync(filePath, fs.OpenMode.CREATE);
let uri = fileuri.getUriFromPath(filePath);
async function photo() {
try {
let pickerProfile = new CameraPosition(camera.CameraPosition.CAMERA_POSITION_BACK, uri)
let pickerResult: picker.PickerResult = await picker.pick(context,
[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}`);
}
}
async function picture() {
let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
PhotoSelectOptions.maxSelectNumber = 1;
let photoPicker = new photoAccessHelper.PhotoViewPicker();
photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
let photouri: Array<string> = PhotoSelectResult.photoUris
let file = fs.openSync(photouri[0], fs.OpenMode.READ_ONLY)
let file2 = fs.openSync(pathDir+'/picture2.jpg', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
fs.copyFileSync(file.fd, file2.fd)
fs.closeSync(file);
fs.closeSync(file2);
})
}
@Entry
@Component
export struct Index {
build() {
Column() {
Button('选择并保存').onClick(() => {
picture()
})
Button('拍照并保存').onClick(() => {
photo()
})
}
}
}
沙箱路径地址获取参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/application-context-stage-V5#获取应用文件路径
```javascript
Button()
.onClick(() => {
let applicationContext = this.context.getApplicationContext();
let cacheDir = applicationContext.cacheDir;
let tempDir = applicationContext.tempDir;
let filesDir = applicationContext.filesDir;
let databaseDir = applicationContext.databaseDir;
let bundleCodeDir = applicationContext.bundleCodeDir;
let distributedFilesDir = applicationContext.distributedFilesDir;
let preferencesDir = applicationContext.preferencesDir;
// 获取应用文件路径
let filePath = tempDir + 'test.txt';
hilog.info(DOMAIN_NUMBER, TAG, `filePath: ${filePath}`);
if (filePath !== null) {
promptAction.showToast({
message: filePath
});
}
})
更多关于HarmonyOS 鸿蒙Next 如何根据URI获取到视频文件的绝对路径,或者直接获取到视频文件的绝对路径的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS(鸿蒙)系统中,根据URI获取视频文件的绝对路径,或者直接获取视频文件的绝对路径,通常涉及到内容解析器(Content Resolver)的使用。以下是一个简要的实现方法:
-
使用ContentResolver解析URI:
- 你可以通过
ContentResolver
的query
方法来查询URI对应的数据。 - 查询结果中的某一列(通常是
DATA
列)可能包含文件的绝对路径。但请注意,对于某些URI(如媒体存储提供的URI),这一列可能为空,因为它们可能指向的是一个内容URI而非文件URI。
- 你可以通过
-
直接访问文件URI:
- 如果你的应用有权限直接访问文件(例如通过
file://
开头的URI),那么你可以直接使用这个URI作为文件的绝对路径。 - 但对于大多数情况,特别是涉及媒体文件时,你可能需要通过内容解析器来获取文件的实际路径。
- 如果你的应用有权限直接访问文件(例如通过
示例代码(伪代码,具体实现需根据实际情况调整):
Uri videoUri = ...; // 你的视频文件URI
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(videoUri, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
String absolutePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
cursor.close();
// 使用absolutePath
} else {
// 处理URI无法解析为绝对路径的情况
}
注意:上述代码中的MediaStore.Video.Media.DATA
可能不适用于所有URI,特别是当URI由第三方应用提供时。
如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html,