如果这被证明是一个愚蠢的问题,我深表歉意,这可能是一个快速解决方案,但我就是无法弄清楚。我正在 android studio 中构建一个音乐播放器,尽管我确实实现了 getExternalStorageDirectory() 并在清单文件中添加了权限,但 sdcard 上的所有歌曲都不会显示在列表视图中,只有内部存储器中的歌曲。
对此的任何意见或建设性批评都将受到高度赞赏。这是主要的 java 类。
public class MainActivity extends AppCompatActivity {
ListView lv;
String[] items;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lvPlayList);
//---------------------------------------------> V HERE V <-------------------------
final ArrayList<File> mySongs = findSongs(Environment.getExternalStorageDirectory());
//----------------------------------------------------------------------------------
items = new String[ mySongs.size() ];
for(int i = 0; i<mySongs.size(); i++) {
toast(mySongs.get(i).getName().toString());
items[i] = mySongs.get(i).getName().toString().replace(".mp3", "").replace(".wav", "");
}
ArrayAdapter<String> adp = new ArrayAdapter<>(getApplicationContext(), R.layout.song_layout, R.id.textView, items);
lv.setAdapter(adp);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
startActivity(new Intent(getApplicationContext(), Player.class).putExtra("pos",position).putExtra("songlist",mySongs));
}
});
}
public ArrayList<File> findSongs(File root) {
ArrayList<File> al = new ArrayList<>();
File[] files = root.listFiles();
for(File singleFile : files) {
if(singleFile.isDirectory() && !singleFile.isHidden()) {
al.addAll(findSongs(singleFile));
} else {
if(singleFile.getName().endsWith(".mp3") || singleFile.getName().endsWith(".wav")) {
al.add(singleFile);
}
}
}
return al;
}
public void toast(String text) {
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
}
}
使用此方法从您的设备获取文件路径列表
ArrayList<String> findSongs(String rootPath) {
ArrayList<String> fileList = new ArrayList<>();
try{
File rootFolder = new File(rootPath);
File[] files = rootFolder.listFiles(); //here you will get NPE if directory doesn't contains any file,handle it like this.
for (File file : files) {
if (file.isDirectory()) {
if (findSongs(file.getAbsolutePath()) != null) {
fileList.addAll(findSongs(file.getAbsolutePath()));
} else {
break;
}
} else if (file.getName().endsWith(".mp3")) {
fileList.add(file.getAbsolutePath());
}
}
return fileList;
}catch(Exception e){
return null;
}
}
但您需要从 sdCard 获取文件,为此传递“/storage/sdcard1/”作为 findSongs(String path) 方法的参数,如下所示:
onCreate(Bundle svaeInstance){
........
........
if(findSongs("/storage/sdcard1/")!=null){
ArrayList<String> listOfFilePath=findSongs("/storage/sdcard1/"); // here you will get all the files path which contains .mp3 at the end.
//do the remaining stuff
}else { Toast.makeText(this, "sdCard not available", Toast.LENGTH_SHORT).show();
}
......
}
Note:使用“/storage/sdcard1/”从 sdCard 读取文件,并使用 Environment.getExternalStorageDirectory().getAbsolutePath() 从手机内存读取文件。
希望对你有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)