Невозможно прочитать SMS (OTP) с помощью API SMS Retriever в Android10 (Android Q) - PullRequest
0 голосов
/ 06 января 2020

Мое приложение уже есть в магазине игр с тысячами загрузок и прекрасно работает, за исключением Android10 (Android Q), с момента выпуска Android 10 оно застревает на экране входа в систему. Поскольку LoginScreen включает в себя проверку OTP с номером мобильного телефона пользователя, после нажатия кнопки входа в систему запускается API-интерфейс SMS Retriever, и OTP получен, но не может его прочитать, а BroadcastReceiver всегда переходит к условиям TimeOut. Позже я отменил регистрацию (BroadcastReceiver) на onDestroy. Я протестировал его на OnePlus6.Пожалуйста, предложите любое решение для этого.

Мой код:

private void startSMSRetriver()
{
       SmsRetrieverClient client = SmsRetriever.getClient(NewLogInActivity.this );

    // Starts SmsRetriever, which waits for ONE matching SMS message until timeout
    // (5 minutes). The matching SMS message will be sent via a Broadcast Intent with
    // action SmsRetriever#SMS_RETRIEVED_ACTION.
    com.google.android.gms.tasks.Task<Void> task = client.startSmsRetriever();

    task.addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            System.out.println("SMS Success");
        }
    });

    task.addOnFailureListener(new OnFailureListener()
    {
        @Override
        public void onFailure(@NonNull Exception e)
        {
            System.out.println("SMS Failure");
        }
    });

}

BroadcastReceiver

public class MySMSBroadcastReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction()))
        {
            final Bundle bundle = intent.getExtras();
            try
            {
                if (bundle != null)
                {
                    Status status =(Status) bundle.get(SmsRetriever.EXTRA_STATUS);
                    if(status != null)
                    {
                        switch(status.getStatusCode())
                        {
                            //I want this
                            case CommonStatusCodes. SUCCESS :
                                System.out.println("SUCCESS");
                                break;
                            //always hits timeout
                            case CommonStatusCodes.TIMEOUT :
                                System.out.println("Timeout Hit");
                                break;
                            default:
                                break;
                        }
                    }
                }
            } catch (Exception e)
            {
                e.getMessage();
                System.out.println("Msg Exception 2 ::"+e.getMessage());
            }
        }
    }
}

LoginButton (LoginScreen) вызывается под кодом: -

startSMSRetriver();
otpReceiver = new MySMSBroadcastReceiver();
registerReceiver(otpReceiver, new IntentFilter("com.google.android.gms.auth.api.phone.SMS_RETRIEVED"));
...