J'ai implémenté le SMS Retriever API
comme dans les tutoriels de Google et dans ma version de débogage Build Variant. Je peux lire le sms et obtenir le code pour que l'utilisateur puisse se connecter.
Mon problème est que lorsque je lance l'application dans la version Build Variant, le sms ne fonctionne pas. Je reçois le sms mais je ne peux pas lire le code pour me connecter.
Je change le hachage généré avec AppSignatureHelper en mode de publication différent du mode débogage. En débogage et dans la version no.
Une aide sera appréciée
Le code:
Manifeste:
<receiver Android:name=".app.receivers.SmsReceiver">
<intent-filter>
<action Android:name="com.google.Android.gms.auth.api.phone.SMS_RETRIEVED"/>
</intent-filter>
</receiver>
Dans ma classe: (En version et en mode débogage, le code lance la méthode onSucess) Cette méthode est appelée dans onCreate.
private void startSMSListening(){
SmsRetrieverClient client = SmsRetriever.getClient(this);
Task<Void> task = client.startSmsRetriever();
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// Successfully started retriever, expect broadcast intent
Log.e("startSMSListening", "listening sms");
sendCode();
showHideLoadingView(false);
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Failed to start retriever, inspect Exception for more details
Log.e("startSMSListening", "failure listening sms");
showHideLoadingView(false);
}
});
}
Mon récepteur:
public class SmsReceiver extends BroadcastReceiver {
//interface
private static SmsListener mListener;
@Override
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
if(extras != null) {
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
if(status != null) {
switch (status.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
// Get SMS message contents
String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
//Pass the message text to interface
if (mListener != null && !StringUtil.isNull(message)) {
mListener.messageReceived(message);
}
break;
case CommonStatusCodes.TIMEOUT:
Log.d("SMSReceiver", "timed out (5 minutes)");
break;
}
}
}
}
}
public static void bindListener(SmsListener listener) {
mListener = listener;
}
}
Ma méthode smsReceiver:
private void smsReceiver(){
SmsReceiver.bindListener(new SmsListener() {
@Override
public void messageReceived(String messageText) {
//From the received text string you may do string operations to get the required OTP
//It depends on your SMS format
Log.e("Message",messageText);
// If your OTP is six digits number, you may use the below code
Pattern pattern = Pattern.compile(OTP_REGEX);
Matcher matcher = pattern.matcher(messageText);
String otp = null;
while (matcher.find()) {
otp = matcher.group();
}
if(otp != null && et_code != null) {
et_code.setText(otp);
}
}
});
}
Commencez par télécharger le fichier .der de votre certificat de signature d'application, puis convertissez-le en fichier .jks à l'aide de cette commande.
keytool -import -alias your_alias -keystore file_name_created -file certificate.der
puis nouveau fichier .jks créé
puis utilisez cette commande pour générer un hachage pour votre version
keytool -exportcert -alias your_alias -keystore certificate.jks | xxd -p | tr -d "[:space:]" | echo -n app_package_name `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
puis créez une chaîne de hachage et cela fonctionnera sur l'application Play Store.
Suivez ces étapes pour obtenir la clé de production:
Maintenant, lorsque vous exécutez les commandes pour obtenir le hachage via AppSignatureHelper Class , cette clé sera votre clé de production.
Il y a quelques jours, j'ai eu le même problème. En réalité, il n'y a rien de mal dans votre code. Lorsque vous exécutez votre application et créez un hachage, il crée un hachage uniquement pour des appareils spécifiques. Lorsque vous générez un apk signé et créez un hachage (à l'aide du journal), celui-ci est uniquement destiné à la publication, mais pas à la production. En cas de production, vous devez installer l'application de Play Store et vérifier le hachage (en utilisant les journaux) et ce hachage sera utilisé par tous les utilisateurs.
J'espère que cela vous aidera
Ensuite, convertissez-le en yourkeystore.keystore avec l'extension keystore à l'aide de cette commande:
keytool -import -alias your_alias -keystore file_name_created.keystore -file certificate.der
Créez ensuite un hachage de chaîne à l'aide du magasin de clés créé.
Utilisez ce fichier bash pour créer une chaîne de hachage:
https://github.com/googlesamples/Android-credentials/tree/master/sms-verification/bin
Avez-vous généré la valeur de hachage relese et l'avez-vous envoyé via le serveur SMS?