首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JavaFX端口的Android上的NFC

使用JavaFX端口的Android上的NFC
EN

Stack Overflow用户
提问于 2016-01-10 12:56:39
回答 1查看 496关注 0票数 2

我最近一直在试验JavaFXPorts,我一直试图用它来构建一个本地的安卓应用程序。对于我正在构建的应用程序,我试图在NFC支持中进行烘焙,但似乎没有太多关于这方面的信息。到目前为止,我发现的唯一有用的指南是乔汉沃斯在他的BitBucket Repo 这里上编写的一些示例代码。

我现在面临的问题是使用这个代码片段,Netbeans不断报告我试图引用的android库不存在。

这是我的一些代码:

代码语言:javascript
复制
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) {

    }
}

这些都是我所犯的错误:

代码语言:javascript
复制
/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;
                 ^

对什么可能是问题有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-10 18:28:05

虽然Johan Vos的NFC项目可以工作,但它基于对主包的android和dalvik依赖关系:

代码语言:javascript
复制
dependencies {
    compile files("${ANDROID_HOME}/platforms/android-21/android.jar")
    compile "org.javafxports:jfxdvk:8u60-b3"
}

但是JavaFXPorts它的目的是创建可以部署在不同平台上的项目,所以现在如果您使用NetBeans的胶子插件创建一个项目,您将发现四个不同的文件夹来放置代码:

  • 源代码包Java,用于所有公共代码,与所有平台共享
  • 桌面/ Java包,用于Java代码,只能在桌面上运行
  • Android/Java包,用于Java或Android代码,只能在Android上运行
  • Ios/Java包,对于Java代码来说,只能在iOS上运行。

另外,如果您检查项目依赖项,您会注意到android.jar只对Android可用。

这意味着您应该在主包上创建常规项目,并且只在android包中添加Android部分。为了调用android类,您需要在主包上提供一些机制来创建该类的实例。

如果您检查HelloPlatform 示例,您会注意到根据平台使用PlatformService来加载类,而PlatformProvider是一个接口,它可以从主包调用方法/s,但是会将实现提供给每个平台。

有了这个想法,但是使用Class.forName()而不是服务,胶子魅力-堕落库实现了不同的本地服务。

您还可以查看GoNative 示例帖子,并对其进行详细解释。

如果您想要实现一个新的服务,比如用于Android的NFC,这些是可能需要的类。

主包

NFCPlatform

代码语言:javascript
复制
public abstract class NFCPlatform {

    public abstract NFCService getNFCService();

}

NFCService

代码语言:javascript
复制
public interface NFCService {

    boolean isAvailable();

    boolean isEnabled();

    StringProperty tagIdProperty();

    // other methods

}

Android软件包

AndroidNFCPlatform

代码语言:javascript
复制
public class AndroidNFCPlatform extends NFCPlatform {

    private AndroidNFCService nfcService;

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

}

AndroidNFCService

NFC服务的实现。这里我们可以使用Android。NetBeans不会抱怨。

这是一个最低限度的实现:

代码语言:javascript
复制
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实例,就可以在主类上使用该服务。

代码语言:javascript
复制
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());

        ...
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34705617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档