Android Studio 音乐播放器无法从 sdcard 读取,只能读取内存

Posted

技术标签:

【中文标题】Android Studio 音乐播放器无法从 sdcard 读取,只能读取内存【英文标题】:Android Studio music player cant read from sdcard, only internal memory 【发布时间】:2016-11-09 04:30:40 【问题描述】:

如果这是一个愚蠢的问题,我深表歉意,它可能会成为一个快速解决方案,但我就是想不通。我正在 android studio 中构建一个音乐播放器,并且 sdcard 上的所有歌曲都没有显示在列表视图中,只有内部存储器中的歌曲,即使我确实实现了 getExternalStorageDirectory() 并在清单文件中添加了权限。 非常感谢任何对此或建设性批评的意见。这是主要的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();
    

【问题讨论】:

使用棉花糖 6.0?? 最低 API 10,Gingerbread,不过使用了冰淇淋三明治设备。 【参考方案1】:

使用此方法从您的设备获取文件路径列表

 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();
  
 ......

注意:使用“/storage/sdcard1/”从sdCard读取文件,使用Environment.getExternalStorageDirectory().getAbsolutePath()从手机内存读取文件。

希望这会对你有所帮助。

【讨论】:

以上是关于Android Studio 音乐播放器无法从 sdcard 读取,只能读取内存的主要内容,如果未能解决你的问题,请参考以下文章

17 Android Studio开发实战:音乐播放器——浪花音乐

按字母顺序排序音乐播放器的播放列表(Android Studio)

Android studio通过绑定式Service实现简易音乐播放器

如何在 Android Studio 中创建迷你音乐播放器(Activity 或 Fragment 等)

Android Studio如何在活动开始时自动播放背景音乐

在Android Studio,用Service播放音乐时,如何根据其他页面传输过来的字符串指定播放哪首音乐?