Я пытаюсь написать 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 г.