我有一个远程音频文件的URL。我需要构建适配器列表的数据以获取曲目详情。以下是代码的一部分:
Log.d("audioURL", audio.getUrl());
MediaPlayer tmpMedia;
tmpMedia = MediaPlayer.create(getContext(), Uri.parse(audio.getUrl()));
holder.txtDuration.setDuration(tmpMedia.getDuration()/1000);
tmpMedia.release();
但是它的运行速度太慢了。LogCat会记录下类似这样的信息:
15:05:51.783: D/audioURL(776): http://cs4859.vk.me/u14195999/audios/0cbd695ddf50.mp3
15:05:51.783: D/MediaPlayer(776): Couldn't open file on client side, trying server side
15:05:53.813: D/audioURL(776): http://cs4859.vk.me/u14195999/audios/0cbd695ddf50.mp3
15:05:53.823: D/MediaPlayer(776): Couldn't open file on client side, trying server side
15:05:55.373: D/audioURL(776): http://cs4859.vk.me/u14195999/audios/0cbd695ddf50.mp3
15:05:55.383: D/MediaPlayer(776): Couldn't open file on client side, trying server side
15:05:58.143: D/audioURL(776): http://cs1626.vk.me/u149968/audios/04298447cd3c.mp3
15:05:58.153: D/MediaPlayer(776): Couldn't open file on client side, trying server side
...等等。因此,我的大约30首歌曲的播放列表初始化需要约7分钟。
我想,MediaPlayer类方法getDuration()
按顺序下载这些曲目(或其中的一些部分)以获取它们的持续时间。
有没有一种快速获得这些持续时间的方法,而不必下载曲目呢?
Halim Qarroum,似乎这是正确的方法,但我在使用MediaMetadataRetriever
类时遇到了一些问题。
以下是我的代码:
if (android.os.Build.VERSION.SDK_INT < 10){
holder.txtDuration.setDuration(audio.getTrackDuration());
} else {
MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
Log.d("URI", Uri.parse(audio.getUrl()).toString());
mRetriever.setDataSource(getContext(), Uri.parse(audio.getUrl()));
String s = mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
holder.txtDuration.setDuration(Long.parseLong(s));
mRetriever.release();
}
应用程序在mRetriever.setDataSource(getContext(), Uri.parse(audio.getUrl()));
处终止,因为出现了IllegalArgumentException
。 audio.getUrl()
字符串为http://cs4859.vk.me/u14195999/audios/134dfe90d1ec.mp3
。
为什么会出现异常?
404
错误。请尝试使用浏览器。您不必使用Uri.parse()
,可以直接传递字符串。 - Halim QarroumsetDataSource(String path)
表单,但不幸的是效果相同。 - CarlosMediaPlayer.getDuration()
没有任何错误和异常。但是它需要很长时间。媒体似乎没有受到保护,我可以无限制地下载和播放它。 - Carloslogcat
吗? - Halim Qarroum