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();
}
}
}
}
}
我一直很沮丧地将 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();
}
}
}
}
}