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权限是临时只读权限,待退出应用后台后,获取的临时权限就会失效
更多关于HarmonyOS鸿蒙Next中应用获取用户设备内音频资源文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,应用获取用户设备内音频资源文件需遵循以下步骤:
-
权限申请:在
config.json
中声明ohos.permission.READ_MEDIA
权限,确保应用具备读取媒体文件的权限。 -
媒体库访问:使用
@ohos.file.picker
模块中的PhotoViewPicker
或DocumentViewPicker
,让用户选择音频文件。 -
文件读取:通过
@ohos.file.fs
模块的API读取选定的音频文件,获取文件路径或直接读取文件内容。 -
数据处理:根据应用需求,对音频文件进行播放、编辑或其他处理。
确保遵循隐私保护原则,仅在用户明确授权后访问音频资源。