HarmonyOS 鸿蒙Next相机拍照后如何获取图片信息(eg:宽高),上传也需要放到copy到沙盒中操作吗

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

HarmonyOS 鸿蒙Next相机拍照后如何获取图片信息(eg:宽高),上传也需要放到copy到沙盒中操作吗

由于真机资源问题,相机拍照相关功能只能远程调试,部分能力使用存在疑问烦请解答; https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-camerapicker-V5#pickermediatype

使用cameraPicker拍照获取resultUri后,

static async camera(options?: CameraOptions): Promise<string> {
  try {
  if (!options) {
  options = new CameraOptions();
}
if (!options.mediaTypes || options.mediaTypes.length == 0) {
  options.mediaTypes = [cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO];
}
let pickerProfile: cameraPicker.PickerProfile = {
  cameraPosition: options.cameraPosition ? options.cameraPosition : camera.CameraPosition.CAMERA_POSITION_BACK,
  videoDuration: options.videoDuration,
  saveUri: options.saveUri
};

let context = getContext() as common.Context;
let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(context,
  options.mediaTypes, pickerProfile);
if (pickerResult && pickerResult.resultCode === 0) { // 成功 0
  if (pickerResult && pickerResult.resultUri &&
  options.mediaTypes.find((mediaType) => mediaType == pickerResult.mediaType)) {
    return pickerResult.resultUri; // saveUri为空,resultUri为公共媒体路径
  }
} else { // 失败返回-1
  return "";
}

} catch (err) {
  let error = err as BusinessError;
  LogUtil.error(`PickerUtil-camera-异常 ~ code: ${error.code} -·- message: ${error.message}`);
}
return "";
}

如何进一步获取对应的照片信息,是不是还是通过相册的 api 读取:phAccessHelper.getAssets

static async getPhotoAsset(uri: string): Promise<photoAccessHelper.PhotoAsset | null> {
  try {
  let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext());
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  // 配置查询条件,使用PhotoViewPicker选择图片返回的uri进行查询
  predicates.equalTo('uri', uri);
  let fetchOption: photoAccessHelper.FetchOptions = {
    // 成员参数名称,在get时,除了'uri'、'media_type'、'subtype'和'display_name'四个属性之外,其他的属性都需要在fetchColumns中填入需要get的PhotoKeys
    fetchColumns: ['media_type', 'display_name', 'size', 'title', 'width', 'height', 'date_taken',
      'uri', 'duration', 'orientation', 'date_added', 'date_modified', 'is_favorite'],
    predicates: predicates
  };
  let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> =
  await phAccessHelper.getAssets(fetchOption);
  // 得到uri对应的PhotoAsset对象,读取文件的部分信息
  if (fetchResult !== undefined) {
  const photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
  if (photoAsset !== undefined) {
  return photoAsset;
}
}
return null;
} catch (err) {
  let error = err as BusinessError;
  LogUtil.error(`PhotoHelper-getPhotoAsset-异常 ~ code: ${error.code} -·- message: ${error.message}`);
  return null;
}
}

期望使用api 进行上传

request.uploadFile(context, {
method: 'POST',
url: apiUrl,
header: {
'Content-Type': 'multipart/form-data',
'Accept': '*/*'
},
files: [{
filename: arr[1],
type: 'jpg',
name: 'img',
uri: arr[0]
}],
data: data
})

获取的照片是否需要下面的操作

async copyCameraToCache(resultUri: string) {
let context = getContext(this)
let segments = resultUri.split('/')
//文件名称
let fileName = segments[segments.length-1]
// 固定一个文件扩展名
const ext = 'jpg'
//计划复制到的目标路径
let realUri = context.cacheDir + "/" + fileName + '.' + ext;

//复制选择的文件到沙箱cache文件夹
try {
let file = await fs.open(resultUri);
fs.copyFileSync(file.fd, realUri)
// internal://cache代表fullPath 的文件路径
return [`internal://cache/${fileName + '.' + ext}`, fileName + '.' + ext];
} catch (err) {
return undefined
}
}

更多关于HarmonyOS 鸿蒙Next相机拍照后如何获取图片信息(eg:宽高),上传也需要放到copy到沙盒中操作吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next相机拍照后如何获取图片信息(eg:宽高),上传也需要放到copy到沙盒中操作吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,相机拍照后获取图片信息(如宽高)以及上传图片到沙盒的操作,可以通过以下步骤实现:

  1. 获取图片信息:

    • 拍照完成后,系统会返回图片的URI或文件路径。
    • 使用MediaMetadataRetriever类,可以通过URI或文件路径加载图片,并获取其元数据,包括宽度和高度。
    • 示例代码片段(假设已有URI):
      MediaMetadataRetriever retriever = new MediaMetadataRetriever();
      try {
          retriever.setDataSource(context, uri);
          String width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
          String height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
          // 注意:对于图片,这里返回的可能是默认的视频宽度和高度字段,需根据实际情况调整或查找其他方法。
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          retriever.release();
      }
      
      注意:由于鸿蒙API可能与Android有所不同,上述代码需根据鸿蒙API文档调整。
  2. 上传图片到沙盒:

    • 是的,通常需要将图片文件复制到应用的私有沙盒目录中,以确保文件的安全性和隐私性。
    • 使用文件I/O操作,将图片从临时存储位置复制到沙盒目录。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部