ArrayAdapter 中的媒体元数据错误

Mediametadata error in ArrayAdapter

我一直很沮丧地将 METADATA_KEY_TITLE 个 .mp3 文件提取到 arraylist 和 arrayadaper,以便我的 ListView 仅显示歌曲的标题,在标题为空的例外情况下,标题元素 returns 文件名... 这是我的代码:

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

不指向任何特定行

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

因此您的代码将如下所示:

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