Считыватель NFC отлично работает, когда приложение закрыто и на таких устройствах, как Pixel, Xiaomi, но не Samsung.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Считыватель NFC отлично работает, когда приложение закрыто и на таких устройствах, как Pixel, Xiaomi, но не Samsung.

Сообщение Anonymous »

У меня проблема с устройствами Samsung. Мой NFC-ридер отлично работает на Pixels, Xiaomi с открытым приложением и без него. Однако на устройствах Samsung это возможно только при закрытом приложении. Когда приложение открыто, я не вижу, чтобы тег NFC был обнаружен в logcat.
Вот мой NFCManager:

Код: Выделить всё

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)
}
}

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)
}
Я включил этот менеджер при возобновлении и отключил его при паузе.
Мой манифест: Очень нужна помощь, потому что я не понимаю этого странного поведения. Я пробую приложение для чтения NFC, проблем не обнаружено.
Мне нужна помощь в выяснении проблемы с устройством чтения NFC на устройствах Samsung

Подробнее здесь: https://stackoverflow.com/questions/793 ... xiaomi-but
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»