当前位置:   article > 正文

【HarmonyOS NEXT】打开相机或者相册获取图片后路径,获取文件上传,设置路径打开文件时候报错 openPicker {“code“:13900002}_harmonyos next读取相册视频

harmonyos next读取相册视频

【关键字】

openPicker / 13900002 / lstatSync / fileio

【问题描述】

打开相机或者相册获取图片后路径,获取文件上传,设置路径打开文件时候报错 openPicker {"code":13900002}。

以下是调用关键代码:

  1. const permissions: Array<Permissions> = [ 'ohos.permission.READ_MEDIA'
  2. ];
  3. const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  4. //查看是否有权限
  5. reqPermissionsFromUser(permissions, context,getContext(this)).then((res)=>{
  6. let jurisdictionStatus = res
  7. if(jurisdictionStatus){//有权限
  8. //可以选择的张数
  9. let length = this.maxLength - this.fileList.length
  10. openPicker(getContext(this),length).then((res)=>{
  11. //图片上传处理
  12. this.images(res)
  13. })
  14. }else{
  15. console.log('无权限=====')
  16. }
  17. });

下边是工具类关键代码:

  1. //获取权限
  2. import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. import { picker } from '@kit.CoreFileKit';
  5. import fs from '@ohos.file.fs';
  6. import { uploadModels } from '../Models/myModel';
  7. import { camera, cameraPicker } from '@kit.CameraKit';
  8. import { MyLog } from '@ohos/BaseComponentLibrary/Index';
  9. import { ToastUtil } from '@ohos/BaseComponentLibrary/src/main/ets/utils/ToastUtil';
  10. export async function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext,content:Context):Promise<boolean>{
  11. let jurisdictionStatus:boolean = false
  12. let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  13. // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  14. await atManager.requestPermissionsFromUser(context, permissions).then((data) => {
  15. let grantStatus: Array<number> = data.authResults;
  16. let length: number = grantStatus.length;
  17. for (let i = 0; i < length; i++) {
  18. if (grantStatus[i] === 0) {
  19. console.log('用户已授权')// 用户授权,可以继续访问目标操作
  20. //chooseAlbum(content)
  21. // openPicker(content)
  22. jurisdictionStatus = true
  23. } else {
  24. jurisdictionStatus = false
  25. ToastUtil.showToast('用户拒绝授权')
  26. console.log('用户拒绝授权')// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
  27. return;
  28. }
  29. }
  30. // 授权成功
  31. }).catch((err: BusinessError) => {
  32. console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
  33. })
  34. return jurisdictionStatus
  35. }
  36. // 弹出图片选择器方法
  37. export async function openPicker(content:Context,maxLength:number) {
  38. let photoUriList:uploadModels[] = []
  39. try {
  40. // 设置图片选择器选项
  41. const photoSelectOptions = new picker.PhotoSelectOptions();
  42. photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
  43. photoSelectOptions.maxSelectNumber = maxLength;//最大张数
  44. // 创建并实例化图片选择器
  45. const photoViewPicker = new picker.PhotoViewPicker();
  46. // 选择图片并获取图片URI
  47. let uris: picker.PhotoSelectResult = await photoViewPicker.select(photoSelectOptions);
  48. let newUrlList:uploadModels[] = []
  49. if (!uris || uris.photoUris.length === 0){
  50. photoUriList = []
  51. }else{
  52. uris.photoUris.forEach((item)=>{
  53. MyLog.error("item---"+item)
  54. let itemlList = item.split('.')
  55. const fileType = itemlList[itemlList.length-1]
  56. let list = itemlList[0].split('/')
  57. // const fileName = list[list.length-1] + '.' + fileType
  58. // 生成一个新的文件名 对名字格式有要求在此更改
  59. const fileName = new Date().getTime() + '.' + fileType
  60. // 打开文件读取流
  61. // let file = fs.openSync(item, fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);
  62. let file = fs.openSync(item, fs.OpenMode.READ_ONLY);
  63. console.error('file fd: ' + file.fd);
  64. let stat = fs.lstatSync(item);
  65. MyLog.error("state---------"+stat.size+"----------")
  66. // 获取当前上下文
  67. let context = getContext(content) as common.UIAbilityContext;
  68. // 新建一个保存裁剪后图片的路径
  69. let newUrl = context.cacheDir + '/' + fileName;
  70. console.log(context.cacheDir,newUrl,'是个什么路径')
  71. // 复制图片到新的路径
  72. fs.copyFileSync(file.fd, newUrl);
  73. // 关闭文件读取流
  74. fs.closeSync(file);
  75. newUrlList.push({
  76. fileName:fileName,
  77. fileType:fileType,
  78. filePath:item
  79. })
  80. })
  81. photoUriList = newUrlList
  82. }
  83. // 更新状态变量:设置显示图片的URI
  84. // content.imgUri = newUrl;
  85. // 更新状态变量:保存原始图片的URI
  86. // content.imgOriginal = uri;
  87. // 图片更改时触发的方法
  88. // this.imgChange();
  89. } catch (e) {
  90. console.error('openPicker', JSON.stringify(e));
  91. }
  92. return photoUriList
  93. }
  94. export async function chooseCamera(context:common.Context){
  95. let photoUriList:uploadModels[] = []
  96. try {
  97. let pickerProfile: cameraPicker.PickerProfile = {
  98. cameraPosition:camera.CameraPosition.CAMERA_POSITION_BACK
  99. };
  100. let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(context,[cameraPicker.PickerMediaType.PHOTO],pickerProfile)
  101. console.log("成功获取图片"+ pickerResult.resultUri)
  102. let itemlList = pickerResult.resultUri.split('.')
  103. const fileType = itemlList[itemlList.length-1]
  104. let list = itemlList[0].split('/')
  105. const fileName = list[list.length-1] + '.' + fileType
  106. photoUriList.push({
  107. fileName:fileName,
  108. fileType:fileType,
  109. filePath:pickerResult.resultUri
  110. })
  111. } catch (error){
  112. let err = error as BusinessError
  113. console.log('失败 code' + err.code)
  114. }
  115. return photoUriList
  116. }

【解决方案】

报错原因是因为lstatSync接口传入的路径必须是文件的应用沙箱路径。

相关参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-fileio-V5#fileiolstatsync7

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/976747
推荐阅读
相关标签
  

闽ICP备14008679号