阅读了 "媒体播放" 和 "MediaPlayer" Android 文档后,我仍然感到困惑,需要有经验的建议关于 setDataSource 这个重载方法。
我正在我的项目中的Service
组件中使用MediaPlayer
来播放音乐,这个服务将成为前台服务。我将音乐文件(.mp3)放在apk的res/raw
文件夹中。
要开始播放,我知道我必须准备好MediaPlayer对象。由于Android应用程序中的服务默认使用单个进程和主线程,因此我不希望用户在MediaPlayer准备自己时遇到ANR(如果raw文件夹中的媒体文件很大,则会出现此问题)。
然后我使用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();
最后我的问题是,“包括这些不同的方法,哪一个是最好的选择?它们之间有什么优劣势吗?我有遗漏了什么吗?”
FileDescriptor
是Android对本地文件的首选。谢谢你的评论。我建议你阅读我对被接受答案的评论。 - Fredrick Gauss