2016-09-26 4 views
1

デバイスでカードエミュレーションが有効になっているかどうかを確認する必要があります。これは一部のデバイスではなく、すべてのデバイスのために働くように見えますAndroid APIメソッドのUnsupportedOperationException CardEmulation.getInstance()

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

:私は1つの方法hereを見つけました。

たとえば、Samsung 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(アンドロイド4.4)以降で使用可能です。

だから誰も私はこの例外を得ている理由を説明できますか?どうすればこの問題を解決できますか?

答えて

1

エラーがログ出力には非常に明確である:

 
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()を使用する必要があります。 OffHostApduService宣言を使用してルーティング設定を管理し、OffHostApduServiceに関連するすべての操作にCardEmulationクラスを使用する必要があるため、ホストカードエミュレーションはここで少し誤解を招くことに注意してください。したがって、この機能は、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); 
} 
+0

大感謝を! –

関連する問題