我正在尝试从歌曲中检索元数据。
我创建了一个名为Song的类,其中有一个基本的构造函数,很多吸气剂,例如“ getTitle()”或“ getArtist()”等等……
要实际获取此信息,我将必须运行一个名为applyProperties()的方法。该方法遍历所有元数据,并将它们放入实例变量中,但以其自身的速度和线程进行。有时,当我调用getter时,输出仅为null,这可能是因为它在第一个方法分配值之前获取了数据。只是我在猜...
它是这样的:
这时,实例变量应该已经使用String进行了初始化,以便能够查看有关歌曲文件的信息。但是它们并不同步。
我要执行的是使applyProperties()运行,并且在完全完成元数据检索之前,不要让任何其他代码继续运行。这样,在元数据准备就绪之前,我不必冒险运行吸气剂。
这是Song类:
public Song(String fileName, MapChangeListener mapChangeListener) {
// The path to the selected song
String path = new File("src/sample/media/" + fileName).getAbsolutePath();
// Adding the path to the media
media = new Media(new File(path).toURI().toString());
// media.getMetadata().addListener(mapChangeListener);
}
public Song (String fileName){
// The path to the selected song
String path = new File("src/sample/media/" + fileName).getAbsolutePath();
// Adding the path to the media
media = new Media(new File(path).toURI().toString());
}
public String getSongTitle() {
return songTitle;
}
public String getSongArtist() {
return songArtist;
}
public String getSongAlbum() {
return songAlbum;
}
public Media getMedia() {
return media;
}
public void applyProperties() {
System.out.println("Applying properties..");
ObservableMap<String,Object> meta_data=media.getMetadata();
meta_data.addListener(new MapChangeListener<String,Object>(){
@Override
public void onChanged(Change<? extends String, ? extends Object> ch) {
if(ch.wasAdded()){
String key=ch.getKey();
Object value=ch.getValueAdded();
switch(key){
case "album":
songAlbum = value.toString();
// System.out.println(value.toString());
break;
case "artist":
songArtist = value.toString();
// System.out.println(value.toString());
break;
case "title":
songTitle = value.toString();
// System.out.println(value.toString());
doneSearching=true;
break;
}
}
}
});
}