问题描述
如果事实证明这是一个愚蠢的问题我很抱歉,它可能会成为一个快速解决方案,但我无法弄明白。我正在android studio中构建一个音乐播放器,并且sdcard上的所有歌曲都没有显示在列表视图中,只有内部存储器中的那些,即使我确实实现了getExternalStorageDirectory()并在清单文件中添加了权限。
关于这个或建设性批评的任何意见都是非常苛刻的。这是主要的java类。
I apologize if this turns out to be a stupid question, it might turn out as a quick fix but I just cant figure it out. I'm building a music player in android studio and none of the songs on the sdcard dont show up in the list view, only the ones in internal memory, even though I did implement getExternalStorageDirectory() and added the permission in the manifest file.Any input on this or constructive criticism is greatly apreciated. Here is the main java class.
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();
}
}
推荐答案
使用此方法从您的设备获取filePath列表
Use this method to get the list of filePath from your device
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)方法的参数,如下所示:
but you need to get files from sdCard, for that pass "/storage/sdcard1/" as the parameter for findSongs(String path) method like this:
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();
}
......
}
希望这会对你有帮助。
这篇关于Android Studio音乐播放器无法从SD卡读取,只能读取内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!