HarmonyOS 鸿蒙Next 如何根据URI获取到视频文件的绝对路径,或者直接获取到视频文件的绝对路径

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

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也是无法获取到文件的。

或者要如何直接获取到文件的绝对路径呢。

2 回复

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)的使用。以下是一个简要的实现方法:

  1. 使用ContentResolver解析URI:

    • 你可以通过ContentResolverquery方法来查询URI对应的数据。
    • 查询结果中的某一列(通常是DATA列)可能包含文件的绝对路径。但请注意,对于某些URI(如媒体存储提供的URI),这一列可能为空,因为它们可能指向的是一个内容URI而非文件URI。
  2. 直接访问文件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

回到顶部