android - NfcManager 可用,但 NfcAdapter 始终为 null

标签 android nfc rfid

我有一个具有 NFC 功能的真实设备。
它配备了一个预装的应用程序来读取和写入 RFID 标签,并且运行良好。
但是,当我尝试使用 Android 的 NFC Api 时,NfcAdapter 始终为 null

我通过以下方式验证了 NFC 功能

Activity activity = getActivity();

PackageManager pm = getContext().getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
    //This one is returned
    Log.i(TAG, "Has NFC functionality");
} else {
    Log.e(TAG, "Has No NFC functionality");
}

还测试了管理器

NfcManager manager = (NfcManager) getContext().getSystemService(Context.NFC_SERVICE);
if (manager != null) {
    //So the service is not null
    Log.i(TAG, "NFC  Manager working");
} else {
    Log.e(TAG, "No NFC  Manager working");
}

但是当我使用时

 NfcAdapter nfc = manager.getDefaultAdapter();

它总是返回null。当上下文用作参数时,也会发生同样的情况。

NfcAdapter nfc = NfcAdapter.getDefaultAdapter(context);

我使用了 Google 提供的 CardReader 示例,并按照 NFC 文档添加了更多测试,因此权限、 Intent 过滤器和技术列表的定义如文档所述。

我错过了什么?

我已经留下了样本附带的 list 我应该改变什么吗?

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.cardreader"
    android:versionCode="1"
    android:versionName="1.0">

    <!-- NFC Reader Mode was added in API 19. -->
    <!-- Min/target SDK versions (<uses-sdk>) managed by build.gradle -->
    <uses-permission android:name="android.permission.NFC" />
    <uses-feature android:name="android.hardware.nfc" android:required="true" />

    <application android:allowBackup="true"
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name"
                  android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <!-- NFC-related intent filter. Allows application to handle messages from any
                 NFC-A devices discovered. Other Android devices are required to support NFC-A.
                 See: res/xml/nfc_tech_filter.xml -->
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
            </intent-filter>
            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter" />
        </activity>
    </application>


</manifest>

最佳答案

终于解决了,正如我怀疑的那样,没有可用的 NFC 适配器。

该设备来自一家公司,该公司似乎为 NFC 设备组装了自己的定制主板。空适配器可能是在 android 编译版本上故意造成的。

经过一番努力,我获得了预安装应用程序的示例源代码,它附带了 native 库和编译的 jar,现在我可以以正确的方式处理界面。

我发现了很多这样的问题,有些回答根本不值得,即使源与官方 android 文档和示例相同,它们仍然会导致可能的错误代码使用,所以如果有人仍然有同样的问题,您可以遵循此路径。

  1. 通过以下方式验证功能的可用性

PackageManager pm = getContext().getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
    //This one is returned
    Log.i(TAG, "Has NFC functionality");
} else {
    Log.e(TAG, "Has No NFC functionality");
}
  • 验证 NfcManager 的可用性

  • NfcManager manager = (NfcManager) getContext().getSystemService(Context.NFC_SERVICE);
    if (manager != null) {
        NfcAdapter nfc = manager.getDefaultAdapter();
        //So the service is not null
        Log.i(TAG, "NFC  Manager working");
    } else {
        Log.e(TAG, "No NFC  Manager working");
    }
    
  • 检查库/ native 实现

  • 如果上述步骤失败,请使用示例应用程序来测试是否存在自定义适配器实现。
    使用 [dex2jar][1] 获取演示的源代码,检查使用的 .so 和 .jar 库,以及是否有 native 代码实现。
    那么你应该如果可能的话获取源代码示例,我无法获取反编译版本所需的.jar。

    关于android - NfcManager 可用,但 NfcAdapter 始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47896609/

    相关文章:

    android - 如何检查 Fragment 是否从 backstack 恢复?

    android - nfc Intent 发送的问题

    java - 如何在onResume内判断设备是否已从 sleep 模式唤醒

    c# - 在另一个线程中调用函数 C#

    android - Write Multiple Blocks 命令在 NfcV 上失败

    java - RuntimeException:Web 浏览器中的 InspirationTargetException

    android - mediaplayer seekTo() 以字节为单位的偏移量

    java - 不要使用 TabLayout 将 Activity 保留在缓存中

    Android:具有特定尺寸的背景?

    android - 用于 NFC 设备身份验证的 AES 与 3DES (Mifare)