Domanda

Sto cercando di recuperare un file audio dalla directory audio, per quello che sto usando sotto il codice.Non sono in grado di capire perché questa condizione if (home.listFiles(new FileExtensionFilter()).length > 0) sta lanciando un errore.Il codice è riportato di seguito.

Uri allsongsuri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
final String MEDIA_PATH = allsongsuri.toString();
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

public ArrayList<HashMap<String, String>> getPlayList(){
    System.out.println(" -- "+MEDIA_PATH);
    File home = new File(MEDIA_PATH);

    if (home.listFiles(new FileExtensionFilter()).length > 0) {
        for (File file : home.listFiles(new FileExtensionFilter())) {
            HashMap<String, String> song = new HashMap<String, String>();
        song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
            song.put("songPath", file.getPath());

            // Adding each song to SongList
        songsList.add(song);
        }
    }
    return songsList;
}

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

Ho bisogno di memorizzare il file audio in Arraylist utilizzando HashMap.Ho provato questo esempio per memorizzare il file nell'elenco http://android-er.blogspot.in/2012/02/list-udio-media-in-mediastoreaudiomedi.html .Usando questo esempio ho provato molto a memorizzare l'elenco in Arraylist come il mio reqirement è necessario.Ma non ci è riuscito. Ho bisogno di aiuto.Devo memorizzare il file audio in Arraylist.

È stato utile?

Soluzione 3

public class SongsManager {
    final String MEDIA_PATH = Environment.getExternalStorageDirectory()
            .getPath() + "/";
    private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
    private String mp3Pattern = ".mp3";

    // Constructor
    public SongsManager() {

    }

    /**
     * Function to read all mp3 files and store the details in
     * ArrayList
     * */
    public ArrayList<HashMap<String, String>> getPlayList() {
        System.out.println(MEDIA_PATH);
        if (MEDIA_PATH != null) {
            File home = new File(MEDIA_PATH);
            File[] listFiles = home.listFiles();
            if (listFiles != null && listFiles.length > 0) {
                for (File file : listFiles) {
                    System.out.println(file.getAbsolutePath());
                    if (file.isDirectory()) {
                        scanDirectory(file);
                    } else {
                        addSongToList(file);
                    }
                }
            }
        }
        // return songs list array
        return songsList;
    }

    private void scanDirectory(File directory) {
        if (directory != null) {
            File[] listFiles = directory.listFiles();
            if (listFiles != null && listFiles.length > 0) {
                for (File file : listFiles) {
                    if (file.isDirectory()) {
                        scanDirectory(file);
                    } else {
                        addSongToList(file);
                    }

                }
            }
        }
    }

    private void addSongToList(File song) {
        if (song.getName().endsWith(mp3Pattern)) {
            HashMap<String, String> songMap = new HashMap<String, String>();
            songMap.put("songTitle",
                    song.getName().substring(0, (song.getName().length() - 4)));
            songMap.put("songPath", song.getPath());

            // Adding each song to SongList
            songsList.add(songMap);
        }
    }


}
.

Altri suggerimenti

Questo deve essere home.listFiles Returning null.

Da Android Developer Riferimento su public File[] listFiles (FileFilter filter)

.

Ottiene un elenco dei file nella directory rappresentata da questo file.Questo elenco viene quindi filtrato tramite un filefiltro file e file corrispondenti viene restituito come array di file. Restituisce NULL Se questo file non è una directory. Se il filtro è nullo, allora tutti i file corrispondono.

Quindi è necessario assicurarsi che MEDIA_PATH sia una directory corretta.

Il metodo "ListFiles ()" può restituire NULL se il file non viene trovato.Suggerirei di mettere in un assegno per vedere se è NULL prima, e procedere solo se è qualcosa di diverso da NULL.Esempio:

public ArrayList<HashMap<String, String>> getPlayList(){
    System.out.println(" -- "+MEDIA_PATH);
    File home = new File(MEDIA_PATH);

    if (home.listFiles(new FileExtensionFilter()) != null){
        if (home.listFiles(new FileExtensionFilter()).length > 0) {
            for (File file : home.listFiles(new FileExtensionFilter())) {
                HashMap<String, String> song = new HashMap<String, String>();
                song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
                song.put("songPath", file.getPath());

                // Adding each song to SongList
                songsList.add(song);
            }
        }
    }

    return songsList;
}
.

Probabilmente vorrai inserire anche una dichiarazione di un altro, per assicurarti che il Sineslist non sia null quando viene restituito.

Con Ref alla risposta di Anup e Destins Volevo solo mettere il codice con il filtro del file

    public class SongsManager {
    // SDCard Path
//  final String MEDIA_PATH = new String("/sdcard/sound_recorder"); 

    final String MEDIA_PATH =Environment.getExternalStorageDirectory()+"/sound_recorder";
    private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

    // Constructor
    public SongsManager(){

    }

    /**
     * Function to read all mp3 files from sdcard
     * and store the details in ArrayList
     * */
    public ArrayList<HashMap<String, String>> getPlayList(){

        Log.d("testsd",MEDIA_PATH);
        File home = new File(MEDIA_PATH);

    //  if (home.listFiles(new FileExtensionFilter()).length > 0) //don't use this to avoid null pointer exception !
        if (home.listFiles(new FileExtensionFilter())!=null) {
            for (File file : home.listFiles(new FileExtensionFilter())) {
                HashMap<String, String> song = new HashMap<String, String>();


                song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
                song.put("songPath", file.getPath());

                // Adding each song to SongList


                songsList.add(song);

            }
        }
        // return songs list array
        return songsList;
    }

    /**
     * Class to filter files which are having .mp3 extension
     * */
    class FileExtensionFilter implements FilenameFilter {
        public boolean accept(File dir, String name) {
            return (name.endsWith(".mp3") || name.endsWith(".MP3") || name.endsWith(".3gpp") || name.endsWith(".wav")); //add more extensions here
        }
    }
}
.

Grazie mille ..... è stato tappeto con il Moto G senza sdcard ..... emula la sdcard fisica .... ancora non funziona.

Ma il tuo codice funziona perfetto con un altro Motorola che ha la SDCARD fisica

Voglio dire quando la SDCard è emulata DONTWORK .. Prova tutti i possibili di Media_Paths

Ho bisogno del tuo consiglio ... Grazie. // stringa finale Media_path= environment.getExternalStageDerectory (). getpath () + "/"; // stringa finale privata Media_path= nuova stringa ("/ sdcard / res / raw /"); // stringa finale Media_path= Ambiente.GetExternalStageDerectory (). Getabsolutepath () + "/"; // stringa finale Media_path= nuova stringa ("/ sdcard /"); // stringa finale Media_path= environment.getExternalStageDerectory (). getpath () + "/"; // stringa finale media_path=""; // stringa finale Media_path= nuova stringa ("/ sdcard / musica /"); // stringa finale Media_path= environment.getExternalStageDerectory (). getpath () + "/"; // stringa finale MediaPath= Environment.getExternalstoRagediRectory (). getabsolutepath () + "/ musica /"; // stringa finale mediapath= nuova stringa ("/ sdcard /"); // stringa finale Media_path= environment.getExternalStageDerectory (). getpath () + "/"; Stringa finale Media_path= Ambiente.getExternalStageDeectory (). GetabsolutePath () + "/";

Assicurati di non dimenticare l'autorizzazione Usi Leggere la memoria esterna in Manifest.xml

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top