在阅读了“ Media Playback”和“ MediaPlayer”的android文档之后,我仍然感到困惑,并且需要经验丰富的有关setDataSource重载方法的建议.
我在项目的Service组件中使用MediaPlayer,该组件在播放音乐时将是foregroundService.我的apk的res / raw文件夹中有我的音乐文件(.mp3).
要开始播放,我知道我必须准备MediaPlayer对象.由于android应用程序中的服务默认情况下使用单个进程和主线程,因此我不希望用户获得ANR
而MediaPlayer会自行准备(请考虑一下原始文件夹中的媒体文件是否很大).
然后,我使用prepareAsync代替prepare(Sync).所以我不能使用:
mp = MediaPlayer.create(context, R.raw.myfile);
因为这已经在内部调用prepare(),但没有在prepareAsync()上调用.
所以基本上我有两个选择(四个中的两个):
Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);
要么
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
使用其中之一后,我可以简单地使用:
mp.prepareAsync();
最后,我的问题浮出水面:“包括这些不同的方法,哪一种是最好的选择?一个比另一个有好处吗?我错过了什么吗?”