【问题标题】:UnsupportedOperationException for Android API method CardEmulation.getInstance()Android API 方法 CardEmulation.getInstance() 的 UnsupportedOperationException
【发布时间】:2017-02-03 22:33:44
【问题描述】:

我需要检查设备上是否启用了卡模拟。我找到了一种方法here

boolean isDefault = CardEmulation
                .getInstance(NfcAdapter.getDefaultAdapter(this))
                .isDefaultServiceForCategory(
                        new ComponentName(this, MyPaymentService.class),
                        CardEmulation.CATEGORY_PAYMENT);

这似乎适用于某些设备,但并非适用于所有设备。

例如,在三星 GT-I9300I(Android 4.4)上,有一个 NFC 模块,但它没有在设置中显示触碰付款选项。

当我的应用在该设备上运行时,我收到以下错误:

E/CardEmulation:此设备不支持卡仿真 09-26 16:41:13.592 2625-2625/? E/AndroidRuntime: 致命异常: main 进程:com.android.settings,PID:2625 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.android.settings/com.android.settings.nfc.PaymentDefaultDialog}:java.lang.UnsupportedOperationException 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2441) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2500) 在 android.app.ActivityThread.access$900(ActivityThread.java:171) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:146) 在 android.app.ActivityThread.main(ActivityThread.java:5679) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 在 dalvik.system.NativeStart.main(本机方法) 引起:java.lang.UnsupportedOperationException 在 android.nfc.cardemulation.CardEmulation.getInstance(CardEmulation.java:159) 在 com.android.settings.nfc.PaymentBackend.(PaymentBackend.java:53) 在 com.android.settings.nfc.PaymentDefaultDialog.onCreate(PaymentDefaultDialog.java:57) 在 android.app.Activity.performCreate(Activity.java:5582) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2405) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2500) 在 android.app.ActivityThread.access$900(ActivityThread.java:171) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:146) 在 android.app.ActivityThread.main(ActivityThread.java:5679) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 在 dalvik.system.NativeStart.main(本机方法)

但是,根据the documentationCardEmulation 自 API 级别 19 (Android 4.4) 起可用。

那么任何人都可以解释为什么我会收到此异常吗?我该如何克服这个问题?

【问题讨论】:

    标签: android nfc payment apdu hce


    【解决方案1】:

    日志输出中的错误很明显:

    E/CardEmulation:此设备不支持卡仿真

    此类只能在支持卡模拟和基于 AID 的路由配置的设备上使用。这也记录在the documentation of the class CardEmulation

    使用这个类需要FEATURE_NFC_HOST_CARD_EMULATION出现在设备上。

    因此,您只能在实际支持 HCE 功能的设备上使用方法 getInstance()。请注意,host 卡模拟在这里有点误导,因为使用OffHostApduService 声明管理路由配置以及使用CardEmulation 类进行与OffHostApduService 相关的任何操作也需要该功能。因此,此功能适用于 HCE 和基于安全元件的卡仿真的路由配置管理。但是,一些设备制造商开发了其他机制来测试基于安全元件的卡模拟的可用性(并且可能还用于管理路由)。

    您可以在调用CardEmulation.getInstance() 方法之前使用以下代码检查HCE 功能:

    boolean isDefault = false;
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
        isDefault  = CardEmulation.getInstance(NfcAdapter.getDefaultAdapter(this))
                                  .isDefaultServiceForCategory(
                                          new ComponentName(this, MyPaymentService.class),
                                          CardEmulation.CATEGORY_PAYMENT);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      相关资源
      最近更新 更多