Desktop open() - Problem mit Media Player

GG

Mitglied
Hallo,
meine Anwendung lädt avi-Dateien vom Host in das lokale Benutzer-Temp-Verzeichnis und startet die Wiedergabe mit
Java:
Desktop.getDesktop().open(new File(...));
Das klappt auch prima, außer unter Win7 mit dem Windows Media Player. Da bekomme ich eine IOException "Zugriff verweigert". Jede andere Standard-Applikation (VLC, Windows Media Center, Videopad, ..) funktioniert.
Das Löschen der Datei bei Programm-Exit macht in keinem Fall Probleme.
Ich stehe da fassungslos davor.

Möglicherweise ist das kein richtiges Java.Problem, aber vielleicht fällt einem von Euch ja etwas dazu ein.

danke schonmal
Gus
 
Habe es gerade mal ausprobiert. Konnte den Fehler leider nicht reprodutzieren. Der verwendete Temp-Ordner war bei mir: C:/Users/<meinUserName>/AppData/Local/Temp/
Bei dem Aufruf werden ja mindestens zwei Dateien "gelesen" einmal Dein avi und die wmplayer.exe. Wenn du sagst, dass das avi sonst keine Probleme macht: Vielleicht darf Dein User den wmplayer.exe nicht starten... bischen schwach, geb ich zu, aber was besseres fällt mir grad nicht ein. Steht denn in der IOException nicht etwas mehr dazu, welche Datei es ist?
 
Zuletzt bearbeitet von einem Moderator:
nillehammer, danke auf jeden Fall fürs Ausprobieren, in der Exception steht die avi-Datei.
Ich habs jetzt auf einem XP ausprobiert, das wird immer mysteriöser:
der open zieht immer VLC, egal was ich eingestellt habe (und bei Doppelklick auch gestartet wird..)
Ich muss da morgen nochmal tiefer graben....
 
2x Kristallkugel:

1) Win7: Nach dem abholen vom Host wurde die Datei nicht zugemacht

2) XP: Kommt der VLC auch wenn die Entwicklungsumgebung (oder besser noch das ganze XP) neu gestartet wurde?

Alternativ nicht über den Desktop gehen sondern die üblich verdächtigen Pfade nach gängigen Playern durchsuchen, Liste anbieten und selber den Prozess starten.

Bernd
 
So, jetzt habe ich mal Eure Anmerkungen aufgegriffen (danke Bernd) und ein Programm geschrieben, das mir einige Erkenntnisse gebracht hat, aber der ursprüngliche Effekt ist stabil dubios.
Button SWT: ermittelt die Anwendung, die mit .avi-verknüpft ist und startet sie.
Button AWT: öffnet die .avi-Datei über Desktop open.
Es ist eine kleine, eigene Videodatei, die ich in c:\ gelegt habe.
Ergebnis:
- SWT klappt immer (auch bei Änderungen in der Datei-Zuordnung ohne Neustart des Programms)
- AWT reagiert je nach OS unterschiedlich:
-- XP: startet das "Standard-Programm", auch wenn die Zuordnung geändert ist (deshalb "immer" VLC)
-- Win7: machts richtig, außer mit Media Player (Zugriff verweigert)
Ich füge das Programm mal an.
Die Sache mit der Dateizuordnung Standard/Suffix kann ich bei Bedarf erklären. Ist aber etwas lang...

Java:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.reflect.Field;
import javax.swing.*;
import org.eclipse.swt.program.Program;

class AviTest {

    static final String FN_AVI = "c:\\Test.avi";
    static JLabel lbErr = new JLabel();
    static AppLabel lbApp;
    static int wApp, wErr;
    
	public static void main(String[] args) throws Exception {
				
	    final JFrame f = new JFrame("AVI Test");
	    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	    f.setLayout(null);
		
	    lbApp = new AppLabel(20, 20);
	    wApp = lbApp.update();
	    f.add(lbApp);
	    
		JButton btnSWT  = new JButton("SWT execute");
		btnSWT.addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent e) {
/*
 * 			SWT				
 */
		        wApp = lbApp.update();
			f.setSize(new Dimension(Math.max(wApp, wErr)+100, 200));
			lbApp.getAviApp().execute(FN_AVI);	}
		});
		btnSWT.setBounds(20, 50, 150, 30);
		f.add(btnSWT);
		
		lbErr.setLocation(20, 140);
		lbErr.setForeground(Color.RED);
		f.add(lbErr);
		
		JButton btnAWT = new JButton("AWT open");
		btnAWT.addActionListener(new ActionListener() {
		    @Override
		    public void actionPerformed(ActionEvent e) {
		    try { 
/*
* 			AWT				
*/
		        Desktop.getDesktop().open(new File(FN_AVI)); 
		        }
		        catch (IOException | IllegalArgumentException err) {
		            String s = err.getMessage();
		            wErr = lbErr.getFontMetrics(lbErr.getFont()).stringWidth(s);
			    f.setSize(new Dimension(Math.max(wApp, wErr)+100, 200));
		            lbErr.setSize(wErr, 20);
		            lbErr.setText(s); 
		        }
		    }
		});
		btnAWT.setBounds(20, 100, 150, 30);
		f.add(btnAWT);
		
		f.setSize(new Dimension(Math.max(wApp, wErr)+100, 200));
 		f.setVisible(true);
	}
}
 	class AppLabel extends JLabel {
		private static final long serialVersionUID = 1L;
		
		private Program aviApp;
 		private int x, y;
 		
 		AppLabel(int x, int y) {
 		    this.x = x;
 		    this.y = y;
 		}
 		
 		int update() {
 		    aviApp = Program.findProgram(".avi");
 		    Field commandField = null;
 		    String cmdText = null;
			try {
				commandField = Program.class.getDeclaredField("command");
			} catch (NoSuchFieldException | SecurityException e) {e.printStackTrace(); }
 		        commandField.setAccessible(true);
			try {
				cmdText = (String)commandField.get(aviApp);
			} catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); }
 		   	int w = getFontMetrics(getFont()).stringWidth(cmdText);
 		    setBounds(x, y, w, 20);
                   setText(cmdText);
                   return w;
 		}
 		
 		Program getAviApp() { return aviApp; };
 	}
 

Zurück
Oben