我对三星设备有问题。我的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阅读器的问题