android - Android API 方法 CardEmulation.getInstance() 的 UnsupportedOperationException

标签 android nfc payment apdu hce

我需要检查设备上是否启用了卡模拟。我找到了一种方法 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: This device does not support card emulation
09-26 16:41:13.592 2625-2625/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 Process: com.android.settings, PID: 2625
                                                 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.nfc.PaymentDefaultDialog}: java.lang.UnsupportedOperationException
                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2441)
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2500)
                                                     at android.app.ActivityThread.access$900(ActivityThread.java:171)
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                     at android.os.Looper.loop(Looper.java:146)
                                                     at android.app.ActivityThread.main(ActivityThread.java:5679)
                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                     at java.lang.reflect.Method.invoke(Method.java:515)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
                                                     at dalvik.system.NativeStart.main(Native Method)
                                                  Caused by: java.lang.UnsupportedOperationException
                                                     at android.nfc.cardemulation.CardEmulation.getInstance(CardEmulation.java:159)
                                                     at com.android.settings.nfc.PaymentBackend.(PaymentBackend.java:53)
                                                     at com.android.settings.nfc.PaymentDefaultDialog.onCreate(PaymentDefaultDialog.java:57)
                                                     at android.app.Activity.performCreate(Activity.java:5582)
                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2405)
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2500) 
                                                     at android.app.ActivityThread.access$900(ActivityThread.java:171) 
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) 
                                                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                     at android.os.Looper.loop(Looper.java:146) 
                                                     at android.app.ActivityThread.main(ActivityThread.java:5679) 
                                                     at java.lang.reflect.Method.invokeNative(Native Method) 
                                                     at java.lang.reflect.Method.invoke(Method.java:515) 
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
                                                     at dalvik.system.NativeStart.main(Native Method)

然而,根据the documentation , CardEmulation 自 API 级别 19 (Android 4.4) 起可用。

那么谁能解释为什么我会收到此异常?我该如何克服这个问题?

最佳答案

错误在日志输出中非常清楚:

E/CardEmulation: This device does not support card emulation

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

Use of this class requires the FEATURE_NFC_HOST_CARD_EMULATION to be present on the device.

因此,您只能在实际支持 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);
}

关于android - Android API 方法 CardEmulation.getInstance() 的 UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39705258/

相关文章:

java - 代号一重写 Android onNewIntent Activity 方法

比较 C 中的十六进制

php - 如何在 PHP 中集成 Assently api 进行电子签名交易

android - 使用 Jell bean v4.1.1 的 galaxy S3 上的空白/黑屏

java - 在 Android GCM 中使用 Java EE 相对于 PHP 的优势

android - 如何修复无法使用 Jetifier 转换 kotlin-android-extensions-1.3.71.jar' 错误?

android - 检测到 Nfc 标签/丢失监听器

payment-gateway - 如何管理在 BlueSnap 中销售特殊订单的销售代表?

paypal - 服务器如何知道付款确实是通过 PayPal 客户端 REST API 进行的?

java - 运行应用程序时出错 : java. lang.exceptionininitializererror