Дважды щелкните файл документа в Mac OS X, чтобы открыть приложение Java
У меня есть Java-приложение в комплекте приложений, с которым я хочу связать тип файла.
Например, если есть файл
foo.example
если дважды щелкнуть этот файл или любой файл с расширением.example, я хочу, чтобы мое приложение запустило и открыло файл. Я также хочу, чтобы файлы имели значок моего приложения.
Я хотел бы сделать это, отредактировав файл info.plist, но, похоже, он не работает.
Кроме того, как мое Java-приложение узнает, какой файл ему передан?
2 ответа
Вот что нужно сделать:
Первая часть:
Сначала вы должны настроить все так, чтобы OS X знала, что .example
расширение должно быть связано с вашим приложением. Это делается с помощью файла Info.plist вашего приложения, при условии, что вы уже связали свой код Java в .app
пакет (см. другие вопросы о том, как это сделать).
В этом примере показано, что именно нужно добавить в файл Info.plist (обратите внимание, что, хотя пример для iOS, он точно так же работает на OS X). Я не буду дублировать то, что он говорит, но вкратце, вы должны добавить два ключа:
CFBundleDocumentTypes
: Позволяет OS X знать тип документов, которые могут быть открыты приложениемUTExportedTypeDeclarations
: Сообщает OS X о пользовательском типе документа, специфичном для этого приложения, который в данном случае.example
файлы
Обратите внимание, что есть несколько ключей, таких как CFBundleTypeExtensions
это делает то же самое, что и ключи выше, но они устарели начиная с OS 10.5, поэтому вы не хотите использовать их в случае, если Apple полностью их удалит.
Если вы добавите все это, и сопоставление типов файлов, похоже, не работает, вы можете попытаться отладить проблему с помощью lsregister, инструмента терминала, который сообщит вам о любых проблемах. Если он возвращается без ошибок, то все должно быть настроено.
Часть вторая:
Теперь, когда OS X откроет ваше приложение, когда вы дважды щелкните файл, заканчивающийся на .example
Вы должны сообщить своему Java-приложению, как обрабатывать открываемый файл.
Ваше приложение будет получать событие типа com.apple.eawt.AppEvent.OpenFilesEvent
, который вам нужно будет обработать. Вы можете спросить себя, как вы обрабатываете событие, инициируемое еще до запуска приложения Java, но кажется, что Java сначала выполняет все в основном методе приложения, а затем запускает событие. Итак, где-нибудь в методе main в том же потоке создайте слушатель со следующим кодом:
//First, check for if we are on OS X so that it doesn't execute on
//other platforms. Note that we are using contains() because it was
//called Mac OS X before 10.8 and simply OS X afterwards
if (System.getProperty("os.name").contains("OS X")){
Application a = Application.getApplication();
a.setOpenFileHandler(new OpenFilesHandler() {
@Override
public void openFiles(OpenFilesEvent e) {
for (File file : e.getFiles()){
//Handle your file however you'd like
}
}
});
}
После этого ваше приложение будет обрабатывать оба файла документов, которые были открыты до его запуска и после запуска.