Android MediaPlayer.prepare()正在提供IOException

Android MediaPlayer.prepare()正在提供IOException,android,Android,我正在从内存中读取歌曲列表。我可以看到歌曲列表,但当我单击播放它时,mp.prepare抛出一个IOException。请帮忙。如果我也从内部存储读取,是否必须添加特定权限- public class MusicPlay extends ListActivity { private static final String MEDIA_PATH = new String( "/storage/sdcard0/Music"); private List<String> s

我正在从内存中读取歌曲列表。我可以看到歌曲列表,但当我单击播放它时,mp.prepare抛出一个IOException。请帮忙。如果我也从内部存储读取,是否必须添加特定权限-

public class MusicPlay extends ListActivity {
private static final String MEDIA_PATH = new String(
        "/storage/sdcard0/Music");
private List<String> songs = new ArrayList<String>();
private MediaPlayer mp = new MediaPlayer();
private int currPos = 0;
ListView lv = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    updateSongList();

}

public void updateSongList() {
    // TODO Auto-generated method stub
    File home = new File(MEDIA_PATH);
    if (home.listFiles(new Mp3Filter()).length > 0) {
        for (File file : home.listFiles(new Mp3Filter())) {
            songs.add(file.getName());
        }
    }
    ArrayAdapter<String> songList = new ArrayAdapter<String>(this,
            R.layout.song_item, songs);
    setListAdapter(songList);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    currPos = position;
    Toast.makeText(this, "Yes", 10).show();
    playSong(MEDIA_PATH + songs.get(position));
}

private void playSong(String songPath) {
    // TODO Auto-generated method stub
    mp.reset();
    try {
        mp.reset();
        mp.setDataSource(songPath);

        mp.prepare();
        mp.start();

        mp.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                nextSong();
            }

            private void nextSong() {
                // TODO Auto-generated method stub
                if (++currPos >= songs.size()) {
                    // Last song, just reset currentPosition
                    currPos = 0;
                } else {
                    // Play next song
                    playSong(MEDIA_PATH + songs.get(currPos));
                }
            }

        });
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
公共类MusicPlay扩展了ListActivity{
私有静态最终字符串媒体路径=新字符串(
“/storage/sdcard0/Music”);
私有列表歌曲=新建ArrayList();
私有MediaPlayer mp=新MediaPlayer();
私有int currPos=0;
ListView lv=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
updateSongList();
}
public void updateSongList(){
//TODO自动生成的方法存根
文件主目录=新文件(媒体路径);
if(home.listFiles(新的Mp3Filter()).length>0){
对于(文件:home.listFiles(新的Mp3Filter())){
songs.add(file.getName());
}
}
ArrayAdapter歌曲列表=新的ArrayAdapter(此,
R.layout.song_项目,歌曲);
setListAdapter(歌曲列表);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id){
//TODO自动生成的方法存根
super.onListItemClick(左、右、位置、id);
currPos=位置;
Toast.makeText(这个“Yes”,10.show();
播放歌曲(媒体路径+歌曲。获取(位置));
}
私有void playSong(String songPath){
//TODO自动生成的方法存根
mp.reset();
试一试{
mp.reset();
mp.setDataSource(songPath);
mp.prepare();
mp.start();
mp.setOnCompletionListener(新的OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
//TODO自动生成的方法存根
nextSong();
}
私隐{
//TODO自动生成的方法存根
如果(++currPos>=songs.size()){
//最后一首歌,只需重置当前位置
currPos=0;
}否则{
//播放下一首歌
播放歌曲(媒体路径+歌曲获取(currPos));
}
}
});
}捕获(IllegalArgumentException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(安全异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(非法状态){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}

首先,我建议不要硬编码路径,使用以下方法:

if (Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED)
            || Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED_READ_ONLY)) {
        File path = manager.path = Environment
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
}

代码对我来说似乎很好,我认为您的路径是错误的。或者您没有将特权添加到清单中。

您缺少歌曲路径和名称之间的分隔符。请将媒体路径更改为:

private static final String MEDIA_PATH = new String(
    "/storage/sdcard0/Music/");
另外,我通常建议使用File,当使用构造函数
新文件(字符串路径、字符串名称);