Как повторно отправить проверку SMS в Firebase Phone Authentication Android?

Согласно документации Firebase (https://firebase.google.com/docs/auth/android/phone-auth#send-a-verification-code-to-the-users-phone), существует callback для обработки аутентификации по номеру телефона.

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(PhoneAuthCredential credential) {

        Log.d(TAG, "onVerificationCompleted:" + credential);
        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(FirebaseException e) {

        Log.w(TAG, "onVerificationFailed", e);
    }

    @Override
    public void onCodeSent(String verificationId,
                           PhoneAuthProvider.ForceResendingToken token) {

        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

Мой вопрос по методу onCodeSent. Это сказано в документе здесь (https://firebase.google.com/docs/reference/android/com/google/firebase/auth/PhoneAuthProvider.ForceResendingToken)

что token можно использовать для принудительной повторной отправки кода подтверждения SMS. Однако, после некоторого исследования документа, я все еще не знаю, как.

Я хотел бы спросить, как использовать этот token для повторной отправки SMS-подтверждения?

Ответ 1

Источник: Github

Этот метод используется для повторной отправки SMS-подтверждений.

private void resendVerificationCode(String phoneNumber,
                                    PhoneAuthProvider.ForceResendingToken token) {
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            this,               // Activity (for callback binding)
            mCallbacks,         // OnVerificationStateChangedCallbacks
            token);             // ForceResendingToken from callbacks
}

Ответ 2

Вы можете использовать метод Firebase для повторной отправки кода проверки, например, PERSISTENCE и перехвата кода SMS для автоматической регистрации, например, во время запуска диалогового окна прогресса, и прозрачного для пользователя, который просто

// [START resend_verification]
public void resendVerificationCode(String phoneNumber,
                                   PhoneAuthProvider.ForceResendingToken token) {
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            activity,           //a reference to an activity if this method is in a custom service
            mCallbacks,
            token);        // resending with token got at previous call 'callbacks' method 'onCodeSent' 
    // [END start_phone_auth]
}

проверить смс с широковещательным приемником во фрагменте

private BroadcastReceiver smsBroadcastReceiver;
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
public static final String SMS_BUNDLE = "pdus";

 @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    smsBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("smsBroadcastReceiver", "onReceive");
            Bundle pudsBundle = intent.getExtras();
            Object[] pdus = (Object[]) pudsBundle.get(SMS_BUNDLE);
            SmsMessage messages = SmsMessage.createFromPdu((byte[]) pdus[0]);
            Log.i(TAG,  messages.getMessageBody());

            firebaseVerificationCode = messages.getMessageBody().trim().split(" ")[0];//only a number code 
            Toast.makeText(getContext(), firebaseVerificationCode,Toast.LENGTH_SHORT).show();
            String token = firebaseAutenticationService.getVerificationCode();//your service
        firebaseAutenticationService.verifyPhoneNumberWithCode(token,verificationCode);
        }
    };
}