【问题标题】:How to find mp3 files from sdcard in android programatically如何以编程方式从 android 的 sdcard 中查找 mp3 文件
【发布时间】:2014-04-14 22:19:02
【问题描述】:

我是 android 编程新手,任何人都可以帮我在我的 android 设备中找到所有 .mp3 文件。

【问题讨论】:

    标签: android filter mp3


    【解决方案1】:

    您应该使用 MediaStore。这是我用于类似内容的示例代码:

    private static ArrayList<SongModel> LoadSongsFromCard() {
        ArrayList<SongModel> songs = new ArrayList<SongModel>();
    
        // Filter only mp3s, only those marked by the MediaStore to be music and longer than 1 minute
        String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"
                + " AND " + MediaStore.Audio.Media.MIME_TYPE + "= 'audio/mpeg'"
                + " AND " + MediaStore.Audio.Media.DURATION + " > 60000";
    
        final String[] projection = new String[] {
            MediaStore.Audio.Media._ID,             //0
            MediaStore.Audio.Media.TITLE,           //1
            MediaStore.Audio.Media.ARTIST,          //2
            MediaStore.Audio.Media.DATA,            //3
            MediaStore.Audio.Media.DISPLAY_NAME
        };
    
        final String sortOrder = MediaStore.Audio.AudioColumns.TITLE
                + " COLLATE LOCALIZED ASC";
    
        Cursor cursor = null;
    
        try {
            // the uri of the table that we want to query
            Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; //getContentUriForPath("");
            // query the db
            cursor = _context.getContentResolver().query(uri,
                    projection, selection, null, sortOrder);
            if (cursor != null) {
                cursor.moveToFirst();                       
                while (!cursor.isAfterLast()) { 
                    //if (cursor.getString(3).contains("AwesomePlaylists")) {
                        SongModel GSC = new SongModel();
                        GSC.ID = cursor.getLong(0);
                        GSC.songTitle = cursor.getString(1);
                        GSC.songArtist = cursor.getString(2);
                        GSC.path = cursor.getString(3);
    
                        // This code assumes genre is stored in the first letter of the song file name
                        String genreCodeString = cursor.getString(4).substring(0, 1);
                        if (!genreCodeString.isEmpty()) {
                            try {
                                GSC.genre = Short.parseShort(genreCodeString);
                            } catch (NumberFormatException ex) {
                                Random r = new Random();
                                GSC.genre = (short) r.nextInt(4);
                            } finally {
                                songs.add(GSC);
                            }
                        }
                    //}
                    cursor.moveToNext();
                }
            }
        } catch (Exception ex) {
    
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    
        return songs;
    }
    

    【讨论】:

    • 什么是 SongModel 类??
    【解决方案2】:
    public ArrayList<String> searchMP3File(ArrayList<String> aListFilePath, String rootPath) {
    
        File rootFile = new File(rootPath); 
    
        File[] aRootFileFilter = rootFile.listFiles(new FileFilter() {
    
            @Override
            public boolean accept(File pathname) {
                if(pathname.getName().endsWith(".mp3"))
                    return true;
                else 
                    return false;
            }
        });
    
        if(aRootFileFilter != null && aRootFileFilter.length > 0) {
            for(int i = 0; i < aRootFileFilter.length; i++) {
                aListFilePath.add(aRootFileFilter[i].getPath());
            }
        }
        File[] aRootFile = rootFile.listFiles();
        for(int i = 0; i < aRootFile.length; i++) {
            if(aRootFile[i].isDirectory()) {
                ArrayList<String> aListSubFile = searchMP3File(aListFilePath, aRootFile[i].getPath());
                if(aListSubFile != null && aListSubFile.size() > 0)
                    aListFilePath = aListSubFile;
            }
        }
    
        return aListFilePath;
    }
    

    【讨论】:

      【解决方案3】:

      当然。你可以 。代码未测试。

      File dir =new File(Environment.getExternalStorageDirectory());
      if (dir.exists()&&dir.isDirectory()){
        File[] files=dir.listFiles(new FilenameFilter(){
         @Override
         public boolean accept(File dir,String name){
           return name.contains(".mp3");
        }
        });    
         }
      

      【讨论】:

        【解决方案4】:

        您可以使用递归搜索。将此函数与您要开始搜索 .mp3 文件的目录路径一起使用(例如“/mnt/sdcard”)。

        public Vector<String> mp3Files = new Vector<String>();
        
        private void searchInDirectory(String directory)
        {
            File dir = new File(directory);
        
            if(dir.canRead() && dir.exists() && dir.isDirectory())
            {
                String []filesInDirectory = dir.list();
                if(filesInDirectory != null)
                {
                    for(int i=0; i<filesInDirectory.length; i++)
                    {
        
                        File file = new File(directory+"/"+filesInDirectory[i]);                    
        
                        if(file.isFile() && file.getAbsolutePath().toLowerCase(Locale.getDefault()).endsWith(".mp3"))
                        {
                            mp3Files.add(directory+"/"+filesInDirectory[i]);
                        }
        
                        else if(file.isDirectory() )
                        {
                            searchInDirectory(file.getAbsolutePath());
                        }
        
                    }
                }
            }
        }
        

        【讨论】:

        • 如果我想获取所有文件夹中的所有文件,而不仅仅是 /mnt/sdcard 中的所有文件呢??
        【解决方案5】:
        private String[] videoExtensions;
        videoExtensions = new String[2];
        videoExtensions[0] = "mp3";
        videoExtensions[1] = "3gp";
        

        在你的 onCreate() 方法中声明这个之后,在一些方法中设置下面的代码并调用它。根据您的需要在我的代码中进行更改。

        试试{

        File file = new File("mnt/sdcard/DCIM/Camera");
                    File[] listOfFiles = file.listFiles();
        
                    videoArray = new ArrayList<HashMap<String, String>>();
                    videoHashmap = new HashMap<String, String>();
        
                    for (int i = videoIndex; i < listOfFiles.length; i++) {
                        File files = listOfFiles[i];
                        rowDataVideos = new HashMap<String, String>();
                        for (String ext : videoExtensions) {
                            if (files.getName().endsWith("." + ext)) {
                                videoHashmap.put("Video", files.getAbsolutePath());
                                videoArray.add(videoHashmap);
                                fileSize = files.length();
                                fileSizeInMb += convertSize(fileSize, MB);
        
                                thumb = ThumbnailUtils.createVideoThumbnail(files.getAbsolutePath(), MediaStore.Images.Thumbnails.MINI_KIND);
        
                                if (thumb != null) {
                                    createTempDirectory();
                                    try {
                                        FileOutputStream out = new FileOutputStream(audiofile);
                                        thumb.compress(Bitmap.CompressFormat.PNG, 90, out);
                                        out.flush();
                                        out.close();
        
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                                // Tue Apr 23 16:08:28 GMT+05:30 2013
                                lastModDate = new Date(files.lastModified()).toString();
        
                                dateTime = (dateToMilliSeconds(lastModDate) / 1000L);
        
                                rowDataVideos.put(VIDEOPATH, files.getAbsolutePath());
                                rowDataVideos.put(VIDEOSTATUS, "0");
                                rowDataVideos.put(VIDEOSIZEINMB, String.valueOf(fileSizeInMb));
                                rowDataVideos.put(VIDEODATE, String.valueOf(dateTime));
        
                                if (dateTime > (RESPONSE_TIMESTAMP_VIDEO / 1000L)) {
                                    dataProvider.InsertRow(VIDEOS, rowDataVideos);
                                }
                            }
        
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-28
          • 2011-03-23
          相关资源
          最近更新 更多