У меня проблема с устройствами Samsung. Мой NFC-ридер отлично работает на Pixels, Xiaomi с открытым приложением и без него. Однако на устройствах Samsung это возможно только при закрытом приложении. Когда приложение открыто, я не вижу, чтобы тег NFC был обнаружен в logcat.
Вот мой NFCManager:
Очень нужна помощь, потому что я не понимаю этого странного поведения. Я пробую приложение для чтения NFC, проблем не обнаружено.
Мне нужна помощь в выяснении проблемы с устройством чтения NFC на устройствах Samsung
У меня проблема с устройствами Samsung. Мой NFC-ридер отлично работает на Pixels, Xiaomi с открытым приложением и без него. Однако на устройствах Samsung это возможно только при закрытом приложении. Когда приложение открыто, я не вижу, чтобы тег NFC был обнаружен в logcat. Вот мой NFCManager: [code]class NFCManager( val context: Context, private val onTagReadCallback: (String) -> Unit = {} ) { private var isNFCToastShown: Boolean = false private var mNfcAdapter: NfcAdapter? = null private var lastLink: String? = null lateinit var pendingIntent: PendingIntent lateinit var intentFiltersArray: Array
fun init(activity: AppCompatActivity) {
mNfcAdapter = NfcAdapter.getDefaultAdapter(activity) val intent = Intent(activity, javaClass).apply { addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) } pendingIntent = PendingIntent.getActivity( activity, 0, intent, PendingIntent.FLAG_MUTABLE ) val ndef = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply { try { addDataType("*/*") /* Handles all MIME based dispatches. You should specify only the ones that you need. */ } catch (e: IntentFilter.MalformedMimeTypeException) { throw RuntimeException("fail", e) } } val techDetected = IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED).apply { try { addDataType("*/*") /* Handles all MIME based dispatches. You should specify only the ones that you need. */ } catch (e: IntentFilter.MalformedMimeTypeException) { throw RuntimeException("fail", e) } } val tagDetected = IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED).apply { try { addDataType("*/*") /* Handles all MIME based dispatches. You should specify only the ones that you need. */ } catch (e: IntentFilter.MalformedMimeTypeException) { throw RuntimeException("fail", e) } }
private fun handleLink(link: String) { if (link != lastLink) { lastLink = link Handler(Looper.getMainLooper()).postDelayed({ lastLink = null }, 4000) Timber.d("NFC NFCManager onShowTransaction : " + link) link.let(onTagReadCallback) } }
fun enableNFC(activity: AppCompatActivity) { Timber.d("NFC enable nfc") if (mNfcAdapter == null) { init(activity) } if (mNfcAdapter != null) { if (!mNfcAdapter!!.isEnabled) { // Nfc is disabled } mNfcAdapter!!.enableReaderMode(activity, { val ndef = Ndef.get(it) if (ndef != null) { ndef.connect() val ndefMessage = ndef.ndefMessage if (ndefMessage != null) { val records = ndefMessage.records for (record in records) { if (record.toUri() != null) { val link = record.toUri().toString() handleLink(link) } } } ndef.close() } else { Handler(Looper.getMainLooper()).postDelayed({ Toast.makeText( activity, activity.getString(R.string.nfc_manager_wrong_nfc_format), Toast.LENGTH_SHORT ).show() }, 100) } }, NfcAdapter.FLAG_READER_NFC_A, Bundle.EMPTY) mNfcAdapter!!.enableForegroundDispatch( activity, pendingIntent, intentFiltersArray, arrayOf( arrayOf( Ndef::class.java.name, NfcV::class.java.name, NfcF::class.java.name, NfcA::class.java.name, NfcB::class.java.name ) ) ) } else { /* if (!isNFCToastShown) { Toast.makeText( activity, activity.getString(R.string.nfc_manager_no_nfc_module), Toast.LENGTH_SHORT ).show() isNFCToastShown = true }
*/ } }
fun disableNFC(activity: AppCompatActivity) { Timber.d("NFC disable nfc") mNfcAdapter?.disableForegroundDispatch(activity) mNfcAdapter?.disableReaderMode(activity) } [/code] Я включил этот менеджер при возобновлении и отключил его при паузе. Мой манифест: [code]
` [/code] Очень нужна помощь, потому что я не понимаю этого странного поведения. Я пробую приложение для чтения NFC, проблем не обнаружено. Мне нужна помощь в выяснении проблемы с устройством чтения NFC на устройствах Samsung