首页 > 解决方案 > 如何创建像 Uber 这样的电话身份验证凭证?

问题描述

我想创建像 Uber 这样的电话身份验证凭证,我的意思是当用户第一次使用该应用程序时,他必须在电话身份验证后完成他的注册信息,然后他才能移动到 DriverHome Activity,但下次他使用身份验证时,他将自动重定向到 DriverHome Activity。

我使用了电话身份验证凭据代码,它工作正常,但我需要添加负责检查用户是否之前注册的部分。

公共类 VerifyPhoneActivity 扩展 AppCompatActivity {

private String verificationId;
private FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;

DatabaseReference users;


ProgressBar progressBar;
TextInputEditText editText;
AppCompatButton buttonSignIn;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_verification_code);

    mAuth = FirebaseAuth.getInstance();

    progressBar = findViewById(R.id.progressbar);
    editText = findViewById(R.id.editTextCode);
    buttonSignIn = findViewById(R.id.buttonSignIn);

    String phoneNumber = getIntent().getStringExtra("phoneNumber");
    sendVerificationCode(phoneNumber);

    // save phone number
    SharedPreferences prefs = getApplicationContext().getSharedPreferences("USER_PREF",
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("phoneNumber", phoneNumber);
    editor.apply();

    buttonSignIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String code = editText.getText().toString().trim();

            if (code.isEmpty() || code.length() < 6) {

                editText.setError("Enter code...");
                editText.requestFocus();
                return;
            }
            verifyCode(code);
        }
    });

}

private void verifyCode(String code) {
    PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
    signInWithCredential(credential);
}

private void signInWithCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {

                        Intent intent = new Intent(VerifyPhoneActivity.this, DriverHomeActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

                        startActivity(intent);


                    }else {
                        Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                        progressBar.setVisibility(View.GONE);
                    }
                }
            });
}

private void sendVerificationCode(String number) {
    progressBar.setVisibility(View.VISIBLE);
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            number,
            60,
            TimeUnit.SECONDS,
            TaskExecutors.MAIN_THREAD,
            mCallBack
    );

    progressBar.setVisibility(View.GONE);
}

private PhoneAuthProvider.OnVerificationStateChangedCallbacks
        mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
        super.onCodeSent(s, forceResendingToken);
        verificationId = s;
    }

    @Override
    public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
        String code = phoneAuthCredential.getSmsCode();
        if (code != null) {
            editText.setText(code);
            verifyCode(code);
        }
    }

    @Override
    public void onVerificationFailed(FirebaseException e) {
        Toast.makeText(VerifyPhoneActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
        progressBar.setVisibility(View.GONE);
    }
};

}

标签: javaandroidandroid-intentfirebase-authentication

解决方案


在 onCreateView 之前检查 sharepreference 是否有电话号码,如果有,然后使用 startActivity(new Intent(this, DriverHomeActivity.class); 直接进入 driverhome 活动

如果 sharepreference 没有电话号码,则将电话号码保存在 sharepreference 中如果 signInWithCredential 的 onComplete 函数使用 isSucessful 返回成功

public class VerifyPhoneActivity extends AppCompatActivity {
private String verificationId;
private FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;
DatabaseReference users;
ProgressBar progressBar;
TextInputEditText editText;
AppCompatButton buttonSignIn;
SharedPreferences prefs ;
SharedPreferences.Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    prefs = getApplicationContext().getSharedPreferences("USER_PREF",
            Context.MODE_PRIVATE);
    editor = prefs.edit();

    //add this line
    if(prefs.getString("phoneNumber", null) != null)
      startActivity(new Intent(this, DriverHomeActivity.class));

    setContentView(R.layout.activity_verification_code);


    mAuth = FirebaseAuth.getInstance();

    progressBar = findViewById(R.id.progressbar);
    editText = findViewById(R.id.editTextCode);
    buttonSignIn = findViewById(R.id.buttonSignIn);

    String phoneNumber = getIntent().getStringExtra("phoneNumber");
    sendVerificationCode(phoneNumber);

    buttonSignIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String code = editText.getText().toString().trim();

            if (code.isEmpty() || code.length() < 6) {

                editText.setError("Enter code...");
                editText.requestFocus();
                return;
            }
            verifyCode(code);
        }
    });

}

private void verifyCode(String code) {
    PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
    signInWithCredential(credential);
}

private void signInWithCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()){

      //insert data if task is successful
                       editor.putString("phoneNumber", phoneNumber);
                       editor.apply();

                        Intent intent = new Intent(VerifyPhoneActivity.this, DriverHomeActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

                        startActivity(intent);


                    }else {
                        Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                        progressBar.setVisibility(View.GONE);
                    }
                }
            });
}

private void sendVerificationCode(String number) {
    progressBar.setVisibility(View.VISIBLE);
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            number,
            60,
            TimeUnit.SECONDS,
            TaskExecutors.MAIN_THREAD,
            mCallBack
    );

    progressBar.setVisibility(View.GONE);
}

private PhoneAuthProvider.OnVerificationStateChangedCallbacks
        mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
        super.onCodeSent(s, forceResendingToken);
        verificationId = s;
    }

    @Override
    public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
        String code = phoneAuthCredential.getSmsCode();
        if (code != null) {
            editText.setText(code);
            verifyCode(code);
        }
    }

    @Override
    public void onVerificationFailed(FirebaseException e) {
        Toast.makeText(VerifyPhoneActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
        progressBar.setVisibility(View.GONE);
    }
};

推荐阅读