华为手表2的NFC功能不可用?Android Wear 2.0

5
简而言之:
在华为手表2上,NFC似乎可用且已启用,但NFC_FEAUTURE不可用,因此NFC无法正常工作。 尝试开发在华为手表2上简单读取和显示NFC标签的功能会遇到一些困难:
mNfcAdapter.enableForegroundDispatch(this,nfcPendingIntent, nfcIntentFilter, null);  

引发错误

java.lang.UnsupportedOperationException  

这意味着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 != nullmNfcAdapter.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 (华为手表 2.0)。我想知道我做错了什么?华为手表 2 上的 NFC 是否被锁定或禁用?谢谢提前帮助。

我正在尝试在LG Sport手表上进行类似的操作(使用Google Pay和NFC)...您是否介意分享您的测试代码,以便我可以快速验证?也许我们可以一起向Google提出一个案例。 - Billy
供您参考...在LG Watch Sport上,NfcAdapter.getDefaultAdapter(this)返回null,getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)返回false。没有什么好运气的。 - Billy
2个回答

2
基于这个文档, NFC 功能被支持在华为手表2上,并且它还拥有 Android Wear 2.0 版本。
然而,错误 java.lang.UnsupportedOperationException 表示该方法尚未被框架作者实现,因此您可能需要联系支持团队以获得澄清。请参见此链接

感谢您的快速回复。我即将联系华为开发者支持。我希望有其他人遇到了同样的问题。我会发布支持过程的结果。 - Robin Böhm
1
华为开发者支持没有电话号码,也不回复电子邮件。有其他人可以提供帮助吗? - Robin Böhm
@RobinBöhm,你有取得任何进展吗?我现在也面临同样的问题。 - Sintho
很遗憾,没有。你呢?我正在尝试重新面对这个问题。 - Robin Böhm
@RobinBöhm,华为手表2不支持。我已经换成了索尼SmartWatch 3 SWR50,有一个启用NFC的补丁内核可用。对于我的小型研究项目来说,这已经足够好了,但显然不是“现实世界”项目的解决方案。 - Sintho

1

如果您想创建一个利用华为手表2上的NFC功能的原型,您可以通过将特性标志强制设置为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)

我不认为这种方法会被应用于发布的应用程序中,但是我可以使用这种方法识别标签。
我已经向华为发送了一个错误报告,希望他们能够解决这个问题。
有关反射的更多信息,请参见:http://blog.sevagas.com/?Modify-any-Java-class-field-using-reflection

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接