Генерация исключения нулевого указателя в Android

Я пытаюсь получить аудиофайл из аудиокаталога, для этого я использую приведенный ниже код. Я не могу понять, почему это условие if (home.listFiles(new FileExtensionFilter()).length > 0) вызывает ошибку. Код приведен ниже.

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"));
}

Мне нужно сохранить аудиофайл в ArrayList, используя hashMap. Я попробовал этот пример для сохранения файла в списке http://android-er.blogspot.in/2012/02/list-audio-media-in-mediastoreaudiomedi.html . Используя этот пример, я много пытался сохранить список в ArrayList, поскольку это нужно моему требованию. Но не удалось. Мне нужна помощь. Мне нужно сохранить аудиофайл в Arraylist.


person techniqez    schedule 16.11.2013    source источник
comment
Покажите нам трассировку стека и выделите номер строки, где вы получаете NPE, пожалуйста.   -  person Adam Arold    schedule 16.11.2013


Ответы (6)


Должно быть, home.listFiles возвращает null.

Из справочника для разработчиков Android на public File[] listFiles (FileFilter filter)

Получает список файлов в каталоге, представленном этим файлом. Затем этот список фильтруется с помощью FileFilter, и соответствующие файлы возвращаются в виде массива файлов. Возвращает нуль, если этот файл не является каталогом. Если фильтр равен нулю, то все файлы совпадают.

Поэтому вам нужно убедиться, что MEDIA_PATH является правильным каталогом.

person Szymon    schedule 16.11.2013
comment
Да @Szymon, это был home.listFiles, который возвращал значение null. - person techniqez; 19.11.2013

Метод listFiles() может возвращать значение null, если файл не найден. Я бы предложил сначала проверить, является ли он нулевым, и продолжить только в том случае, если он отличается от нулевого. Пример:

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;
}

Вы, вероятно, также захотите добавить оператор else, чтобы убедиться, что songList не равен нулю, когда он возвращается.

person DerStrom8    schedule 16.11.2013
comment
Спасибо всем за то, что уделили ваше драгоценное время... У меня это работает немного по-другому.. Вставка кода здесь, чтобы он мог быть полезен для кого-то еще... Спасибо :) - person techniqez; 19.11.2013

со ссылкой на ответ Анупа и Дестрома, я просто хочу поместить код с помощью фильтра имени файла

    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
        }
    }
}
person LOG_TAG    schedule 24.12.2013

Большое спасибо ..... получил коврик с moto g без SD-карты ..... он эмулирует физическую SD-карту .... все еще не работает.

Но ваш код отлично работает с другой моторолой, у которой есть физическая SD-карта.

я имею в виду, что когда SD-карта эмулируется, она не работает... я пробую все возможные пути MEDIA_PATHS

мне нужен ваш совет ... спасибо. //конечная строка MEDIA_PATH = Environment.getExternalStorageDirectory().getPath() + "/"; // закрытая финальная строка MEDIA_PATH = new String("/sdcard/res/raw/"); //конечная строка MEDIA_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/"; //конечная строка MEDIA_PATH = new String("/sdcard/"); //конечная строка MEDIA_PATH = Environment.getExternalStorageDirectory().getPath() + "/"; // конечная строка MEDIA_PATH =""; //конечная строка MEDIA_PATH = новая строка("/sdcard/Musica/"); //конечная строка MEDIA_PATH = Environment.getExternalStorageDirectory().getPath() + "/"; //final String MEDIAPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Musica/"; //конечная строка MEDIAPATH = new String("/sdcard/"); //конечная строка MEDIA_PATH = Environment.getExternalStorageDirectory().getPath() + "/"; конечная строка MEDIA_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";

person user2464404    schedule 13.03.2015
comment
Это действительно следует задать как отдельный вопрос. Поскольку это не ответ, и у вас нет представителя, чтобы опубликовать его в качестве комментария, это единственный способ его увидеть. - person Stuart Siegler; 13.03.2015

Убедитесь, что вы не забыли использовать разрешение READ EXTERNAL STORAGE в manifest.xml.

person Noname    schedule 17.07.2016

person    schedule
comment
мы можем использовать FilenameFilter вместо метода addSongToList! - person LOG_TAG; 24.12.2013