ФУНКЦИЯ NFC для Huawei Watch 2 недоступна?. Android Wear 2.0

Вкратце:
На Huawei Watch 2 кажется, что NFC доступен и включен, но NFC_FEAUTURE — нет, поэтому nfc не работает должным образом.

Попытка разработать возможность простого чтения и отображения тегов NFC на Huawei Watch 2 вызывает некоторые трудности:

mNfcAdapter.enableForegroundDispatch(this,nfcPendingIntent, nfcIntentFilter, null);  

вызывает ошибку

java.lang.UnsupportedOperationException  

Это означает, что FEATURE_NFC недоступен.
В MainActivity onCreate():

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);  //NfcAdapter mNfcAdapter
if (mNfcAdapter != null) {
  // Check if device supports NFC
  Log.i("NFC","Your device supports NFC");
}
// Check if NFC is enabled
if (mNfcAdapter.isEnabled()) {
    Log.i("NFC","NFC is Enabled");
}
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)) {
// Device compatible for NFC support
   Log.i("NFC", "Device compatible for NFC support"); 
}

показывает в консоли

... I/NFC: Your device supports NFC
... I/NFC: NFC is Enabled

но нет

... I/NFC: Device compatible for NFC support

Другими словами

mNfcAdapter !=null и
mNfcAdapter.isEnabled() == true но (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC) == false

Как это возможно?

Кстати. мой AndroidManifest.xml:

<uses-permission android:name="android.permission.NFC"/>
<uses-feature android:name="android.hardware.nfc" android:required="true" />

см. также Руководство по Android NFC и аналогичная запись NFC Android Wear (часы Huawei 2.0)

Что я делаю не так? NFC на Huawei Watch 2 каким-то образом заблокирован или отключен?

Заранее спасибо за помощь.


person Robin Böhm    schedule 25.01.2018    source источник
comment
Я пробую что-то подобное на LG Sport Watch (с Google Pay и NFC)... не могли бы вы поделиться своим тестовым кодом, чтобы я мог быстро проверить? Может быть, мы сможем подать иск в Google вместе.   -  person Billy    schedule 18.07.2018
comment
Для справки... в LG Watch Sport NfcAdapter.getDefaultAdapter(this) возвращает значение null, а getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC) возвращает значение false. Не повезло там.   -  person Billy    schedule 19.07.2018


Ответы (2)


Согласно этой документации, функция NFC поддерживается. в Huawei Watch 2, а также Android Wear 2.0.

Однако ошибка java.lang.UnsupportedOperationException означает, что метод еще не реализован авторами фреймворка, поэтому вы можете обратиться в службу поддержки за разъяснениями. См. эту ссылку.

person abielita    schedule 25.01.2018
comment
Спасибо за ваш быстрый ответ. Я собираюсь связаться со службой поддержки разработчиков Huawei. Я надеялся, что есть кто-то еще с такой же проблемой. Я опубликую результат процесса поддержки. - person Robin Böhm; 29.01.2018
comment
Служба поддержки разработчиков Huawei не имеет номера телефона и не отвечает на электронные письма. Кто-нибудь еще, пожалуйста? - person Robin Böhm; 08.02.2018
comment
@RobinBöhm, тебе удалось добиться какого-нибудь прогресса? Я сейчас столкнулся с той же проблемой. - person Sintho; 02.10.2018
comment
@sintho, к сожалению, нет. Вы? Я снова пытаюсь решить эту проблему. - person Robin Böhm; 26.11.2018
comment
@RobinBöhm не с Huawei Watch 2. Я перешел на Sony SmartWatch 3 SWR50, для которых существует исправленное ядро ​​​​с включенным NFC. Для моего небольшого исследовательского проекта этого достаточно, но явно не решение для «реальных» проектов. - person Sintho; 26.11.2018

Если вы хотите создать прототип, который использует функцию NFC на Huawei Watch 2, вы можете обойти эту ошибку, установив для флага функции значение true.

Сначала создайте функцию, которая может установить статическое свойство посредством отражения:

fun setStaticValue(className: String, fieldName: String, newValue: Any) {
    val field = Class.forName(className).getDeclaredField(fieldName)

    field.setAccessible(true)

    val oldValue = field.get(Class.forName(className));

    field.set(oldValue, newValue);
}

Затем используйте функцию непосредственно перед вызовом метода, который проверяет флаг функции следующим образом:

setStaticValue("android.nfc.NfcAdapter", "sHasNfcFeature", true)

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

Я также отправил отчет об ошибке в Huawei, так что будем надеяться, что они это исправят.

Для получения дополнительной информации об использовании отражения см.: http://blog.sevagas.com/?Modify-any-Java-class-field-using-reflection

person rhalff    schedule 24.03.2019