我目前正在尝试制作一个音频媒体播放器,我的设备正在运行lollipop系统。在设置媒体播放器的数据源时遇到了问题。以下是我设置数据源的方法:
public void playSong() {
player.reset();
Song selSong = songs.get(songPos);
long currSong = selSong.getId();
//Get Uri of song
Uri trackUri = ContentUris.withAppendedId(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, currSong);
try {
//Tell the player the song to play
player.setDataSource(getApplicationContext(), trackUri);
} catch (Exception e) {
Log.e("MUSIC SERVICE", "Error setting data source", e);
Log.d("URI Path", trackUri.toString());
}
//Will prepare the song and call onPrepare of player
player.prepareAsync();
}
最终的 Uri 是这样的:
content://media/external/audio/media/22
我做了一些研究,据我理解,在 Android 4.1 之后,你不能再使用 URI 作为数据源。当我运行上述代码的应用程序时,会得到以下错误:
E/MediaPlayer﹕ Unable to create media player
E/MUSIC SERVICE﹕ Error setting data source
java.io.IOException: setDataSource failed.: status=0x80000000
at android.media.MediaPlayer.nativeSetDataSource(Native Method)
现在我需要将URI转换为文件路径并将其作为数据源提供。经过更多研究,似乎kitkat改变了提供URI的方式,因此很难从URI获取文件路径。但是,我不确定这个变化是否持续到Android Lollipop 5.0.2。基本上,我有歌曲的URI,但我需要提供除URI之外的东西作为数据源。在Lollipop上有没有办法转换URI?如果没有,只知道歌曲ID又该如何提供数据源?谢谢。
Uri
是一个文件,更不用说您可以访问它了。 - CommonsWareString
参数的setDataSource()
。如文档所述,它需要“文件路径或要播放的http / rtsp流的URL”。接受Uri
值的setDataSource()
版本应该可以正常使用content://
Uri
值。无论您的特定Uri
是否有效,因为您自己从各个部分组装它,这是另一回事。 - CommonsWare