【HarmonyOS】鸿蒙应用获取用户设备内音频资源文件

【HarmonyOS】鸿蒙应用获取用户设备内音频资源文件

问题背景:
在HarmonyOS系统中,应用访问用户的媒体库资源(图片和视频),音频资源,文件资源。都需要通过安全组件Picker来访问。

系统封装了选择资源组件Picker。用于桥接应用和用户资源的获取。

此种方式和传统应用开发,Android 和 IOS 是不同的。需要老铁们特别注意。

DEMO示例:
在示例代码中有注释,详细讲解调用步骤:
主要思路是使用系统提供的AudioViewPicker来访问用户的音频资源,当应用选择成功,点击确认后,会通过回调得到文件资源的Uri。

通过文件资源的Uri。进行FS操作,来读写用户音频文件。

import { picker } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

/**
 * 访问器管理工具
 */
export class PickerMgr {
  private TAG: string = 'PickerMgr';

  private static mPickerMgr: PickerMgr | null = null;

  public static Ins(): PickerMgr {
    if (!PickerMgr.mPickerMgr) {
      PickerMgr.mPickerMgr = new PickerMgr();
    }
    return PickerMgr.mPickerMgr;
  }

  /**
   * 选择用户设备内的所有音频资源
   */
  public selectAudio(context: common.Context, selectNum: number): Promise<Array<string>>{
    return new Promise((resolve, reject)=>{
      // 创建音频选择器
      const audioViewPicker = new picker.AudioViewPicker(context);
      // 设置音频选择操作参数
      const audioSelectOptions = new picker.AudioSelectOptions();
      audioSelectOptions.maxSelectNumber = selectNum;
      // 向用户唤起系统选择界面
      audioViewPicker.select(audioSelectOptions).then((audioSelectResult: Array<string>) => {
        // 文件选择成功后,返回被选中音频的uri结果集。
        console.info('audioViewPicker.select to file succeed and uri is:' + JSON.stringify(audioSelectResult));
        resolve(audioSelectResult);
      }).catch((err: BusinessError) => {
        // 异常返回
        console.error(`Invoke audioViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
        reject(err);
      })
    });
  }
}


import { PickerMgr } from '../../mgr/PickerMgr'
import { common } from '@kit.AbilityKit';
import { fileIo as FS } from '@kit.CoreFileKit';

/**
 * 用户音频选择
 */



struct AudioSelectPage {

  /**
   * 点击唤起音频选择器
   */
  onSelectUserAudioFile = async ()=>{
    // 请确保 getContext(this) 返回结果为 UIAbilityContext
    let context = getContext(this) as common.Context;
    let res = await PickerMgr.Ins().selectAudio(context, 1);
    this.optionAudioFile(res);
  }

  /**
   * 对于音频文件进行文件读写操作
   * @param uri
   */
  private optionAudioFile(uri: string){
    // 这里需要注意接口权限参数是 fs.OpenMode.READ_ONLY。只读.
    let file = FS.openSync(uri, FS.OpenMode.READ_ONLY);
    console.info('file fd: ' + file.fd);
    // 读取到系统文件标识符后,就可以针对这个文件进行操作。可以理解为文件在HarmonyOS系统中的ID。
    let buffer = new ArrayBuffer(4096);
    let readLen = FS.readSync(file.fd, buffer);
    console.info('readSync data to file succeed and buffer size is:' + readLen);
    //读取完成后关闭fd。
    FS.closeSync(file);
  }

  build() {
    RelativeContainer() {
      Text("点击唤起音频选择器")
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(this.onSelectUserAudioFile)
    }
    .height('100%')
    .width('100%')
  }
}

使用picker获取的select()返回的uri权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。
使用picker获取的select()返回的uri权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。
使用picker获取的select()返回的uri权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值