Как запустить считывание NFC-меток с экранов

Я пытаюсь написать code, чтобы мое приложение для Android могло считывать/записывать теги NFC с экрана. Я использую Kotlin и Jetpack Compose. У меня есть один MainActivity.kt и два экрана: HomeScreen.kt и NFCReader.kt. Кнопка на HomeScreen.kt откроет NFCReader.kt, а кнопка на NFCReader.kt запустит процесс чтения/записи.

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

Ниже приведен мой code для DisposableEffect. Я проверял logcat после каждого запуска и не смог найти log, поэтому я считаю, что я мог неправильно реализовать эффект? Пожалуйста, помогите, ТИА.

@Composable
fun NFCReader(
    lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
) {
    val nfcAdapter = NfcAdapter.getDefaultAdapter(activity)
    val activity = LocalContext.current.getActivity() as ComponentActivity
    val context = LocalContext.current

    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { _, event ->
            if (event == Lifecycle.Event.ON_RESUME) {
                Log.d("TAG_", "turn on NFC reader here")
                val pendingIntent = PendingIntent.getActivity(
                    activity, 0, Intent(activity, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
                    PendingIntent.FLAG_MUTABLE
                )
                val intentFilters = arrayOf<IntentFilter>(
                    IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED),
                    IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED),
                    IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED)
                )
                nfcAdapter.enableForegroundDispatch(activity, pendingIntent, intentFilters, null)
            }
            if (event == Lifecycle.Event.ON_PAUSE) {
                Log.d("TAG_", "turn off NFC reader")
                nfcAdapter.disableForegroundDispatch(activity)
            }
        }
        lifecycleOwner.lifecycle.addObserver(observer)

        val listener = Consumer<Intent> {
            // Do something
            Log.d("TAG_", "inside listener")
        }
        activity.addOnNewIntentListener(listener)
        onDispose {
            activity1.removeOnNewIntentListener(listener)
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    }
}
Ираида
Вопрос задан23 марта 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.