2

私は最近JavaFXPortsを試しており、それを使用してネイティブ Android アプリを構築しようとしています。私が構築しているアプリケーションでは、NFC サポートを焼き付けようとしていますが、これに関する情報はあまりないようです。私がこれまでに見つけた唯一の有用なガイドは、johanvosが彼の BitBucket Repo hereに書いたサンプル コードです。

私が今直面している問題は、このコード スニペットを使用することです。Netbeans は、私が参照しようとしている Android ライブラリが存在しないと報告し続けています。

これは私のコードの一部です:

package com.afropolymath.waitress;

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Screen;
import javafx.stage.Stage;
import android.content.Context;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.ReaderCallback;
import android.nfc.Tag;
import android.os.Bundle;
import javafxports.android.FXActivity;

public class Waitress extends Application implements ReaderCallback {
    private Stage stage;
    private StackPane rootLayout;

    @Override
    public void start(Stage stage) {
        this.stage = stage;
        this.initLayout();
        Context ctx = FXActivity.getInstance();
        NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(ctx);

        nfcAdapter.enableReaderMode(FXActivity.getInstance(), this, NfcAdapter.FLAG_READER_NFC_A, Bundle.EMPTY);
    }

    public void initLayout() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/RootLayout.fxml"));
            rootLayout = (StackPane) loader.load();

            Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds();

            Scene scene = new Scene(rootLayout, visualBounds.getWidth(), visualBounds.getHeight());

            stage.getIcons().add(new Image(Waitress.class.getResourceAsStream("/assets/icon.png")));

            stage.setScene(scene);
            stage.show();
        } catch (IOException e) {

        }
    }

    @Override
    public void onTagDiscovered(Tag tag) {

    }
}

そして、これらは私が得ているエラーです:

/Users/chidieberennadi/NetBeansProjects/Waitress/src/main/java/com/afropolymath/waitress/Waitress.java:12: error: package android.content does not exist
import android.content.Context;
                      ^
/Users/chidieberennadi/NetBeansProjects/Waitress/src/main/java/com/afropolymath/waitress/Waitress.java:13: error: package android.nfc does not exist
import android.nfc.NfcAdapter;
                  ^
/Users/chidieberennadi/NetBeansProjects/Waitress/src/main/java/com/afropolymath/waitress/Waitress.java:14: error: package android.nfc.NfcAdapter does not exist
import android.nfc.NfcAdapter.ReaderCallback;
                             ^
/Users/chidieberennadi/NetBeansProjects/Waitress/src/main/java/com/afropolymath/waitress/Waitress.java:15: error: package android.nfc does not exist
import android.nfc.Tag;
                  ^
/Users/chidieberennadi/NetBeansProjects/Waitress/src/main/java/com/afropolymath/waitress/Waitress.java:16: error: package android.os does not exist
import android.os.Bundle;
                 ^

何が問題だったのかについてのアイデアはありますか?

4

1 に答える 1

4

Johan Vos の NFC プロジェクトは機能しますが、メイン パッケージでの android と dalvik の依存関係の使用に基づいています。

dependencies {
    compile files("${ANDROID_HOME}/platforms/android-21/android.jar")
    compile "org.javafxports:jfxdvk:8u60-b3"
}

しかし JavaFXPorts は、異なるプラットフォームにデプロイできるプロジェクトを作成することを目的としているため、Gluon の NetBeans 用プラグインを使用してプロジェクトを作成すると、コードを配置するための 4 つの異なるフォルダーが見つかります。

  • すべてのプラットフォームで共有されるすべての共通コード用のソース パッケージ [Java]
  • Desktop/Java Packages、Java コード用、デスクトップでのみ実行可能
  • Java または Android コード用の Android/Java パッケージ (Android でのみ実行可能)
  • Java コード用の iOS/Java パッケージは、iOS でのみ実行できます。

また、プロジェクトの依存関係を確認すると、android.jarAndroid でのみ使用できることがわかります。

これは、メイン パッケージに通常のプロジェクトを作成し、Android 部分のみを Android パッケージに追加する必要があることを意味します。Android クラスを呼び出すには、そのインスタンスを作成するためのメカニズムをメイン パッケージに提供する必要があります。

HelloPlatformサンプルPlatformServiceを確認すると、 はプラットフォームに応じてクラスをロードするために使用され、PlatformProviderはメイン パッケージから呼び出すことができるメソッドとのインターフェイスであることがわかりますが、それぞれに実装が与えられます。プラットホーム。

このアイデアでClass.forName()は、サービスの代わりに使用して、Gluon Charm-Downライブラリはさまざまなネイティブ サービスを実装します。

詳細については、GoNative のサンプル投稿もご覧ください。

Android 用の NFC などの新しいサービスを実装する場合は、これらのクラスが必要になる可能性があります。

メインパッケージ

NFCプラットフォーム

public abstract class NFCPlatform {

    public abstract NFCService getNFCService();

}

NFCサービス

public interface NFCService {

    boolean isAvailable();

    boolean isEnabled();

    StringProperty tagIdProperty();

    // other methods

}

Android パッケージ

AndroidNFCプラットフォーム

public class AndroidNFCPlatform extends NFCPlatform {

    private AndroidNFCService nfcService;

    @Override
    public NFCService getNFCService() {
        if (nfcService == null) {
            nfcService = new AndroidNFCService();
        }
        return nfcService;
    }

}

AndroidNFCサービス

NFC サービスの実装。ここでは Android API を使用できます。NetBeans は文句を言いません。

これは最小限の実装です:

public class AndroidNFCService implements NFCService, ReaderCallback {

    private final NfcAdapter nfcAdapter;
    private StringProperty tagId;

    public AndroidNFCService() {
        NfcManager manager = (NfcManager) FXActivity.getInstance().getSystemService(FXActivity.NFC_SERVICE);
        nfcAdapter = manager.getDefaultAdapter();
    }

    @Override
    public boolean isAvailable() {
        return nfcAdapter != null;
    }

    @Override
    public boolean isEnabled() {
        return isAvailable() && nfcAdapter.isEnabled();
    }

    @Override
    public StringProperty tagIdProperty() {
        if (tagId == null) {
            tagId = new SimpleStringProperty();
        }
        return tagId;
    }

    @Override
    public void onTagDiscovered(Tag tag) {
        Platform.runLater(() -> 
            tagIdProperty().set(new String(tag.getId())));
    }

}

最後に、 のインスタンスを取得すると、メイン クラスでこのサービスを使用できますNFCPlatform

public static NFCPlatform getNFCPlatform() {
    try {
        if ("android".equals(System.getProperty("javafx.platform", "desktop"))) {
            return (NFCPlatform) Class.forName("<your package>.AndroidNFCPlatform").newInstance();
        }
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
        System.out.println("Error " + ex);
    }
    return null;
}

@Override
public void start(Stage stage) {

    NFCService nfcService = getNFCPlatform().getNFCService();

    if (nfcService != null) {
        System.out.println("Available: " + nfcService.isAvailable());

        ...
    }
}
于 2016-01-10T18:28:05.713 に答える