使用MediaPlayer播放USB中读取到的MP3音乐文件,遇到java.io.FileNotFoundException异常总结

使用MediaPlayer播放USB中读取到的MP3音乐文件,遇到java.io.FileNotFoundException异常总结,第1张

使用MediaPlayer播放USB中读取到的MP3音乐文件,遇到java.io.FileNotFoundException异常总结

项目背景:
多媒体USB音乐,底层调用MediaPlayer来播放U盘中读取的歌曲,由于最初版本将一首MP3歌曲甜蜜蜜写到了AS的raw目录,直接本地播放,做了一首假数据:
即:

            //临时代码,写死歌曲甜蜜蜜,点击后会播放甜蜜蜜
//            mMediaPlayer.setDataSource(AudioHelper.getContext(),
//                    Uri.parse("android.resource://"+AudioHelper.getContext().getPackageName()+"/"+R.raw.tianmimi));

实现了播放,一开始设备没有喇叭。后来发现这组临时代码没有删除,点击播放真正在播放的USB歌曲,UI刷新的没问题,但实际播放的歌曲都是这个甜蜜蜜。
于是根据从USB中读取到的歌曲文件的URL,还是使用MediaPlayer来播放歌曲,即:

            mMediaPlayer.setDataSource(audioBean.mUrl);//设置播放文件

这里的audioBean是我写的一个歌曲实体类的对象。

这个时候大问题来了,就是本文总结的问题,发现改完代码后点击界面所有的播放暂停、上一首、下一首、歌曲列表点击均无效,无法播放歌曲了,UI也不刷新。

解决问题的步骤总结:
(1)先排查问题,既然本地AS的歌曲能够播放出声音,问题大概率出现在现在更改的位置,初步确定。
(2)开始在对应的代码块重要位置加LOG,运行,点击排查。最后发现捕获了异常,mMediaPlayer.setDataSource方法有报错,之后的方法不执行。
即:
异常信息的LOG:

异常信息java.io.FileNotFoundException: /mnt/media_rw/7F83-4CE4/张韶涵 - 活在此刻.mp3: open failed: EACCES (Permission denied)

直接指向Permission权限问题。
(3)开始百度找该问题答案,试了各种方法,包括把原本的动态权限申请只有WRITE_EXTERNAL_STORAGE的,改成加上READ_EXTERNAL_STORAGE的,以及在Application中添加:
android:requestLegacyExternalStorage=“true”
。。。
>这行代码。
很遗憾,都没有用。

(4)最后参考的是这篇文章:

Android 9.0中sdcard 的权限和挂载问题

我原本的代码中已经有这三个权限了:



这三个权限原本的代码中已经添加

所以只需要在AndroidManiefest中补加这两个权限:



测试了一下,实际上只要下面这个权限即可。

(4)再次点击多媒体相关的播放,能播放,功能恢复正常,该问题解决。

总结:
(1)同样的mediaplayer框架播放USB歌曲,之前的项目直接把多媒体写成系统应用了,所以没有这么多权限问题需要考虑。而本次项目手写动态权限和静态添加权限,没有使用之前那种写成系统应用的方法。
(2)
除了读写权限,还需要上面这个权限,才可以用mediaPlayer播放读取到的USB歌曲文件。

(3)这边再总结列举一下我的配置文件中该项目用到的所有权限:

    
    
    

    
    

    
    
    
    
    
    

    
    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5076290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存