salut!Je m'appelle Alex, je suis développeur chez QIWI.TL; DRComment transférer du messager directement sur le formulaire de paiement:- Dans le manifeste, nous mettons une activité c vide du
intent-filter
type ACTION_VIEW
et ACTION_DIAL
avec le schéma «tel». - En activité, nous transférons vers le formulaire de paiement via le lien profond existant, l'enrichissant avec les données de l'original
intent- âtel:XXXXXâ
BĂ©nĂ©fice : en cliquant sur le numĂ©ro de tĂ©lĂ©phone en surbrillance dans le messager, une personne accĂšde au formulaire de transfert avec le champ rempli du destinataire du transfert.Bonus : je vais vous dire Ă quel point activer cette fonctionnalitĂ©, sans ĂȘtre en mesure de modifier la liste des filtres d'intention dans le manifeste lors de l'exĂ©cution.Pourquoi?
Supposons qu'une personne ait la tĂąche de transfĂ©rer de l'argent pour un cadeau d'anniversaire collectif. Le destinataire peut choisir des options de transfert pratiques: transfert vers une carte, portefeuille Ă©lectronique, transfert direct vers un compte ou autre chose. De nombreuses entreprises fournissant des services de traduction acceptent un numĂ©ro de tĂ©lĂ©phone comme identifiant d'utilisateur secondaire ou principal. Afin d'Ă©viter les transferts erronĂ©s, le destinataire peut transmettre son numĂ©ro de tĂ©lĂ©phone via un SMS: email, messagerie instantanĂ©e ou SMS. Le message indique Ă©galement le systĂšme nĂ©cessaire pour la traduction.Un chemin d'utilisateur typique consiste Ă copier le numĂ©ro de tĂ©lĂ©phone Ă partir du messager et Ă le coller dans l'application pour la traduction. Cette mĂ©thode implique de basculer entre les applications, d'accĂ©der Ă©ventuellement au bureau et mĂȘme de rechercher parmi les applications installĂ©es du fournisseur de services de traduction. Est-il possible de raccourcir ce chemin en rĂ©duisant le nombre d'Ă©tapes? Il y a une option.ThĂ©orie
De nombreux messagers instantanés dans les smartphones reconnaissent les numéros de téléphone et les mettent en évidence sous la forme d'un lien hypertexte. Par défaut, il existe une application pour traiter ce type de liens sur n'importe quel appareil mobile avec un module GSM. Habituellement, il est appelé «Téléphone». Dans Android, la possibilité de traiter un numéro de téléphone partagé est déclarée dans AndroidManifest. Exemples d'applications: «Téléphone», Viber, Skype. Si vous interceptez ces événements, vous pouvez immédiatement fournir à l'utilisateur une liste d'actions possibles avec un numéro de téléphone. Dans notre cas, ce sera une offre de transfert via QIWI Wallet.Nous sommes intéressés par les événements avec types Intent.ACTION_VIEW
, Intent.ACTION_DIAL,
Intent.ACTION_CALL
avec le schéma tel. un événementIntent.ACTION_CALL
Il a des restrictions sur la politique de sécurité Android et son initialisation nécessite l'autorisation de l'utilisateur à partir de la version de Marshmallow incluse. Selon nos messagers de recherche en utilisant plus générale Intent.ACTION_VIEW
, Intent.ACTION_DIAL
.Il existe plusieurs types similaires spĂ©cifiquement pour les tĂ©lĂ©phones d'urgence, mais ce n'est clairement pas notre cas. Le corps d'intention a la forme «tel: 12345678». Ce type d'intention ne peut pas ĂȘtre traitĂ© android.content.UriMatcher
, car l'hÎte manque ici. Le moyen le plus simple de gérer ce type d'Uri est de le demander schemeSpecificPart
et de vĂ©rifier s'il s'agit d'un numĂ©ro de tĂ©lĂ©phone valide.La liste des filtres d'intention doit ĂȘtre spĂ©cifiĂ©e dans AndroidManifest, il est impossible de la modifier lors de l'exĂ©cution de l'application. Comment dĂ©sactiver Ă distance cette fonctionnalitĂ©? La premiĂšre option consiste Ă rejeter la demande de l'utilisateur au moment de l'ouverture de l'activitĂ© - avec un message ou tout simplement fermer l'application. De notre point de vue, ce n'est pas le meilleur UX, car nous allons interrompre le flux de l'utilisateur au milieu. Il vaut mieux ne laisser personne choisir notre application, si la fonctionnalitĂ© est dĂ©sactivĂ©e. Il est plus facile de dĂ©sactiver le composant avec la liste des filtres d'intention lors de l'exĂ©cution, cela ne donnera Ă l'utilisateur aucune fausse promesse dans l'interface systĂšme. Lorsque vous utilisez le PackageManager, notez que la vĂ©rification de l'inclusion de composants n'est pas trĂšs fiable. Il est prĂ©fĂ©rable de enabled
forcer l' indicateur d' un composant sans se fier à son état actuel à l'aide de valeursCOMPONENT_ENABLED_STATE_ENABLED
et COMPONENT_ENABLED_STATE_DISABLED
. Les modifications apportées via PackageManager sont enregistrées jusqu'à ce que l'application soit désinstallée de l'appareil.Entraine toi
Afin de désactiver la fonctionnalité, nous avons besoin d'un composant Android pour la désactiver.Le moyen le plus simple consiste à utiliser une activité vide, ce que nous ferons. Si vous décidez d'utiliser le Service avec un ensemble similaire de filtres d'intention, consultez les guides Google, qui disent spécifiquement «ne déclarez pas de filtres d'intention pour vos services» . Veuillez noter que par défaut le composant est désactivé:android:enabled="false"
<activity
android:name=".messengerP2P.view.MessengerP2PActivity"
android:configChanges="orientation"
android:label="@string/title_activity_messenger_p2_p"
android:enabled="false"
android:screenOrientation="portrait">
<!-- Open shared telephone number as dial application -->
<intent-filter
android:label="@string/title_activity_messenger_p2_p">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
</activity>
L'activitĂ© elle-mĂȘme est simplement redirigĂ©e vers le mode de paiement via les diplinks existants.class MessengerP2PActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var phoneNumberFromDial: String? = intent?.data?.schemeSpecificPart
phoneNumberFromDial?.let {
if (ru.mw.utils.Utils
.isPhoneNumber(phoneNumberFromDial)) {
val phoneNumberFromDialLink = PaymentActivity.getUriForProviderId(
resources.getInteger(R.integer.providerIdQiwiWallet).toLong(), null, null)
.buildUpon()
.appendQueryParameter(PaymentActivity.QUERY_PARAM_ACCOUNT, phoneNumberFromDial)
startActivity(
Intent(Intent.ACTION_VIEW, phoneNumberFromDialLink.build()))
}
}
finish()
}
}
Le drapeau android: enabled peut ĂȘtre contrĂŽlĂ© par cette classe d'assistance.import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
class MessengerP2PUtils {
companion object {
private const val componentName = "ru.mw.messengerP2P.view.MessengerP2PActivity"
private fun switchMessengerP2P(enabled: Boolean = true, packageName: String, packageManager: PackageManager) {
val compName = ComponentName(packageName, componentName)
packageManager.setComponentEnabledSetting(
compName,
when (enabled) {
true -> PackageManager.COMPONENT_ENABLED_STATE_ENABLED
else -> PackageManager.COMPONENT_ENABLED_STATE_DISABLED
},
PackageManager.DONT_KILL_APP)
}
fun enableMessengerP2P(applicationContext: Context) {
val packageName = applicationContext.packageName
val packageManager = applicationContext.packageManager
switchMessengerP2P(enabled = true, packageName = packageName, packageManager = packageManager);
}
fun disableMessengerP2P(applicationContext: Context) {
val packageName = applicationContext.packageName
val packageManager = applicationContext.packageManager
switchMessengerP2P(enabled = false, packageName = packageName, packageManager = packageManager);
}
fun isMessengerP2PEnabled(packageName: String, packageManager: PackageManager): Boolean {
val state = packageManager.getComponentEnabledSetting(ComponentName(packageName, componentName))
return state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
}
}
}
Ici, la méthode «isMessengerP2PEnabled» n'est pas utilisée pour vérifier l'état actuel du composant, car lors des tests, il a produit des résultats peu fiables. Si vous décidez de l'utiliser, vérifiez soigneusement son fonctionnement dans les conditions de la logique métier asynchrone et lors du téléchargement de l'application.Le temps pour changer la valeur de l'indicateur n'est enabled
pas trĂšs important, nous avons choisi le moment oĂč la configuration des indicateurs de fonctionnalitĂ© Ă©tait complĂštement chargĂ©e.Pour que lorsque vous cliquez sur le numĂ©ro de tĂ©lĂ©phone dans les messagers, il y ait une boĂźte de dialogue de sĂ©lection du systĂšme, vous devez fournir Ă l'utilisateur des instructions sur la façon de dĂ©sactiver les paramĂštres par dĂ©faut pour l'intention - un «tel: XXXXX». Par exemple: «Si vous ne pouvez passer un appel que lorsque vous cliquez sur un numĂ©ro, accĂ©dez aux paramĂštres du smartphone â sĂ©lectionnez TĂ©lĂ©phone dans la liste des applications â rĂ©initialisez« Ouvrir par dĂ©faut ».Si vous dĂ©sactivez le composant lors de vos dĂ©placements, lorsque l'utilisateur voit cette boĂźte de dialogue systĂšme, rien de mauvais ne se produira. L'Ă©lĂ©ment correspondant disparaĂźtra instantanĂ©ment de la liste, dans notre cas «Transfert d'argent».Un comportement intĂ©ressant commencera si l'utilisateur traite les liens via notre application par dĂ©faut. Pour ce faire, il suffit de pousser l'Ă©lĂ©ment «MĂ©moriser la sĂ©lection» ou «Toujours». Si vous dĂ©sactivez le composant, l'utilisateur aura le choix de l'application Ă utiliser et, au premier dĂ©marrage, il n'y aura pas d'Ă©lĂ©ment «MĂ©moriser la sĂ©lection». AprĂšs avoir activĂ© les fonctionnalitĂ©s, l'ensemble du flux sera restaurĂ©, l'utilisateur sera transfĂ©rĂ© directement vers l'application.Conclusion
L'idĂ©e de cette fonctionnalitĂ© nous est venue il y a longtemps, le ticket original a Ă©tĂ© créé en 2017. L'idĂ©e n'a pas perdu de sa pertinence, mĂȘme maintenant, je n'ai pas pu trouver une application bancaire avec des fonctionnalitĂ©s similaires. Nous avons publiĂ© les «transferts du messager» le 29 avril, le premier jour, prĂšs de 8 000 utilisateurs uniques en ont profitĂ©. Si les indicateurs commerciaux dans un avenir proche nous satisfont, nous dĂ©velopperons davantage cette fonctionnalitĂ©.Que pensez-vous, combien d'intentions plus intĂ©ressantes d'Android attendent paisiblement leur application mĂ©tier?