13

我想将文件类型与之关联的应用程序包中有一个 Java 应用程序。

例如,如果有一个文件

foo.example

当双击该文件或任何具有 .example 扩展名的文件时,我希望我的应用程序启动并打开该文件。我还希望文件有我的应用程序的图标。

我想通过编辑 info.plist 文件来做到这一点,但它似乎不起作用。

另外,我的 Java 应用程序如何知道传递给它的文件是什么?

4

2 回答 2

8

以下是需要做的事情:

第一部分:

首先,您必须进行设置,以便 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 方法中的所有内容,然后触发该事件。因此,在同一线程的 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
            }
        }

    });
}

完成此操作后,您的应用程序将处理在您的应用程序启动之前和您的应用程序启动之后打开的文档文件。

于 2014-07-11T00:35:46.443 回答