Android Kotlin - Как прочитать тег NFC внутри Activity - PullRequest
0 голосов
/ 11 октября 2018

Я нашел несколько недавних сообщений о чтении тегов NFC с Android.Я пришел к выводу, что выполнение действия чтения NFC запускает отдельное намерение.

Чего я хочу достичь, так это того, что only моя текущая деятельность - чтение сообщения NDEF из тега NFCв текстовом / обычном формате.

Итак, первый вопрос: обязательно ли указывать фильтр намерений в моем манифесте?

<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />

<category android:name="android.intent.category.DEFAULT" />

<data android:mimeType="text/plain" />

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

Второй вопрос: Как мне сохранить логику / функции чтения NFC, связанные с моим приложением / деятельностью?

После

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

я перехожу к своей текущей активности и инициализирую адаптер NFC onCreate:

mNfcAdapter = NfcAdapter.getDefaultAdapter(this)

Каким будет следующий шаг для чтения сообщения NDEF тега nfc?На переднем плане диспетчеризации нашел что-то связанное с намерением:

 @Override
protected void onNewIntent(Intent intent) { 

    handleIntent(intent);
}

Было бы неплохо, если у кого-то есть идея / пример (Kotlin), как просто прочитать NFC-тег из действия без , напримерзапуск / передача NFC-действий.

В iOS, например, существует простой сеанс NFC, когда это необходимо в VC.

1 Ответ

0 голосов
/ 11 октября 2018

Правильно, если вы хотите получать теги только тогда, когда ваш Activity находится на переднем плане, вы можете зарегистрироваться для этого во время выполнения.То, что вы ищете, это метод enableForegroundDispatch на NfcAdapter.Вы можете зарегистрировать PendingIntent для определенных типов тегов, к которым вы хотите фильтровать, и ваш Activity будет получать Intent в onNewIntent() при обнаружении тега.

Быстрый пример того, как это будет выглядеть в Kotlin, если вы ищете только IsoDep совместимые теги NFC:

override fun onResume() {
    super.onResume()

    NfcAdapter.getDefaultAdapter(this)?.let { nfcAdapter ->
        // An Intent to start your current Activity. Flag to singleTop
        // to imply that it should only be delivered to the current 
        // instance rather than starting a new instance of the Activity.
        val launchIntent = Intent(this, this.javaClass)
        launchIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)

        // Supply this launch intent as the PendingIntent, set to cancel
        // one if it's already in progress. It never should be.
        val pendingIntent = PendingIntent.getActivity(
            this, 0, launchIntent, PendingIntent.FLAG_CANCEL_CURRENT
        )

        // Define your filters and desired technology types
        val filters = arrayOf(IntentFilter(ACTION_TECH_DISCOVERED))
        val techTypes = arrayOf(arrayOf(IsoDep::class.java.name))

        // And enable your Activity to receive NFC events. Note that there
        // is no need to manually disable dispatch in onPause() as the system
        // very strictly performs this for you. You only need to disable 
        // dispatch if you don't want to receive tags while resumed.
        nfcAdapter.enableForegroundDispatch(
            this, pendingIntent, filters, techTypes
        )
    }
}

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)

    if (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action) {
        val tag = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG)
        IsoDep.get(tag)?.let { isoDepTag ->
            // Handle the tag here
        }
    }
}
...