Используйте мое приложение для оплаты NFC, если он не установлен по умолчанию.

Привет, я работаю над андроидным приложением для платежей NFC.

В настройках Android есть опция для использования открытого приложения вместо стандартного. Например, когда у меня установлено приложение по умолчанию для Android Pay, и я открываю приложение перед оплатой - я хочу использовать свое приложение для оплаты вместо стандартного. См. Изображение ниже.

enter image description here

Я тестировал его, но, к сожалению, я заплатил с помощью Android Pay вместо своего приложения, которое выполнялось на переднем плане.

Я не нашел ни слова в документации, если мне нужно добавить что-то в манифест, зарегистрировать что-нибудь и т.д.?

У меня есть service с intent filter и meta data в моем манифесте, и когда приложение установлено по умолчанию для оплаты, оно работает правильно:

<service
        android:name="com.example.MyWalletHceService"
        android:exported="true"
        android:permission="android.permission.BIND_NFC_SERVICE">
        <intent-filter>
            <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
        </intent-filter>

        <meta-data
            android:name="android.nfc.cardemulation.host_apdu_service"
            android:resource="@xml/apduservice"/>
    </service>

Добавление содержимого xml apduservice:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:apduServiceBanner="@drawable/ic_logo_nfc_system"
               android:description="@string/nfc_service_title"
               android:requireDeviceUnlock="false">

<aid-group
    android:category="payment"
    android:description="@string/nfc_aid_desc">
    <!-- Following is a PPSE AID. You must always include this AID in order for payments to
         work-->
    <aid-filter android:name="@string/aid_number"/>
    <!-- Following AID list is specific to the application requirements.
       If your application supports the type of card that these AID represents,
       you must include those AID in your configuration file -->
    <aid-filter android:name="@string/aid_mc_filter"/> <!-- Mastercard DEBIT/CREDIT -->
</aid-group>

Ответ 1

Поэтому я наконец нашел решение!

Вы должны использовать setPreferredService (Activity, ComponentName) в текущей текущей деятельности переднего плана. Рекомендуется называть его внутри onResume() а также не забудьте вызвать unsetPreferredService (Activity), как только активность не находится на переднем плане (onPause() - хорошее место для вызова).

Еще одна вещь: setPreferredService (Activity, ComponentName) и unsetPreferredService (Activity) были добавлены в API 21, поэтому обязательно не вызывайте их из более старого API.