Я попытался прочитать OTP из полученного SMS с помощью SmsRetrieverClient, но получатель широковещательной рассылки не звонит

Я попытался получить смс с помощью SmsRetrieverClient через его широковещательный приемник, но на самом деле проблема заключается в том, что когда SMS приходит onReceive, он никогда не вызывает его для дальнейшей обработки, но позже, через 5 минут, он вызывает метод тайм-аута приемника.

На самом деле я попробовал библиотеку, чтобы получить SMS, и она работает нормально, но запрашивает разрешение на чтение SMS, что, к сожалению, столкнется с проблемой политики Google во время загрузки приложения в playstore.

Ниже мой код.

Ниже приведен метод SmsRetrieverClient в моей деятельности:

 private void startSMSListener() {

    SmsRetrieverClient smsRetrieverClient = SmsRetriever.getClient(this);
    Task<Void> retriever = smsRetrieverClient.startSmsRetriever();
    retriever.addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            SMSBroadcastReceiver.OTPListener otpListener = new SMSBroadcastReceiver.OTPListener() {
                @Override
                public void onOTPReceived(String otpData) {
                    inputOTP.setText(otpData);
                }

                @Override
                public void onOTPTimeOut() {
                    inputOTP.setText("");
                    Toast.makeText(ctx, "TimeOut", Toast.LENGTH_SHORT).show();
                }
            };

            smsBroadcastReceiver.injectOTPListener(otpListener);
            registerReceiver(smsBroadcastReceiver, new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION));
        }
    });

    retriever.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(ctx, "Problem to start listener", Toast.LENGTH_SHORT).show();
        }
    });

}

Ниже приведен код получения SMS от широковещательного приемника:

public class SMSBroadcastReceiver extends BroadcastReceiver {
private OTPListener otpReceiver;

public void injectOTPListener(OTPListener receiver) {
    this.otpReceiver = receiver;
}

@Override
public void onReceive(Context context, Intent intent) {
    if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
        Bundle extras = intent.getExtras();
        Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
        System.out.println("SMS verification code::SMSBroadcastReceiver:0:  "+ status);

        switch (status.getStatusCode()) {

            case CommonStatusCodes.SUCCESS:

                String message = (String)extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
                Pattern pattern = Pattern.compile("\\d{4}");
                Matcher matcher = pattern.matcher(message);
                System.out.println("SMS verification code::SMSBroadcastReceiver:1:  "+ message);

                if (matcher.find()) {
                    if (otpReceiver != null){
                        otpReceiver.onOTPReceived(matcher.group(0));
                    }
                }
                break;

            case CommonStatusCodes.TIMEOUT:
                System.out.println("SMS verification code::SMSBroadcastReceiver:2:  TIMEOUT");

                if (otpReceiver != null){
                    otpReceiver.onOTPTimeOut();
                }
                break;
        }
    }
}


public interface OTPListener {

    void onOTPReceived(String otp);

    void onOTPTimeOut();
}
}

И в манифесте:

     <receiver android:name=".SMSBroadcastReceiver"
        android:exported="true">
        <intent-filter>
            <action 

 android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>

        </intent-filter>
        </receiver>

person yashraj sharma    schedule 09.04.2019    source источник
comment
добавить свой формат сообщения, а также.?   -  person Atif AbbAsi    schedule 09.04.2019
comment
ваше SMS в этом формате? ‹#› Код вашего примера приложения: 123ABC78 FA+9qCX9VSu, где FA+9qCX9VSu – хэш-строка приложения.   -  person RAHUL MAURYA    schedule 09.04.2019
comment
Да, формат сообщения @AtifAbbAsi — ‹#› Код вашего примера приложения: 123ABC78 FA+9qCX9VSu, где FA+9qCX9VSu — строка хэша приложения.   -  person yashraj sharma    schedule 09.04.2019
comment
вы получаете ошибку тайм-аута.?   -  person Atif AbbAsi    schedule 09.04.2019
comment
@AtifAbbAsi да каждый раз, когда я получаю сообщение об ошибке тайм-аута.   -  person yashraj sharma    schedule 09.04.2019
comment
вы генерируете hashkey каждый раз или нет.? и вы уверены, что хэш-ключ правильный.?   -  person Atif AbbAsi    schedule 09.04.2019
comment
@AtifAbbAsi Нет, я создал хеш-ключ приложения только один раз, и я думаю, что после того, как хеш-ключ сгенерирован, он будет одинаковым для одного и того же приложения каждый раз, нет? и да, его правильный хеш-ключ все еще сталкивается с той же проблемой   -  person yashraj sharma    schedule 09.04.2019
comment
попробуйте одну вещь, используйте вспомогательный класс hashkey, чтобы каждый раз генерировать hashkey и использовать этот hashkey в смс.   -  person Atif AbbAsi    schedule 09.04.2019
comment
@AtifAbbAsi Нет, это не работает   -  person yashraj sharma    schedule 09.04.2019
comment
не могли бы вы опубликовать свой фактический формат сообщения.?   -  person Atif AbbAsi    schedule 10.04.2019
comment
у вас действительно есть решение, потому что я столкнулся с той же проблемой в своем приложении @yashrajsharma   -  person vivek panchal    schedule 28.08.2019
comment
мой хэш-ключ 3Ro3X3Nr2FH. Но не вызывая приемник вещания. Не могли бы вы порадовать меня   -  person Manikandan K    schedule 17.06.2020


Ответы (1)


Большое спасибо за ваши решения, но после стольких попыток я нашел решение, причина, по которой трансляция не получала SMS otp, связана с двумя причинами:

1) Сообщение должно иметь размер 140 байт, как показано в ссылке ниже:

https://developers.google.com/identity/sms-retriever/verify#1_construct_a_verification_message

2) Я обнаружил, что во время разработки трансляции я получил от 2 до 3 широковещательных java-файлов, которые я добавил в свое приложение для тестирования SMS, каждый с другим кодом, который я зарегистрировал в манифесте всех приемников широковещательной рассылки SMS с одним и тем же действием, что было бессмысленно. Итак, наконец, удаление всех других зарегистрированных получателей из манифеста того же действия, что и «com.google.android.gms.auth.api.phone.SMS_RETRIEVED», и просто работа с одним широковещательным приемником с одним объявлением в манифесте с его действием решило мою проблему.

person yashraj sharma    schedule 10.04.2019