J'essaye d'utiliser Google SMS API Retriever pour Automatic SMS Vérification. J'ai suivi les instructions ici mais mon application est ne pas recevoir de messages SMS. Voici ce que j'ai fait:
J'ai ajouté le code dans mon activité pour démarrer le client SMS retriever:
val client = SmsRetriever.getClient(this)
val retriever = client.startSmsRetriever()
retriever.addOnSuccessListener {
Log.i("loginActivity", "started smsretriever")
}
retriever.addOnFailureListener {
//Problem to start listener
}
D'après les journaux, je vois que cela démarre avec succès. Ensuite, j'ajoute mon récepteur de diffusion avec ce onReceive:
override fun onReceive(context: Context, intent: Intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
val extras = intent.extras
val status = extras.get(SmsRetriever.EXTRA_STATUS) as Status
when (status.statusCode) {
CommonStatusCodes.SUCCESS -> {
}
CommonStatusCodes.TIMEOUT -> {
}
}
}
Cela se déclenche uniquement lorsqu'un événement TIMEOUT est envoyé 5 minutes après le démarrage du client de récupération SMS. Il ne se déclenche jamais pour les messages SMS.
Enfin, j'ai enregistré le récepteur dans le manifeste:
<receiver Android:name=".receiver.SMSReceiver" Android:exported="true">
<intent-filter>
<action Android:name="com.google.Android.gms.auth.api.phone.SMS_RETRIEVED"/>
</intent-filter>
</receiver>
En termes de SMS, je m'envoie ce SMS message: "<#> Votre code est: 123456 hash de vérification:"
Une idée de ce que je fais mal?
Enregistrez le BroadcastReceiver dans SmsRetrievers méthode addOnSuccessListener, ne vous inscrivez pas dans le fichier Manifest.
val client = SmsRetriever.getClient(this)
val retriever = client.startSmsRetriever()
retriever.addOnSuccessListener {
val listener = object : SMSBroadcastReceiver.Listener {
override fun onSMSReceived(otp: String) {
Log.d("AppSignatureHelper",otp)
Toast.makeText(context, otp, Toast.LENGTH_SHORT).show()
}
override fun onTimeOut() {
Log.d("AppSignatureHelper","Timed Out.")
}
}
smsBroadcastReceiver.injectListener(listener)
registerReceiver(smsBroadcastReceiver, IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION))
}
retriever.addOnFailureListener {
Log.d("AppSignatureHelper","Problem to start listener")
//Problem to start listener
}
L'interface d'écoute est.
interface Listener {
fun onSMSReceived(otp: String)
fun onTimeOut()
}
J'ai récemment rencontré le même problème.
J'ai compris que le problème était que j'utilisais le hachage de production Keystore pour les tests en mode débogage.
Si vous exécutez en mode débogage, assurez-vous d'utiliser le fichier de clés par défaut utilisé pour signer l'apk de débogage.
L'emplacement par défaut du magasin de clés de débogage est $HOME/.Android/debug.keystore
Selon la documentation app-sign :
Lors de l'exécution ou du débogage de votre projet à partir de l'IDE, Android Studio signe automatiquement votre application avec un certificat de débogage généré par les outils SDK Android SDK. La première fois que vous exécutez ou déboguer votre projet dans Android Studio, le IDE crée automatiquement le magasin de clés de débogage et le certificat dans $ HOME/.Android/debug.keystore et définit le magasin de clés et les mots de passe clés.
J'ai récemment écrit un article de blog à ce sujet, consultez-le pour plus de détails .
J'ai fait de même et cela fonctionnait parfaitement pour moi. Il est fort probable que le hachage de votre application soit incorrect.
Deux problèmes que j'ai rencontrés lorsque j'essayais de faire fonctionner cela:
1) Le message SMS doit être bien formaté. Vous pourriez penser "ok, j'ai compris" mais dans mon cas, j'ai eu plus d'un saut de ligne entre la première ligne du SMS et la clé de hachage de signature. Assurez-vous de suivre strictement ce modèle:
<#> Your xy verification code is 123456
FA+9qCX9VSu
2) Assurez-vous que vous utilisez la bonne clé de hachage. Android n'appellera pas la méthode onReceive à moins que votre hachage de signature dans le message SMS corresponde à celui de l'application en cours d'exécution. Pourquoi je dis ça? Vous aurez différents hachages sur votre version de débogage locale et la version déployée dans le magasin. Un point à mentionner ici est que Google peut prendre en charge la partie signature pour vous une fois que vous avez téléchargé l'apk sur la console Google.
J'espère que cela aide ... mes deux jours sont perdus maintenant.