NF C включен, но адаптер не включен - PullRequest
1 голос
/ 17 января 2020

Я работаю над проектом android, где NF C используется в качестве сообщения. Я сталкиваюсь со странной проблемой, когда мобильное устройство имеет NF C, оно включено, но оно не работает на некоторых устройствах (адаптер не включен при отладке). Я пишу журналы, и он печатает, NF C, адаптер отключен. Например: HT C Один m9 (OS 7.0). Также происходит с OnePlus One (OS 9)! Но опять же, это работает на других устройствах. Вы испытывали ту же проблему?

Вот код:

object NfcUtil {

    fun getNfcAdapter(c: Context): NfcAdapter? {
        val manager = c.getSystemService(Context.NFC_SERVICE) as NfcManager
        return manager.defaultAdapter
    }

    fun doesSupportHce(c: Context): Boolean {
        return c.packageManager.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
    }
}



val adapter = NfcUtil.getNfcAdapter(this)
if (adapter != null && NfcUtil.doesSupportHce(this)) {
     if (adapter.isEnabled) {
             tvNfcOff.extHide()
              } else {
                 tvNfcOff.extShow()
              }
     }

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Я думаю, что если NFC поддерживается и включается, но adapter отключен (https://developer.android.com/reference/android/nfc/NfcAdapter#isEnabled () ), я буду следовать указаниям и перенаправлять пользователя на экран настроек с помощью намерение, указанное в документации.

Если пользователь несколько раз возвращался, вы могли отслеживать его и показывать другое сообщение вместо перенаправления в настройки, что-то вроде: NF C не работает должным образом на вашем устройстве. Я бы проверил, есть ли у вас много пользователей, использующих эти устройства, и если да, я постараюсь узнать больше об операционной системе и устройстве, имеющих эту проблему.

А позже я просто попытаюсь отладить его с помощью это устройство и этот спецификатор c Operating System, который имеет такого рода проблемы. Я попытаюсь выяснить, есть ли у других приложений, использующих NF C, те же проблемы или они работают нормально, и под работой я имею в виду, что общение происходит не из-за того, что другие приложения не отображают всплывающих сообщений с предупреждением / ошибкой. * И если я обнаружу ее проблему в указанной c версии ОС, также с другими приложениями, я просто попытаюсь проинформировать пользователей и получить обновление, в какой версии проблема была исправлена. В противном случае, если другие приложения смогут установить успешную связь NF C на этом устройстве / ОС, которая не работает для меня, я просто копну глубже.

Пока я могу сказать, что в вашей реализации нет ничего плохого и выглядит хорошо.

Это может быть проблема с текущей ОС или если у вас есть любой Custom ROM, который может не полностью поддерживать или иметь функционал NFC driver.

1 голос
/ 17 января 2020

Два дополнительных бита информации, которые могут быть полезны

1) Используйте приемник Broadcaster для получения уведомлений об изменении состояния NF C, поскольку использование быстрых настроек не вызывает паузу в вашем приложении, поэтому повторное тестирование состояния nf c в onResume не работает (хотя пользователь, изменяющий приложение с полными настройками, приостановит работу вашего приложения)

Пример того, как это сделать в Java


@Override
    protected void onCreate(Bundle savedInstanceState) {
    // All normal onCreate Stuff

    // Listen to NFC setting changes
    this.registerReceiver(mReceiver, filter);
    }

// Listen for NFC being turned on while in the App
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();

            if (action.equals(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)) {
                final int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE,
                        NfcAdapter.STATE_OFF);
                switch (state) {
                    case NfcAdapter.STATE_OFF:
                    // Tell the user to turn NFC on if App requires it
                        break;
                    case NfcAdapter.STATE_TURNING_OFF:
                        break;
                    case NfcAdapter.STATE_ON:
                        // Do something with this to enable NFC listening
                        break;
                    case NfcAdapter.STATE_TURNING_ON:
                        break;
                }
            }
        }
    };

2) Не думайте, что устройство имеет страницу настроек NF C, если ваше приложение работает с и без NF C, если адаптер null, не предполагайте, что вы можете запустить Intent на страницу настроек NF C, предложенную @denis_lor, так как это вызовет cra sh, если в ОС не будет включен адаптер NF C.

...