web-dev-qa-db-fra.com

Pourquoi SMS Les API Retriever ne fonctionnent pas en mode release?

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);
                }
            }
        });
    }
4
S.P.

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.

2
Pankaj Jain

Suivez ces étapes pour obtenir la clé de production:

  1. Accédez à l'option Build.
  2. Dans les options, choisissez Select Build Variant.
  3. Ensuite, dans le coin gauche, une boîte de dialogue s'ouvrira et à partir de là, changez la variante de construction de debug à release.
  4. Cliquez sur Exécuter, la boîte de dialogue suivante s’ouvrira: Then this dialog will open(point 4 pic.)
  5. Cliquez sur Exécuter, cliquez ensuite sur Continuer quand même, puis cliquez sur Oui puis dans le dialogue. In this dialog Click on the **+** in left bottom.
  6. Puis remplissez ces détails: Then fill these details
  7. Maintenant, allez à Build Types et suivez cette image: Then go to build types and follow the image
  8. Et cliquez sur ok.

Maintenant, lorsque vous exécutez les commandes pour obtenir le hachage via AppSignatureHelper Class , cette clé sera votre clé de production.

2
Sujeet Kumar Gupta

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 

1
Arsalan Khan
  1. Téléchargez d'abord le certificat signé de l'application depuis votre compte de console de jeu.
  2. 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

  3. 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

0
aiman absi

Avez-vous généré la valeur de hachage relese et l'avez-vous envoyé via le serveur SMS?

0
Chintan Desai