Android MediaPlayer.prepare()正在提供IOException
我正在从内存中读取歌曲列表。我可以看到歌曲列表,但当我单击播放它时,mp.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
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,当使用构造函数新文件(字符串路径、字符串名称);