Используйте мое приложение для оплаты 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.