Проблема с приемником NFC - PullRequest
2 голосов
/ 16 апреля 2011

Я хочу, чтобы мое приложение прослушивало теги nfc только при активации. Для этого я попытался зарегистрировать слушателя NFC следующим образом, но безуспешно.

IntentFilter filter = new IntentFilter("android.nfc.action.TECH_DISCOVERED"); 
registerReceiver(nfcTagListener, filter); 

BroadcastReceiver nfcTagListener = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) { 
            String action = intent.getAction(); 

            if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { 
                Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
                Log.d("nfc", "" + tag.getId());     
            }
        }
    };

Я также пытался объявить намерение в моем манифесте, следуя apidemos, и отлично работает, он запускает мою деятельность и получает идентификатор тега nfc. Но это не то, что я хочу, я хочу определять идентификатор тега только тогда, когда я нахожусь внутри этого действия. Я думаю, что это может быть связано со следующей строкой, включенной в демоверсии API. Но я не знаю, как это сделать программно

      <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/filter_nfc"> 

Есть подсказка?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 19 апреля 2011

Попробуйте использовать Foreground Dispatch System.

Чтобы включить его, в методе onCreate действия вы должны подготовить некоторые материалы:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

, после этого создайте IntentFilters (в моем примере все действия обрабатываются с использованием Intent Filters):

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("*/*");
    } catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }

    IntentFilter tech = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
    try {
        tech.addDataType("*/*");
    } catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }

    IntentFilter[] intentFiltersArray = new IntentFilter[] { tag, ndef, tech };

после этого вам понадобится массив String для поддержки поддерживаемых технологий:

    String[][] techList = new String[][] { new String[] { NfcA.class.getName(),
            NfcB.class.getName(), NfcF.class.getName(),
            NfcV.class.getName(), IsoDep.class.getName(),
            MifareClassic.class.getName(),
            MifareUltralight.class.getName(), Ndef.class.getName() } };

в методе onResume, вы должны включить метод отправки переднего плана:

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList);

и отключите в onPause:

@Override
protected void onPause() {
    super.onPause();
    nfcAdapter.disableForegroundDispatch(this);
}

Таким образом, вы успешно инициализировали необходимый механизм.Чтобы обработать полученное намерение, вы должны переопределить метод onNewIntent (намерение намерения).

@Override
public void onNewIntent(Intent intent) {
    String action = intent.getAction();

    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
        // reag TagTechnology object...
    } else if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
        // read NDEF message...
    } else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {

    }
}

Примечание: если вы хотите обрабатывать намерения только с помощью диспетчеризации переднего плана, не включайте систему отправки намерений в файле манифеста,просто дайте правильные разрешения для вашего приложения там.

Надеюсь, это поможет.

0 голосов
/ 27 ноября 2012

Если вы не хотите использовать режим переднего плана, вы всегда можете программно включить или отключить фильтры намерений.

Проект NDEF Tools для Android имеет рабочий образец с использованием режима переднего плана, а также обнаруживает

  1. Поддержка устройств NFC
  2. NFC включен / отключен при запуске активности или позже изменен
  3. Включение / отключение NFC push при запуске активности или позже изменено
...