Java 从android设备获取.mp3格式的文件

Java 从android设备获取.mp3格式的文件,java,android,android-sdcard,Java,Android,Android Sdcard,我正在开发一个音乐播放器。我想从android设备获取所有.mp3格式的文件。 但是这段代码没有得到任何文件。我的.mp3文件位于“SD卡/音乐”文件夹中。如果我更改媒体路径=新字符串(“SD卡/音乐”)像这样,它只从那个音乐文件夹中获取文件。但我需要从外部/内部内存卡的每个文件夹中获取所有.mp3文件。请帮帮我。 这是我的密码 final String MEDIA_PATH = new String(Environment.getExternalStorageDirectory()); pu

我正在开发一个音乐播放器。我想从android设备获取所有.mp3格式的文件。 但是这段代码没有得到任何文件。我的.mp3文件位于“SD卡/音乐”文件夹中。如果我更改
媒体路径=新字符串(“SD卡/音乐”)像这样,它只从那个音乐文件夹中获取文件。但我需要从外部/内部内存卡的每个文件夹中获取所有.mp3文件。请帮帮我。
这是我的密码

final String MEDIA_PATH = new String(Environment.getExternalStorageDirectory());

public void Generate_Database(){
    File home = new File(MEDIA_PATH);

    if (home.listFiles(new FileExtensionFilter()).length > 0) {
        for (File file : home.listFiles(new FileExtensionFilter())) {
            String title = file.getName().substring(0, (file.getName().length() - 4));
            String path = file.getPath();
            mediaInfo.setDataSource(path);

            String albumName = "unknown",artist = "unknown",genere = "unknown",duration = "unknown",composer = "unknown";

            if(mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM) == null)
                albumName = "unknown";
            else{
                albumName = mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
            }
            if(mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST) == null)
                artist = "unknown";
            else{
                artist = mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
            }
            if(mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE) == null)
                genere = "unknown";
            else{
                genere = mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
            }
            if(mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) == null)
                duration = "unknown";
            else{
                duration = mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            }
            if(mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER) == null)
                composer = "unknown";
            else{
                composer = mediaInfo.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER);
            }

            //Toast.makeText(getApplicationContext(), title+path+ albumName+artist+ genere+ duration+ composer, Toast.LENGTH_LONG).show();

            ds.createEntry2(title, path, albumName, artist, genere, duration, composer);
        }
    }
这用于提取.mp3文件

class FileExtensionFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return (name.endsWith(".mp3") || name.endsWith(".MP3"));
    }

}
  • 查询媒体文件
  • 通过检查文件扩展名来检查文件是否为mp3
  • 以下方法将返回设备中的所有mp3音频文件:

    private List<String> scanDeviceForMp3Files(){
        String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
        String[] projection = {
                MediaStore.Audio.Media.TITLE,
                MediaStore.Audio.Media.ARTIST,
                MediaStore.Audio.Media.DATA,
                MediaStore.Audio.Media.DISPLAY_NAME,
                MediaStore.Audio.Media.DURATION
        };
        final String sortOrder = MediaStore.Audio.AudioColumns.TITLE + " COLLATE LOCALIZED ASC";
        List<String> mp3Files = new ArrayList<>();
    
        Cursor cursor = null;
        try {
            Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            cursor = getContentResolver().query(uri, projection, selection, null, sortOrder);
            if( cursor != null){
                cursor.moveToFirst();
    
                while( !cursor.isAfterLast() ){
                    String title = cursor.getString(0);
                    String artist = cursor.getString(1);
                    String path = cursor.getString(2);
                    String displayName  = cursor.getString(3);
                    String songDuration = cursor.getString(4);
                    cursor.moveToNext();
                    if(path != null && path.endsWith(".mp3")) {
                        mp3Files.add(path);
                    }
                }
    
            }
    
            // print to see list of mp3 files
            for( String file : mp3Files) {
                Log.i("TAG", file);
            }
    
        } catch (Exception e) {
            Log.e("TAG", e.toString());
        }finally{
            if( cursor != null){
                cursor.close();
            }
        }
        return mp3Files;
    }
    
    private List scanDeviceForMp3Files(){
    字符串选择=MediaStore.Audio.Media.IS_MUSIC+“!=0”;
    字符串[]投影={
    MediaStore.Audio.Media.TITLE,
    MediaStore.Audio.Media.ARTIST,
    MediaStore.Audio.Media.DATA,
    MediaStore.Audio.Media.DISPLAY\u名称,
    MediaStore.Audio.Media.DURATION
    };
    最后一个字符串sortOrder=MediaStore.Audio.AudioColumns.TITLE+“整理本地化ASC”;
    List mp3Files=new ArrayList();
    游标=空;
    试一试{
    Uri Uri=android.provider.MediaStore.Audio.Media.EXTERNAL\u CONTENT\u Uri;
    cursor=getContentResolver().query(uri、投影、选择、null、排序器);
    如果(光标!=null){
    cursor.moveToFirst();
    而(!cursor.isAfterLast()){
    字符串标题=cursor.getString(0);
    字符串艺术家=cursor.getString(1);
    字符串路径=cursor.getString(2);
    String displayName=cursor.getString(3);
    String songDuration=cursor.getString(4);
    cursor.moveToNext();
    if(path!=null&&path.endsWith(“.mp3”)){
    mp3Files.add(路径);
    }
    }
    }
    //打印以查看mp3文件列表
    用于(字符串文件:mp3Files){
    Log.i(“标签”,文件);
    }
    }捕获(例外e){
    Log.e(“TAG”,e.toString());
    }最后{
    如果(光标!=null){
    cursor.close();
    }
    }
    返回mp3文件;
    }
    
    有许多可用的代码示例:@SunilChaudhary什么样的错误?请分享!很抱歉,现在已经解决了,我想您将其声明为POJO类,因此我将其删除,并且您将需要读取外部存储权限。