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

HarmonyOS鸿蒙Next中应用获取用户设备内音频资源文件 问题背景:

在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';

/**
 * 用户音频选择
 */
@Entry
@Component
@Preview
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权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效

1 回复

更多关于HarmonyOS鸿蒙Next中应用获取用户设备内音频资源文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,应用获取用户设备内音频资源文件需遵循以下步骤:

  1. 权限申请:在config.json中声明ohos.permission.READ_MEDIA权限,确保应用具备读取媒体文件的权限。

  2. 媒体库访问:使用@ohos.file.picker模块中的PhotoViewPickerDocumentViewPicker,让用户选择音频文件。

  3. 文件读取:通过@ohos.file.fs模块的API读取选定的音频文件,获取文件路径或直接读取文件内容。

  4. 数据处理:根据应用需求,对音频文件进行播放、编辑或其他处理。

确保遵循隐私保护原则,仅在用户明确授权后访问音频资源。

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