我在应用程序包中有一个 Java 应用程序,我想将其与文件类型相关联。
例如,如果有一个文件
foo.example
当双击该文件或任何具有 .example 扩展名的文件时,我希望我的应用程序启动并打开该文件。我还希望这些文件具有我的应用程序的图标。
我想通过编辑 info.plist 文件来完成此操作,但它似乎不起作用。
此外,我的 Java 应用程序如何知道传递给它的文件是什么?
最佳答案
这里是需要做的事情:
第一部分:
首先,您必须进行设置,以便 OS X 知道 .example
扩展名应该与您的应用相关联。这是通过应用的 Info.plist 文件完成的,前提是您已经将 Java 代码捆绑到 .app
包中(请参阅其他问题以了解如何执行此操作)。
This example向您确切显示要添加到 Info.plist 文件中的内容(请注意,尽管该示例是针对 iOS 的,但它在 OS X 上的工作方式完全相同)。我不会重复它所说的内容,但简而言之,您必须添加两个键:
CFBundleDocumentTypes
:让 OS X 知道应用程序可以打开的文档类型UTExportedTypeDeclarations
:告诉 OS X 有关此应用程序特定的自定义文档类型,在本例中为.example
文件
请注意,有许多键(例如 CFBundleTypeExtensions
)与上述键的作用大致相同,但自 OS 10.5 以来它们已被弃用,因此您不想使用以防 Apple 完全删除它们。
如果你添加了所有这些并且文件类型关联似乎不起作用,你可以尝试 debug the problem using lsregister ,一个终端工具,可以让您了解任何问题。如果它返回时没有错误,那么一切都应该设置好了。
第二部分:
现在,当您双击以 .example
结尾的文件时,OS X 将打开您的应用程序,您必须让您的 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
}
}
});
}
执行此操作后,您的应用将处理在您的应用启动之前和应用启动之后打开的文档文件。
关于java - 在 Mac OS X 中双击文档文件打开 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1575190/