根据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
强制重新发送短信验证码。但是,在对文档进行一些研究后,我仍然不知道如何。
我想问一下如何使用此token
重新发送短信验证?
答案 0 :(得分:16)
来源: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
}
答案 1 :(得分:0)
您可以使用Firebase方法重新发送验证码,如PERSISTENCE和拦截短信代码,以便自动签入,例如在运行进度对话框时,对用户透明,只需
// [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); // resending
// [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);
}
};
}
答案 2 :(得分:0)
更新的代码
fun resendOTP(activity: Activity,mobileNo: String){
val options = PhoneAuthOptions.newBuilder(auth)
.setPhoneNumber(mobileNo) // Phone number to verify
.setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
.setActivity(activity) // Activity (for callback binding)
.setCallbacks(callback) // OnVerificationStateChangedCallbacks
.setForceResendingToken(resendToken!!) // ForceResendingToken from callbacks
.build()
PhoneAuthProvider.verifyPhoneNumber(options)
}
对于Java,请参见Github
感谢GGWP的链接。
答案 3 :(得分:0)
最终 FirebaseAuth _auth = FirebaseAuth.instance;
void resendVerificationCode(String phoneNumber) async {
print(widget.forceResendingToken);
EasyLoading.show();
await _auth.verifyPhoneNumber(
phoneNumber: "+91" + phoneNumber,
forceResendingToken: widget.forceResendingToken,
timeout: const Duration(seconds: 120),
verificationCompleted: (PhoneAuthCredential phoneAuthCredential) async {
await _auth.signInWithCredential(phoneAuthCredential);
EasyLoading.dismiss();
showSnackbar(
"Phone number automatically verified and user signed in: ${_auth.currentUser.uid}");
},
verificationFailed: (FirebaseAuthException authException) {
EasyLoading.dismiss();
showSnackbar(
'Phone number verification failed. Code: ${authException.code}. Message: ${authException.message}');
},
codeSent: (String verificationId, [int forceResendingToken]) async {
print("TESTED 1.D");
EasyLoading.dismiss();
showSnackbar('Please check your phone for the verification code.');
widget._verificationId = verificationId;
},
codeAutoRetrievalTimeout: (String verificationId) {
EasyLoading.dismiss();
showSnackbar("verification code: " + verificationId);
widget._verificationId = verificationId;
});
}
第一次发送短信时,您将获得 forceResendToken。只需将其保存到变量并在下次传递该变量即可。
// forceResendingToken: widget.forceResendingToken