Почему SMS Retriever API не работает в режиме релиза? - PullRequest
0 голосов
/ 20 декабря 2018

Я реализовал SMS Retriever API, как в руководствах по Google, и в моем варианте отладки Build Variant отлично работает.Я могу прочитать смс и получить код, чтобы пользователь мог сделать логин.

Моя проблема - когда я запускаю приложение в выпуске Build Variant, оно не работает.Я получаю смс, но не могу прочитать код для входа в систему.

Я изменяю хеш, сгенерированный с помощью AppSignatureHelper в режиме выпуска, который отличается от режима отладки.В отладочной работе и в выпуске №

Будет полезна некоторая помощь

Код:

Манифест:

   <receiver android:name=".app.receivers.SmsReceiver">
        <intent-filter>
            <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
        </intent-filter>
    </receiver>

В моем классе: (В выпуске и в режиме отладки код отправляется методом onSucess). Этот метод вызывается в 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);
        }
    });
}

Мой получатель:

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;
    }
}

Мой метод 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);
                }
            }
        });
    }

Ответы [ 7 ]

0 голосов
/ 17 апреля 2019

Вы должны добавить хеш строки релиза приложения к сообщению, отправленному с сервера, потому что хеш релиза отличается от хеша отладки Проверка извлечения SMS

0 голосов
/ 06 мая 2019

У меня была та же проблема с использованием

SMSRETRIEVERAPI

Я получил otp для отладочной сборки, но когда я нажал это в playstore, я не стал автоматически читать otp. На самом деле он будет генерировать хеш-ключ на основе типа вариантов сборки приложения. So Inorder to auto read your otp you will change the your hashkey in your server that will be generated in release mode.

Так что найдите Hashkey в режиме релиза и обновите его на своем сервере. Вот и вы его получите.

0 голосов
/ 26 февраля 2019

Чтобы получить ключ для производства, выполните следующие действия:

  1. Перейдите к параметру Сборка .
  2. В параметрах выберите Выберите СборкуВариант .
  3. Затем в левом углу откроется диалоговое окно, оттуда Измените вариант сборки с debug на release .
  4. Нажмите кнопку «Выполнить», откроется диалоговое окно: Then this dialog will open(point 4 pic.)
  5. Нажмите Выполнить , затем нажмите Все равно продолжить , затем нажмите Да затем в диалоговом окне In this dialog Click on the **+** in left bottom.
  6. Затем заполните эти данные: Then fill these details
  7. Теперь перейдите к Типы сборки и следуйте этому изображению: Then go to build types and follow the image
  8. И нажмите ok .

Теперь, когда вы запускаете команды для получения хеша через AppSignatureHelper Class , этот ключ будет вашим рабочим ключом..

0 голосов
/ 07 февраля 2019
  1. Сначала загрузите приложение, подписанное сертификатом дер, с вашей учетной записи игровой консоли.
  2. Затем преобразуйте его в yourkeystore.keystore с расширением хранилища ключей с помощью этой команды:

    keytool -import -alias your_alias -keystore file_name_created.keystore -file certificate.der

  3. Затем создайте хеш-строку, используя созданное хранилище ключей.
    Используйте этот файл bash для создания хеш-строки:
    https://github.com/googlesamples/android-credentials/tree/master/sms-verification/bin

0 голосов
/ 04 февраля 2019

Несколько дней назад у меня была такая же проблема.На самом деле в вашем коде нет ничего плохого.Когда вы запускаете свое приложение и создаете хеш, оно создает хеш только для конкретного устройства.Когда вы генерируете подписанный apk и создаете хеш (используя журнал), тогда этот хеш предназначен только для выпуска, но не для производства.В случае производства вы должны установить приложение из игрового магазина и проверить хеш (используя логи), и этот хеш будет использоваться для всех пользователей.

Надеюсь, это поможет вам

0 голосов
/ 11 января 2019

Сначала загрузите файл сертификата подписи приложения .der, затем преобразуйте его в файл .jks с помощью этой команды

keytool -import -alias your_alias -keystore file_name_created -file certificate.der

, затем создайте новый файл .jks

, затем используйте эту команду для создания хэша дляваш релиз

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

, затем создайте строку хеша, и она будет работать в приложении Play Store.

0 голосов
/ 20 декабря 2018

Вы сгенерировали хеш-значение release и отправили его через смс с сервера?

...