问题描述
我试图在Android Studio中构建OTP系统,但是我想到了下面给出的代码,但是,每次我尝试将OTP发送到我的电话号码时,应用程序都崩溃了。这是代码:
Signp3rdClass.java
public class Signup3rdClass extends AppCompatActivity {
TextInputLayout phoneNumber;
CountryCodePicker countryCodePicker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getwindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_signup3rd_class);
//Hooks
countryCodePicker = findViewById(R.id.country_code_picker);
phoneNumber = findViewById(R.id.signup_phone_number);
}
public void callVerifyOTPScreen(View view) {
if(!validatePhoneNumber()){
return;
}
Intent intent = new Intent(getApplicationContext(),VerifyOTP.class);
String _fullName = getIntent().getStringExtra("fullname");
String _username = getIntent().getStringExtra("username");
String _email = getIntent().getStringExtra("email");
String _password = getIntent().getStringExtra("password");
String _gender = getIntent().getStringExtra("gender");
String _date = getIntent().getStringExtra("date");
String _getUserPhoneNumber = phoneNumber.getEditText().getText().toString().trim();
String _phoneNo = "+" + countryCodePicker.getFullNumber() + _getUserPhoneNumber;
intent.putExtra("fullName",_fullName);
intent.putExtra("username",_username);
intent.putExtra("email",_email);
intent.putExtra("password",_password);
intent.putExtra("date",_date);
intent.putExtra("gender",_gender);
intent.putExtra("phoneNo",_phoneNo);
startActivity(intent);
}
private boolean validatePhoneNumber() {
String val = phoneNumber.getEditText().getText().toString().trim();
String checkNo = "[7-9][0-9]{9}";
if (val.isEmpty()) {
phoneNumber.setError("Enter valid Phone Number!");
return false;
} else if (!val.matches(checkNo)) {
phoneNumber.setError("Enter valid Phone Number!");
return false;
} else {
phoneNumber.setError(null);
phoneNumber.setErrorEnabled(false);
return true;
}
}
}
Signup3rd.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Common.LoginSingup.Signup3rdClass"
android:background="@color/offwhite">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="30dp"
android:orientation="vertical">
<ImageView
android:id="@+id/signup_back_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:src="@drawable/back_btn"
android:transitionName="transition_back_btn"/>
<TextView
android:id="@+id/create_account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:fontFamily="sans-serif-medium"
android:text="@string/create_account"
android:textAllCaps="true"
android:textColor="@color/black"
android:textSize="40sp"
android:transitionName="transition_title_text"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="40dp">
<com.hbb20.CountryCodePicker
android:id="@+id/country_code_picker"
android:layout_height="match_parent"
android:layout_width="match_parent"
app:ccp_autoDetectCountry="true"
app:ccp_showFlag="true"
app:ccp_showNameCode="true"
app:ccp_showFullName="true"
android:background="@drawable/black_border"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/signup_phone_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:startIconDrawable="@drawable/field_phone_number_icon"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
app:hintTextColor="@color/black"
app:endIconMode="clear_text"
app:endIconTint="@color/black"
app:BoxstrokeWidthFocused="2dp"
app:BoxstrokeColor="@color/black">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/enter_phone_no"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<Button
android:id="@+id/signup_next_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/otp_code_btn"
android:layout_marginTop="20dp"
android:onClick="callVerifyOTPScreen"
android:elevation="5dp"
android:background="@color/colorPrimaryDark"
android:textColor="@color/white"
android:fontFamily="@font/montserrat_regular"
android:textSize="20sp"
android:transitionName="transition_next_btn"/>
<Button
android:id="@+id/signup_login_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/login"
android:layout_marginTop="20dp"
android:elevation="5dp"
android:background="@color/transparant"
android:fontFamily="@font/montserrat_regular"
android:textSize="20sp"
android:textColor="@color/black"
android:transitionName="transition_login_btn"/>
</LinearLayout>
这是我的OTP验证课程:
VerifyOTP.java
public class VerifyOTP extends AppCompatActivity {
PinView pinFromUser;
String codeBySystem;
FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getwindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_verify_o_t_p);
pinFromUser = findViewById(R.id.pin_view);
String _phoneNumber = getIntent().getStringExtra("phoneNo");
mAuth = FirebaseAuth.getInstance();
sendVerificationCodetoUser(_phoneNumber);
}
private void sendVerificationCodetoUser(String phoneNumber) {
PhoneAuthOptions options =
PhoneAuthOptions.newBuilder(mAuth)
.setPhoneNumber(phoneNumber) // Phone number to verify
.setTimeout(60L,TimeUnit.SECONDS) // Timeout and unit
.setActivity(this) // Activity (for callback binding)
.setCallbacks(mCallbacks) // OnVerificationStateChangedCallbacks
.build();
PhoneAuthProvider.verifyPhoneNumber(options);
}
private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks =
new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onCodeSent(@NonNull String s,@NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
super.onCodeSent(s,forceResendingToken);
codeBySystem = s;
}
@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
String code = phoneAuthCredential.getSmsCode();
if(code != null){
pinFromUser.setText(code);
verifyCode(code);
}
}
@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
Toast.makeText(VerifyOTP.this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
};
private void verifyCode(String code) {
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(codeBySystem,code);
signInWithPhoneAuthCredential(credential);
}
private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this,new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Toast.makeText(VerifyOTP.this,"Verification Completed!",Toast.LENGTH_SHORT).show();
} else {
if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
Toast.makeText(VerifyOTP.this,"Verification Failed! Please try again",Toast.LENGTH_LONG).show();
}
}
}
});
}
日志:
E/CCP: getFullNumber: Could not parse number
I/Timeline: Timeline: Activity_launch_request time:218578976
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@a4a9614
E/zza: Problem retrieving SafetyNet Token: 7:
I/Timeline: Timeline: Activity_launch_request time:218581077
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@5459e2f
W/xample.desikha: Accessing hidden method Lsun/misc/Unsafe;->getInt(Ljava/lang/Object;J)I (greylist,linking,allowed)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.desikhao,PID: 19549
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/browser/customtabs/CustomTabsIntent$Builder;
at com.google.firebase.auth.internal.RecaptchaActivity.zza(com.google.firebase:firebase-auth@@20.0.0:92)
at com.google.firebase.auth.api.internal.zzeq.zza(com.google.firebase:firebase-auth@@20.0.0:79)
at com.google.firebase.auth.api.internal.zzeq.onPostExecute(com.google.firebase:firebase-auth@@20.0.0:88)
at android.os.AsyncTask.finish(AsyncTask.java:755)
at android.os.AsyncTask.access$900(AsyncTask.java:192)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7562)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.classNotFoundException: Didn't find class "androidx.browser.customtabs.CustomTabsIntent$Builder" on path: DexPathList[[zip file "/data/app/com.example.desikhao-Z6Qez6I7lCc14bx6bjFINg==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.desikhao-Z6Qez6I7lCc14bx6bjFINg==/lib/arm64,/system/lib64,/system/product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:230)
at java.lang.classLoader.loadClass(ClassLoader.java:379)
at java.lang.classLoader.loadClass(ClassLoader.java:312)
at com.google.firebase.auth.internal.RecaptchaActivity.zza(com.google.firebase:firebase-auth@@20.0.0:92)
at com.google.firebase.auth.api.internal.zzeq.zza(com.google.firebase:firebase-auth@@20.0.0:79)
at com.google.firebase.auth.api.internal.zzeq.onPostExecute(com.google.firebase:firebase-auth@@20.0.0:88)
at android.os.AsyncTask.finish(AsyncTask.java:755)
at android.os.AsyncTask.access$900(AsyncTask.java:192)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7562)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
请让我知道我在做什么错了。
解决方法
在build.gradle(:app)中实现“ androidx.browser:browser:1.2.0”