Android API方法CardEmulation.getInstance()的UnsupportedOperationException

Android API方法CardEmulation.getInstance()的UnsupportedOperationException,android,nfc,payment,apdu,hce,Android,Nfc,Payment,Apdu,Hce,我需要检查设备上是否启用了卡模拟。我找到了一种方法: 看起来这在某些设备上有效,但并非对所有设备都有效 例如,在三星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 E

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

看起来这在某些设备上有效,但并非对所有设备都有效

例如,在三星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) E/CardEmulation:此设备不支持卡模拟 09-26 16:41:13.592 2625-2625/? E/AndroidRuntime:致命异常:主 进程:com.android.settings,PID:2625 java.lang.RuntimeException:无法启动活动组件信息{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.Invokenactive(本机方法) 位于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.Invokenactive(本机方法) 位于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(本机方法) 然而,根据API级别19(Android 4.4)的规定,
CardEmulation


有人能解释一下我为什么会遇到这个异常吗?如何克服此问题?

日志输出中的错误非常明显:

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) E/CardEmulation: This device does not support card emulation
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);
}