我在应用程序包中有一个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方法中执行所有操作然后触发事件.因此,在同一线程的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
}
}
});
}
执行此操作后,您的应用将处理在您的应用启动之前和应用启动之后打开的文档文件.
标签:file-association,java,macos
来源: https://codeday.me/bug/20190926/1818665.html