13

ファイル タイプを関連付けたいアプリケーション バンドルに Java アプリケーションがあります。

たとえば、ファイルがある場合

foo.example

そのファイル、または拡張子が .example の任意のファイルをダブルクリックすると、アプリケーションが起動してそのファイルを開くようにします。また、ファイルにアプリケーションのアイコンを付けたいと思っています。

info.plist ファイルを編集してこれを行いたいのですが、うまくいかないようです。

また、Java アプリケーションはどのファイルが渡されたかをどのように認識しますか?

4

2 に答える 2

8

実行する必要があるのは次のとおりです。

パート 1:

まず、.example拡張機能をアプリに関連付ける必要があることを OS X が認識できるように、設定を行う必要があります。これは、アプリの Info.plist ファイルを使用して行います。ただし、Java コードを既に.appパッケージにバンドルしている場合に限ります (その方法については、他の質問を参照してください)。

この例は、Info.plist ファイルに何を追加するかを正確に示しています (この例は iOS 用ですが、OS X でもまったく同じように機能することに注意してください)。内容は重複しませんが、要するに、次の 2 つのキーを追加する必要があります。

  • CFBundleDocumentTypes: アプリで開くことができるドキュメントの種類を OS X に知らせます。
  • UTExportedTypeDeclarations: このアプリに固有のカスタム ドキュメント タイプ (この場合は.exampleファイル) について OS X に通知します。

上記のキーとほぼ同じことを行うキーがいくつかありますがCFBundleTypeExtensions、OS 10.5 以降は廃止されているため、Apple がそれらを完全に削除する場合に備えて、それらを使用したくないことに注意してください。

これらすべてを追加しても、ファイル タイプの関連付けが機能していないように見える場合は、問題を知らせるターミナル ツールであるlsregister を使用して問題のデバッグを試みることができます。エラーが発生しない場合は、すべてが設定されているはずです。

パート2:

末尾.exampleが .

アプリは type のイベントを受け取りcom.apple.eawt.AppEvent.OpenFilesEventます。これを処理する必要があります。Java アプリが起動する前にトリガーされたイベントをどのように処理するのか自問するかもしれませんが、Java は最初にアプリのメイン メソッドですべてを実行してからイベントを発生させるようです。したがって、同じスレッドのメイン メソッドのどこかに、次のコードを使用してリスナーを作成します。

//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 に答える