HarmonyOS 鸿蒙Next phAccessHelper.showAssetsCreationDialog()无法调起弹窗

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

HarmonyOS 鸿蒙Next phAccessHelper.showAssetsCreationDialog()无法调起弹窗

1、调用phAccessHelper.showAssetsCreationDialog()

2、视频保存在沙盒里且可以打开,但是无法调起弹窗,方法调用失败

2 回复

可参考下列代码实现通过showAssetsCreationDialog来保存视频的功能:

import { dataSharePredicates } from '@kit.ArkData';

import { photoAccessHelper } from '@kit.MediaLibraryKit';

import { promptAction } from '@kit.ArkUI';

import fs from '@ohos.file.fs';

import { BusinessError } from '@kit.BasicServicesKit';

const context = getContext(this);

let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

let pathImage: string = getContext().filesDir + "/123.jpg";

let pathImage2: string = getContext().filesDir + "/1234.jpg";

let color: ArrayBuffer = new ArrayBuffer(96)

@Entry

@Component

struct Index {

  @State message: string = 'Hello World';

  aboutToAppear(): void {

    this.writeIamge()

  }

  /**

   * 写图片

   */

  async writeIamge() {

    // 把图片写到沙箱路径中

    const resourceManager = getContext(this).resourceManager

   const   imageArray = await resourceManager.getMediaContent($r('app.media.sfz'));

    console.log("iamge path is:" + pathImage);

    let file = fs.openSync(pathImage, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

    let file2 = fs.openSync(pathImage2, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

    fs.writeSync(file2.fd,imageArray.buffer);

    fs.write(file.fd, imageArray.buffer).then((writeLen) => {

      console.info("write data to file succeed and size is:" + writeLen);

      promptAction.showToast({

        message: '图片写入沙箱成功',

        duration: 500

      });

      fs.closeSync(file);

    }).catch((err: BusinessError) => {

      console.info("write data to file failed with error message: " + err.message + ", error code: " + err.code);

    });

  }

  async  example() {

  console.info('ShowAssetsCreationDialogDemo.');

  try {

    // 获取需要保存到媒体库的位于应用沙箱的图片/视频uri

    let srcFileUris: Array<string> = [

      pathImage,

      pathImage2// 实际场景请使用真实的uri

    ];

    let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [

      {

        title: 'test2', // 可选

        fileNameExtension: 'jpg',

        photoType: photoAccessHelper.PhotoType.IMAGE,

        subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选

      },

      {

        title: 'test3', // 可选

        fileNameExtension: 'jpg',

        photoType: photoAccessHelper.PhotoType.IMAGE,

        subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选

      }

    ];

    let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);

    console.info('showAssetsCreationDialog success, data is ' + desFileUris);

    let filee = fs.openSync(pathImage, fs.OpenMode.READ_ONLY);

    let size = fs.statSync(filee.fd).size;

    let buf = new ArrayBuffer(size);

    fs.readSync(filee.fd, buf);

    fs.closeSync(filee);

    let file: fs.File = fs.openSync(desFileUris[0], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

    let file2: fs.File = fs.openSync(desFileUris[1], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

     fs.writeSync(file.fd,buf );

     fs.writeSync(file2.fd,buf );

    fs.closeSync(file);

    fs.closeSync(file2);

    let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();

    predicates.equalTo('uri', desFileUris[0]);

    let fetchOptions: photoAccessHelper.FetchOptions = {

      fetchColumns: [],

      predicates: predicates

    };

    // 通过返回的媒体库uri获取对应的PhotoAsset对象

    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(

      fetchOptions);

    let photoAssets: Array<photoAccessHelper.PhotoAsset> = await fetchResult.getAllObjects();

    for (let i = 0; i < photoAssets.length; i++) {

      // 将应用沙箱文件内容写入到媒体库

      let changeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(photoAssets[i]);

      changeRequest.addResource(photoAccessHelper.ResourceType.IMAGE_RESOURCE, srcFileUris[i]);

      phAccessHelper.applyChanges(changeRequest);

    }

  } catch (err) {

    console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);

  }

}

  build() {

    RelativeContainer() {

      Text(this.message)

        .id('HelloWorld')

        .fontSize(50)

        .fontWeight(FontWeight.Bold)

        .onClick(()=>{

          this.example()

        })

        .alignRules({

          center: { anchor: '__container__', align: VerticalAlign.Center },

          middle: { anchor: '__container__', align: HorizontalAlign.Center }

        })

    }

    .height('100%')

    .width('100%')

  }

}

更多关于HarmonyOS 鸿蒙Next phAccessHelper.showAssetsCreationDialog()无法调起弹窗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


phAccessHelper.showAssetsCreationDialog() 方法在 HarmonyOS 中无法调起弹窗的问题,可能是由于以下几个原因:

  1. 权限问题:确保应用已获取必要的权限,如存储权限等,这些权限对于显示资产创建对话框通常是必需的。

  2. 上下文问题:检查 phAccessHelper 对象是否正确初始化,并且调用 showAssetsCreationDialog 方法时传入的上下文(Context)是有效的。

  3. API调用错误:确认 showAssetsCreationDialog 方法的调用方式是否符合 HarmonyOS 的API文档规范,包括参数类型和数量。

  4. 系统限制:某些系统配置或版本可能限制了弹窗的显示,尤其是在后台或特定模式下。

  5. UI线程问题:确保调用 showAssetsCreationDialog 的代码运行在UI线程中,因为UI相关的操作需要在主线程执行。

  6. 组件未正确注册:确认相关的UI组件(如对话框)已在应用中正确注册和配置。

如果上述检查均无误,但问题依旧存在,可能是由于系统bug或特定设备兼容性问题。此时,建议通过HarmonyOS的开发者社区或官方渠道反馈问题。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!