HarmonyOS鸿蒙Next中解决“调用getResourceManager().getRawFileEntry(mp3路径)播放rawfile目录下一个mp3文件,结果却播放了所有文件”

HarmonyOS鸿蒙Next中解决“调用getResourceManager().getRawFileEntry(mp3路径)播放rawfile目录下一个mp3文件,结果却播放了所有文件” 写了段代码想播放rawfile目录下的c.mp3,结果却播放了rawfile目录下所有的文件,代码如下:

RawFileDescriptor filDescriptor = getResourceManager().getRawFileEntry("entry/resources/rawfile/c.mp3").openRawFileDescriptor();
Source source = new Source(filDescriptor);
player.setSource(source);
player.prepare();
player.play();

修改后,ok,只播放c.mp3文件了,代码如下:

RawFileDescriptor filDescriptor = getResourceManager().getRawFileEntry("entry/resources/rawfile/c.mp3").openRawFileDescriptor();
Source source = new Source(filDescriptor.getFileDescriptor(),filDescriptor.getStartPosition(), filDescriptor.getFileSize());
player.setSource(source);
player.prepare();
player.play();

就是把

Source source = new Source(filDescriptor);

改成

Source source = new Source(filDescriptor.getFileDescriptor(),filDescriptor.getStartPosition(), filDescriptor.getFileSize());

照我想,既然在getResourceManager().getRawFileEntry("entry/resources/rawfile/c.mp3")中指定了路径,那么返回的RawFileDescriptor对象应该就只有c.mp3一个文件,但实际不是。debug了filDescriptor.getStartPosition()的返回值,发现是3256446,接近目录中另两个文件a.mp3b.mp3的大小之和。继而修改代码,播放b.mp3跟踪getStartPosition的数值,发现接近a.mp3的文件大小。

又多试了几个文件,我猜调用getResourceManager().getRawFileEntry时并没有为c.mp3文件数据单独分配内存,系统预先载入了所有rawfile文件,然后调用getResourceManager().getRawFileEntry时返回一个子集,所以才有那个getStartPosition返回值接近字母序前面文件大小和的情况。系统为这些rawfile文件分配了一块内存,每次调用是返回对应的起始位置和大小,并且共用同一个fd或者handle(因为class FileDescriptor 中定义private int fd,就没去验证)。为了一个文件载入所有的,是不是有点浪费啊。


更多关于HarmonyOS鸿蒙Next中解决“调用getResourceManager().getRawFileEntry(mp3路径)播放rawfile目录下一个mp3文件,结果却播放了所有文件”的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复
请求方式:,

更多关于HarmonyOS鸿蒙Next中解决“调用getResourceManager().getRawFileEntry(mp3路径)播放rawfile目录下一个mp3文件,结果却播放了所有文件”的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


sandwich
OpenHarmony 5.0  
`keytool -list -v -keystore /Users/admin/Downloads/HmsDemo.jks/build.gradle`  
HmsDemo  
HmsDemo.jks build.gradle android  
HarmonyOS Keyring  
开发者版权所有 devsolution@huawei.com

在HarmonyOS鸿蒙Next中,调用getResourceManager().getRawFileEntry(mp3路径)播放rawfile目录下的MP3文件时,如果播放了所有文件,可能是由于路径解析或资源管理器的处理方式问题。确保路径正确且唯一,避免模糊匹配。检查rawfile目录结构,确保MP3文件路径明确。使用getRawFileEntry时,传入的路径应精确指向目标文件,避免通配符或模糊路径。如果问题依旧,考虑使用getRawFileDescriptorgetRawFile方法,直接获取文件描述符或输入流进行播放。

在HarmonyOS鸿蒙Next中,调用getResourceManager().getRawFileEntry(mp3路径)时,如果播放了所有文件而非指定文件,可能是路径解析错误或播放逻辑有误。请检查:

  1. 确保路径正确,如"entry/resources/rawfile/yourfile.mp3"
  2. 确认使用RawFileDescriptor读取指定文件,而非遍历目录;
  3. 检查播放器是否仅加载指定文件。

正确代码示例如下:

RawFileEntry rawFileEntry = getResourceManager().getRawFileEntry("entry/resources/rawfile/yourfile.mp3");
RawFileDescriptor fd = rawFileEntry.openRawFileDescriptor();
// 使用fd播放指定文件
回到顶部