阅读“ Media Playback ”和“ MediaPlayer ”android 文档后,我仍然感到困惑,需要有关setDataSource重载方法的经验丰富的建议。
我在我的项目中使用MediaPlayer
一个组件,该组件在播放音乐时Service
将成为前台服务。res/raw
我的 apk 文件夹中有我的音乐文件(.mp3) 。要开始播放,我知道我必须准备 MediaPlayer 对象。因为android应用程序中的服务默认使用单进程和主线程,所以我不希望我的用户在MediaPlayer自行准备时获得ANR
(想想原始文件夹中的媒体文件是否很大)。然后我使用prepareAsync
而不是prepare
(同步)。所以我不能使用:
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();
最后我的问题出现了“包括这些不同的方法,哪一种是最好的选择?有没有比另一种更好的好处?我错过了什么吗?”