-3

我一直在将METADATA_KEY_TITLE.mp3 文件提取到 arraylist 和 arrayadaper 以使我的 ListView 仅显示歌曲的标题,并且在标题为空的特殊情况下,标题元素返回文件名...这是我的代码:

final ArrayList<String> myTitu = findTitles(Environment.getExternalStorageDirectory());
metaTitu = new String[myTitu.size()];
for(int j = 0; j<myTitu.size(); j++){
    metaTitu[j] = myTitu.get(j);
}

ArrayAdapter<String> adp = new ArrayAdapter<String>(getContext(),R.layout.songslist_content,R.id.name_of_song_tab, metaTitu);
lv.setAdapter(adp);

// -------------------------------------------------------------------------------

public ArrayList<String> findTitles(File root) {
    ArrayList<String> all = new ArrayList<String>();
    File[] files = root.listFiles();
    String names;

    for (File singlet : files) {
        if (singlet.isDirectory() && !singlet.isHidden()) {
            all.addAll(findTitles(singlet));
        } else {
            if (singlet.getName().endsWith(".mp3")){
                try{
                    metameta = new MediaMetadataRetriever();
                    metameta.setDataSource(singlet.getPath());
                    names = metameta.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
                    all.add(names);
                } catch (Exception e){
                    names = singlet.getName().toString();
                    all.add(names);
                }
            }
        }
    }

    return all;
}

请注意,所有这些都在一个片段中,并且调试器也会抱怨

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference

不指向任何特定的行

4

1 回答 1

1

首先,检查文件对象singlet是否不是,并在匹配扩展名之前null添加检查。您收到空指针异常,因为您没有在catch方法中检查值。null.mp3null

所以你的代码如下:

for (File singlet : files) {
        if (null != singlet) {
            if (singlet.isDirectory() && !singlet.isHidden()) {
                all.addAll(findTitles(singlet));
            } else {
                if (null != singlet.getName() && singlet.getName().endsWith(".mp3")){
                    try{
                        metameta = new MediaMetadataRetriever();
                        metameta.setDataSource(singlet.getPath());
                        names = metameta.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
                        all.add(names);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }
于 2016-10-22T00:49:02.293 回答