1
votes

Why does this program not play music? I am trying to make an application with JavaFX to allow the user to play any MP3 file he wants to play. But it does not work at all! Why?

It gives absolutely no error!

package application;

import java.io.File;
import java.nio.file.Paths;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

public class Start extends Application {

public void start(Stage primStage) {
    try {
        // Validation for first time start

        Alert a = new Alert(AlertType.INFORMATION);
        a.setTitle("Welcome");
        a.setHeaderText("Welcome to Orpheus!");
        a.setContentText("Welcome to Orpheus. Pick the folder in which all your music is located");

        Stage stg = (Stage) a.getDialogPane().getScene().getWindow();
        stg.getIcons().add(new Image(this.getClass().getResource("harp.png").toString()));
        primStage.getIcons().add(new Image(this.getClass().getResource("harp.png").toString()));

        a.showAndWait();

        DirectoryChooser dc = new DirectoryChooser();
        dc.setInitialDirectory(new File(System.getProperty("user.home")));
        dc.setTitle("Pick your folder!");

        File f = dc.showDialog(primStage);
        File[] fileArray = f.listFiles();
        boolean[] song = new boolean[fileArray.length];
        int j = 0;

        if (fileArray != null) {
            for (File child : fileArray) {
                String ext = "";
                int i = child.getName().lastIndexOf('.');

                if (i >= 0) {
                    ext = child.getName().substring(i+1);
                }

                if (ext.equals("mp3")) {
                    song[j] = true;
                    j++;
                } else {
                    song[j] = false;
                    j++;
                }
            }
        }

        j = 0;
        ArrayList<File> fileList = new ArrayList<>();

        for (boolean b : song) {
            if(b) {
                fileList.add(fileArray[j]);
            }
            j++;
        }

        //New codes!
        ArrayList<String> names = new ArrayList<>();

        for (File fi : fileList) {
            String tmp = fi.getCanonicalPath();
            tmp = tmp.replaceAll("\\\\", "/");
            names.add(tmp);
        }

        Media m = new Media("file:///" + names.get(0));
        MediaPlayer mp = new MediaPlayer(m);
        mp.play();

        //App ends with no sleep method for threads
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    launch(args);
}
}

But now I get error:

MediaException: MEDIA_UNAVAILABLE : \file:\C:\Users\Kaboom\Music\Closer.mp3 (The filename, directory name, or volume label syntax is incorrect) at javafx.scene.media.Media.(Media.java:407) at application.Start.start(Start.java:75) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) at java.lang.Thread.run(Unknown Source)

I did some research and replaced some code. Now the only thingy which happens is no music plays and app ends running.

What am I doing wrongly?

2
Basically you want your program to check first the existence of the files and that it can open only the mp3 files ? - Bo Halim
@BoHalim yes this is a tester for the app which I am making. When this works I can make proper GUI! - Bomba Bazooka
new Media("file:///" + fileList.get(0).getName()); Uhm... better not... File names can contain chars that are not valid in a URL and BTW the File class already contains a method for converting the File to a url: file.toURI().toURL(), followed by .toExternalForm(), is a String is needed. - fabian
@fabian thanks but now I get an error of media unavailable type. will update question... - Bomba Bazooka
Maybe not what is causing the error, but a problem nonetheless is the Thread.sleep() in the start method. - Politic Revolutionnaire

2 Answers

0
votes

I figured out what was wrong with this problem. Very stupid it is.

I just had to add the MediaPlayer to MediaView and into GUI

0
votes

Open media like this:

File file = new File(names.get(0));
String path = file.toURI().toASCIIString();
Media m = new Media(path);

This will convert the path to make it compatible with url sintax