Дважды щелкните файл документа в 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
            }
        }

    });
}

После этого ваше приложение будет обрабатывать оба файла документов, которые были открыты до его запуска и после запуска.

Другие вопросы по тегам