我做了一个自定义登录活动,将OTP发送到用户的手机号码。一旦用户输入手机号码并点按“发送验证码"”,就会出现一个带有旋转器和应用程序崩溃的白色屏幕。
如果需要,我可以提供我使用的模块的更多细节。还有另一项活动,我已经启动了mName和mPhone。
package com.bogdankolomiets.skydreload.data;
import android.app.Activity;
import android.util.Log;
import com.google.firebase.FirebaseException;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import io.reactivex.Completable;
import io.reactivex.Single;
public class VerifyCodeManager {
private FirebaseAuth mFirebaseAuth;
private String mVerificationId = null;
private PhoneAuthProvider.ForceResendingToken mResendingToken;
private PhoneAuthCredential mPhoneAuthCredential;
@Inject
public VerifyCodeManager(FirebaseAuth firebaseAuth) {
mFirebaseAuth = firebaseAuth;
mFirebaseAuth.useAppLanguage();
}
public Single<Boolean> verifyPhone(Activity activity, String phoneNumber) {
if (mResendingToken == null) {
return sentSms(activity, phoneNumber);
} else {
return resendSms(activity, phoneNumber);
}
}
private Single<Boolean> resendSms(Activity activity, String phoneNumber) {
return Single.create(emitter -> {
PhoneAuthProvider.getInstance()
.verifyPhoneNumber(
phoneNumber,
60,
TimeUnit.SECONDS,
activity,
new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
mPhoneAuthCredential = phoneAuthCredential;
emitter.onSuccess(true);
}
@Override
public void onVerificationFailed(FirebaseException e) {
e.printStackTrace();
}
@Override
public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
super.onCodeSent(s, forceResendingToken);
mVerificationId = s;
mResendingToken = forceResendingToken;
emitter.onSuccess(false);
}
},
mResendingToken
);
});
}
private Single<Boolean> sentSms(Activity activity, String phoneNumber) {
return Single.create(emitter -> {
PhoneAuthProvider.getInstance()
.verifyPhoneNumber(
phoneNumber,
60,
TimeUnit.SECONDS,
activity,
new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
mPhoneAuthCredential = phoneAuthCredential;
emitter.onSuccess(true);
}
@Override
public void onVerificationFailed(FirebaseException e) {
e.printStackTrace();
}
@Override
public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
super.onCodeSent(s, forceResendingToken);
mVerificationId = s;
mResendingToken = forceResendingToken;
emitter.onSuccess(false);
}
}
);
});
}
public Completable checkCode(String smsCode) {
return Completable.create(e -> {
if (smsCode != null && mVerificationId == null) {
e.onError(new Throwable());
} else {
if (mPhoneAuthCredential == null && smsCode == null) {
e.onError(new Throwable());
} else if (mPhoneAuthCredential == null) {
mPhoneAuthCredential = PhoneAuthProvider.getCredential(mVerificationId, smsCode);
}
mFirebaseAuth.signInWithCredential(mPhoneAuthCredential)
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
mPhoneAuthCredential = null;
mVerificationId = null;
mResendingToken = null;
e.onComplete();
} else {
e.onError(task.getException());
}
});
}
});
}
}
答案 0 :(得分:0)
由FirebaseAuthInvalidCredentialsException
尝试将您传递的电话号码记录到sentSms()
方法,并确保您传递的电话号码采用以下格式:
[+] [国家/地区代码] [用户电话号码]
示例:+919123456780