2016-01-10 3 views
2

Я недавно экспериментировал с JavaFXPorts, и я пытался использовать его для создания собственного приложения для Android. Для приложения, которое я создаю, я пытаюсь испечь поддержку NFC, но здесь не так много информации об этом. Единственным полезным руководством, которое я нашел до сих пор, был код примера, написанный johanvos на его реплике BitBucket here.NFC на Android с использованием портов JavaFX

Проблема, с которой я столкнулся сейчас, заключается в использовании этого фрагмента кода, 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

Хотя работа по проекту NFC Йохан Восом, он основан на использовании андроида и Dalvik зависимости от основного пакета:

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

Но JavaFXPorts он предназначен для создания проектов, которые могут быть развернуты на различных платформах, так что теперь, если вы создаете проект, используя плагин глюонного для NetBeans, вы найдете четыре различных папки, чтобы поместить код:

  • Источник пакеты [Java], для всех общего кода, совместно со всеми платформами
  • Desktop/Java пакеты для Java кода, только работает на рабочем столе
  • Android/Java пакеты, для Java или Android код, доступный только работает на Android
  • Ios/Java пакеты для Java кода, только работает на IOS.

Также, если вы проверяете зависимости проекта, вы заметите, что android.jar доступен только для Android.

Это означает, что вы должны создать свой обычный проект в основном пакете и добавить в Android пакет только номер телефона . Чтобы вызвать класс android, вам необходимо предоставить некоторый механизм для основного пакета, чтобы создать его экземпляр.

Если вы проверяете HelloPlatform sample, вы заметите, что PlatformService используется для загрузки классов в зависимости от платформы, в то время как PlatformProvider интерфейс с методом/с, которые могут вызываться из основного пакета, но будет имеют реализацию, предоставляемую каждой платформе.

С этой идеей, но используя Class.forName() вместо службы, библиотека Gluon Charm-Down реализует различные собственные службы.

Вы также можете посмотреть GoNative sample и post, что объясняет это подробно.

Если вы хотите внедрить новую услугу, такую ​​как NFC для Android, , это необходимые классы.

Главная пакет

NFCPlatform

public abstract class NFCPlatform { 

    public abstract NFCService getNFCService(); 

} 

NFCService

public interface NFCService { 

    boolean isAvailable(); 

    boolean isEnabled(); 

    StringProperty tagIdProperty(); 

    // other methods 

} 

Android Пакет

AndroidNFCPlatform

public class AndroidNFCPlatform extends NFCPlatform { 

    private AndroidNFCService nfcService; 

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

} 

AndroidNFCService

Ваша реализация сервиса 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()); 

     ... 
    } 
} 
+0

Hey José Pereda, это очень полезно. Очень подробно. В настоящее время я пытаюсь реализовать это. Я расскажу вам, когда он работает. Благодарю. – chidieberennadi

Смежные вопросы