Выдает Ошибку при попытке аутентификации через код, присланный на телефон (Firebase)
У меня есть два экрана(Enter_Number и ConfirmNumber). В Enter_Number я ввожу номер телефона и нажимаю на кнопку(перейти на экран ConfirmNumber и выслать мне код) В ConfirmNumber собственно я жду прихода кода и ввожу его в поле проверки кода и тут возникает ошибка:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.inchat, PID: 9672
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
at android.view.View.performClick(View.java:6897)
at android.widget.TextView.performClick(TextView.java:12727)
at android.view.View$PerformClick.run(View.java:26101)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:6897)
at android.widget.TextView.performClick(TextView.java:12727)
at android.view.View$PerformClick.run(View.java:26101)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.IllegalArgumentException: Cannot create PhoneAuthCredential without either verificationProof, sessionInfo, temporary proof, or enrollment ID.
at com.google.android.gms.common.internal.Preconditions.checkArgument(com.google.android.gms:play-services-basement@@17.1.1:35)
at com.google.firebase.auth.PhoneAuthCredential.<init>(com.google.firebase:firebase-auth@@21.0.1:6)
at com.google.firebase.auth.PhoneAuthCredential.zzc(com.google.firebase:firebase-auth@@21.0.1:1)
at com.google.firebase.auth.PhoneAuthProvider.getCredential(com.google.firebase:firebase-auth@@21.0.1:1)
at com.example.inchat.ConfirmNumber.verifyPhoneNumberWithCode(ConfirmNumber.java:89)
at com.example.inchat.ConfirmNumber.RegistrationTime(ConfirmNumber.java:78)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:6897)
at android.widget.TextView.performClick(TextView.java:12727)
at android.view.View$PerformClick.run(View.java:26101)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Все работает хорошо, у меня сообщение с кодом приходит, но как только я ввожу этот 6-значный код у меня выдает такую ошибку. по идее с экраном Enter_Number.java все должно быть хорошо, я думаю, что проблема со вторым экраном ConfirmNumber.java. Проведя некоторые "исследования" я понял, что в момент вызова функции RegistrationTime() Экрана ConfirmNumber.java (Я добавил android:OnCLick="RegistrationTime" к кнопке "Проверить код" в экране ConfirmNumber.java) мой mVerificationId, который передается в функцию verifyPhoneNumberWithCode(mVerificationId,code); равен null( Я не понимаю, как исправить эту ошибку.
Enter_Number.java
package com.example.inchat;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.FirebaseException;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthOptions;
import com.google.firebase.auth.PhoneAuthProvider;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Enter_Number extends AppCompatActivity {
// private static final String TAG = "PhoneAuthActivity";
TextView Inchat, Privace_policy, Enter_phone;
LinearLayout Linear_bottom, main_layout;
FrameLayout frame_layout;
EditText EnterPhone, EnterPhoneCode;
Pattern pattern_phone = Pattern.compile("^[0-9]*?$");
Matcher matcher_phone;
//
// private FirebaseAuth mAuth;
// private ActivityMainBinding binding;
private PhoneAuthProvider.ForceResendingToken forceResendingToken;
public String CountryZipCode="";
private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
public String mVerificationId;
private static final String TAG = "MAIN_TAG";
private FirebaseAuth firebaseAuth;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_enter__email);
Inchat = (TextView) findViewById(R.id.inchat);
main_layout = (LinearLayout) findViewById(R.id.main_layout);
Linear_bottom = (LinearLayout) findViewById(R.id.linear_bottom);
Enter_phone = (TextView) findViewById(R.id.enter_email);
frame_layout = (FrameLayout) findViewById(R.id.frame_layout);
Privace_policy = (TextView) findViewById(R.id.privace_policy);
EnterPhone = (EditText) findViewById(R.id.EnterPhone);
EnterPhoneCode = (EditText) findViewById(R.id.EnterPhoneCode);
GetCountryZipCode();
firebaseAuth = FirebaseAuth.getInstance();
pd = new ProgressDialog(this);
pd.setTitle("Please wait...");
pd.setCanceledOnTouchOutside(false);
mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
ConfirmNumber c = new ConfirmNumber();
c.signInWithPhoneAuthCredential(phoneAuthCredential);
}
@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
pd.dismiss();
Toast.makeText(Enter_Number.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onCodeSent(@NonNull String verificationId, @NonNull PhoneAuthProvider.ForceResendingToken token) {
super.onCodeSent(verificationId, forceResendingToken);
Log.d(TAG,"onCodeSent: "+ verificationId);
mVerificationId = verificationId;
forceResendingToken = token;
pd.dismiss();
Toast.makeText(Enter_Number.this, "Verification Code Sent...", Toast.LENGTH_SHORT).show();
}
};
}
public void RegistrationTime(View view) {
String Phone = EnterPhone.getText().toString().trim();
matcher_phone = pattern_phone.matcher(Phone);
if(!Phone.isEmpty()){
startPhoneNumberVerification(Phone);
Intent intent = new Intent(this, ConfirmNumber.class);
ConfirmNumber.EmailProof(Phone,mVerificationId,mCallbacks);
startActivity(intent);
}else{
Toast.makeText(this, "No", Toast.LENGTH_SHORT).show();
}
}
private void startPhoneNumberVerification(String phone) {
pd.setMessage("Verification Phone Number");
pd.show();
PhoneAuthOptions options =
PhoneAuthOptions.newBuilder(firebaseAuth)
.setPhoneNumber(phone)
.setTimeout(60L,TimeUnit.SECONDS)
.setActivity(this)
.setCallbacks(mCallbacks)
.build();
PhoneAuthProvider.verifyPhoneNumber(options);
}
public String GetCountryZipCode(){
String CountryID="";
TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
//getNetworkCountryIso
CountryID= manager.getSimCountryIso().toUpperCase();
String[] rl=this.getResources().getStringArray(R.array.CountryCodes);
for(int i=0;i<rl.length;i++){
String[] g=rl[i].split(",");
if(g[1].trim().equals(CountryID.trim())){
CountryZipCode=g[0];
EnterPhoneCode.setHint("+" + CountryZipCode);
break;
}
}
return CountryZipCode;
}}
ConfirmNumber.java
package com.example.inchat;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;
import java.util.regex.Pattern;
public class ConfirmNumber extends AppCompatActivity {
TextView Text_confirm_email, Receive_sms;
TextView Inchat,Enter_email;
LinearLayout Linear_bottom,main_layout;
FrameLayout frame_layout;
EditText PhoneNumber;
public static String Phone;
public static String mVerificationId;
private static final String KEY_VERIFICATION_ID = "key_verification_id";
private FirebaseAuth firebaseAuth;
private ProgressDialog pd;
public static PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
private PhoneAuthProvider.ForceResendingToken forceResendingToken;
// private FirebaseAuth mAuth;
// private String phone,id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_confirm_email);
Inchat = (TextView) findViewById(R.id.inchat);
Text_confirm_email = (TextView) findViewById(R.id.text_receive);
main_layout = (LinearLayout) findViewById(R.id.main_layout);
Linear_bottom = (LinearLayout) findViewById(R.id.linear_bottom);
Enter_email = (TextView) findViewById(R.id.enter_email);
frame_layout = (FrameLayout) findViewById(R.id.frame_layout);
Receive_sms = (TextView) findViewById(R.id.receive_sms);
PhoneNumber = (EditText) findViewById(R.id.EnterEmailAddress);
TextConfirm();
Text_confirm_email.setText("An SMS has been sent to your Phone Number (" + TextConfirm() + ") with an account verification code, enter the code here (it's free):");
SizeScreen();
firebaseAuth = FirebaseAuth.getInstance();
}
public void RegistrationTime(View view) throws InterruptedException {
String code = PhoneNumber.getText().toString().trim();
if(TextUtils.isEmpty(code)){
Toast.makeText(this, "Please enter verification Code", Toast.LENGTH_SHORT).show();
}else{
System.out.println(mVerificationId );
System.out.println(code );
verifyPhoneNumberWithCode(mVerificationId,code);
}
}
private void verifyPhoneNumberWithCode(String mVerificationId, String code) throws InterruptedException {
// pd.setMessage("Verifying Code");
// pd.show();
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(mVerificationId,code);
signInWithPhoneAuthCredential(credential);
}
public void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
// pd.setMessage("Logging In");
firebaseAuth.signInWithCredential(credential)
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
// pd.dismiss();
String phone = firebaseAuth.getCurrentUser().getPhoneNumber();
startActivity(new Intent(ConfirmNumber.this,Logowanie.class));
Toast.makeText(ConfirmNumber.this, "Logged In as " + phone, Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// pd.dismiss();
Toast.makeText(ConfirmNumber.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
public static void EmailProof(String Phone, String mVerificationId, PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks){
ConfirmNumber.mVerificationId = mVerificationId;
ConfirmNumber.Phone = Phone;
ConfirmNumber.mCallbacks = mCallbacks;
}
private String TextConfirm() {
Pattern pattern2 = Pattern.compile("(?<=.{4})(.)");
return pattern2.matcher( Phone ).replaceAll( "*" );
}}