Подключение к NFC-смарт-карте

Для работы с NFC-адаптером используется класс JCSNFCSession.

Проверка состояния NFC-адаптера мобильного устройства

Для проверки состояния NFC-адаптера используется метод JCSNFCSession.state.

JCSNFCSession nfcSession = null;

JCSNFCSessionState state = JCSNFCSession.state(this);
if(state == JCSNFCSessionState.Unsupported) {
   // NFC-адаптер отсутствует на мобильном устройстве
}
else if(state == JCSNFCSessionState.Disabled) {
   // NFC-адаптер выключен
   // Показать сообщение о необходимости включить NFC-адаптер
}
else {
   // NFC-адаптер доступен для использования
   // Создать экземпляр JCSNFCSession
   nfcSession = new JCSNFCSession();
}

Отображение окна настроек NFC-адаптера

В том случае, если NFC-адаптер на мобильном устройстве выключен, можно открыть окно настроек NFC мобильного устройства, чтобы пользователь мог включить NFC-адаптер.

Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);
startActivity(intent);

Подключение к NFC смарт-карте

Для подключения к NFC смарт-карте используются методы: JCSNFCSession.open, JCSNFCSession.close, JCSNFCSession.enableForegroundDispatch, JCSNFCSession.disableForegroundDispatch, JCSNFCSession.processIntent, JCSDevice.close.

Примечание

Для Activity, которое используется для детектирования подключения NFC смарт-карты, в файле манифеста (AndroidManifest.xml) значение параметра android:launchMode должно быть singleTask или singleInstance.

public class MainActivity extends AppCompatActivity {

   private JCSNFCSession nfcSession = null;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      // Создать экземпляр JCSNFCSession
      nfcSession = new JCSNFCSession();

      // Подключиться к NFC смарт-карте
      openDevice(device -> {
         try {
            // Выполнить операции со смарт-картой
         }
         finally {
            // Закрыть подключение к смарт-карте
            device.close();
         }
      });
   }

   private void openDevice(Consumer<JCSDevice> consumer) {

      // Начать ожидание подключения к NFC смарт-карте
      nfcSession.open((device, error) -> {

         // Закончить ожидание подключения к NFC смарт-карте
         nfcSession.close();

         if(error != null) {
            // Произошла ошибка при подключении к смарт-карте
            return;
         }

         // Произошло успешное подключение к смарт-карте

         // Выполнить операции со смарт-картой
         consumer.accept(device);
      });

   }

   @Override
   public void onDestroy() {
      super.onDestroy();

      if(nfcSession != null) {
         // Закончить ожидание подключения к NFC смарт-карте
         nfcSession.close();

         nfcSession = null;
      }
   }

   @Override
   public void onResume() {
      super.onResume();

      if(nfcSession != null) {
         nfcSession.enableForegroundDispatch(this);
      }
   }

   @Override
   public void onPause() {
      super.onPause();

      if(nfcSession != null) {
         nfcSession.disableForegroundDispatch();
      }
   }

   @Override
   public void onNewIntent(Intent intent) {
      super.onNewIntent(intent);

      if(nfcSession != null) {
         nfcSession.processIntent(intent);
      }
   }

}