今天遇到某些机型:(摩托罗拉 xt685、昂达v818mini)上面播放本地音频文件,报错(1, -2147483648),播放数据源无法识别或者找不到播放数据源的问题。
解决问题的过程拿出来给大家分享。
原因分析:
由于业务需求,我们的音频文件去除了扩展名“.mp3”, 因为文件格式可以在数据解码的时候取到,大多数ROM都是支持的。
仔细看了下,文件拷贝到PC可以用播放器播放,加上“.mp3”扩展名也可以用MediaPlayer播放。
所以判断,这些ROM可能由于某些原因在原生的基础上被修改过了,
用setDataSource(String path)交给MediaPlayer的之前,ROM可能试图通过文件名获取文件类型,发现文件类型属于播放器支持的,再交给MediaPlayer
,当然也可能是该ROM里的MediaPlayer的行为。
解决方案:
方案一,是将没有扩展名的本地音频的文件名加上扩展名。再调用setDataSource(String path)。
方案二,发现MediaPlayer官方提供的API有一个setDataSource(FileDescriptor fd),然后看了FileDescriptor的文档说明,
It's possible to get the file descriptor used by some classes (such as FileInputStream
, FileOutputStream
, and RandomAccessFile
)
所以考虑先将文件转换成流,再交给MediaPlayer。这样就绕过了文件名的检查这一步。像这样:
FileInputStream fis = new FileInputStream(filePath);
mediaplayer.setDataSource(fis.getFD());
经过测试,方案可行。