【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) 返回结果为 UIAbilityContextlet 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权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效。