代码之家  ›  专栏  ›  技术社区  ›  David

NFC阅读器在应用程序关闭时以及Pixel、小米等设备上运行良好,但三星除外

  •  0
  • David  · 技术社区  · 8 月前

    我对三星设备有问题。我的NFC阅读器在Pixels和小米上都能完美工作,无论是否打开应用程序。然而,在三星设备上,它只能在应用程序关闭时工作。打开应用程序时,我没有在logcat上检测到NFC标签。 这里是我的NFCM经理:

    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<IntentFilter>
    
    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)
            }
        }
    
        intentFiltersArray = arrayOf(ndef, techDetected, tagDetected)
    }
    
    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)
    }
    

    我在简历上启用了此管理器,在暂停时禁用了它。

    我的清单:

    <uses-permission android:name="android.permission.NFC" /> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" />  
              <data android:mimeType="*/*" />
            </intent-filter>
    
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
    
                <data android:host="${deepLinkUri}" />
    
                <data android:pathPrefix="/c/" />
    
                <data android:scheme="https" />
            </intent-filter>
    
            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/techlist" />`
    

    这里真的需要一些帮助,因为我不理解这种奇怪的行为。我尝试了一个阅读器NFC应用程序,没有检测到问题。

    我需要一些帮助来找出三星设备上NFC阅读器的问题

    1 回复  |  直到 8 月前
        1
  •  0
  •   Andrew    8 月前

    据报道,在某些设备上,NFC无法与相机同时工作,尤其是在三星设备上。

    据信,这是硬件制造商的选择,可能是NFC无线电波干扰了非常大和敏感的摄像头芯片吗?