【发布时间】:2013-09-24 09:32:29
【问题描述】:
阅读“Media Playback”和“MediaPlayer”android 文档后,我仍然感到困惑,需要有经验的关于setDataSource 重载方法的建议。
我在我的项目中的Service 组件中使用MediaPlayer,该组件在播放音乐时将成为foregroundService。我的音乐文件(.mp3)在我的 apk 的 res/raw 文件夹中。
要开始播放,我知道我必须准备 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();
最后我的问题是“包括这些不同的方法,哪一种是最好的选择?是否有任何好处?我错过了什么吗?”
【问题讨论】:
-
我个人喜欢最后一种方法,因为它在代码中不使用字符串。不过,我现在不认为这算得上“好处”。
-
@Geobits,据我所知,避免在代码中使用常量字符串是一个好习惯,但
FileDescriptor是 android 更喜欢本地文件。感谢您的评论。我建议您阅读我对已接受答案的评论。
标签: android media-player