【问题标题】:How to create phone auth credential like Uber?如何创建像 Uber 这样的电话身份验证凭证?
【发布时间】:2020-02-16 08:14:20
【问题描述】:

我想创建像 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);
    }
};

}

【问题讨论】:

    标签: java android android-intent firebase-authentication


    【解决方案1】:

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

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

    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);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2022-06-24
      • 2020-02-16
      • 2021-07-13
      • 1970-01-01
      • 2019-03-05
      • 2018-12-14
      • 2018-09-04
      相关资源
      最近更新 更多