我有一个远程音频文件的 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
是.
为什么会出现异常?