【问题标题】:Phone Auth Credential电话验证凭证
【发布时间】:2020-02-16 06:44:04
【问题描述】:

我正在使用 PhoneAuthCredential,它工作正常,但我需要在将他重定向到家庭活动之前检查用户是否提供了一些数据,例如用户名和电子邮件,如果我没有找到这些数据,我必须将他重定向到注册活动,这样我就可以在他登录之前获取这些数据

public class VerifyPhoneActivity extends 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_verify_phone);

        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()) {

                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            if(user!=null){
                                Intent intent = new Intent(VerifyPhoneActivity.this, DriverHome.class);
                                startActivity(intent);
                                finish();
                            }else {
                                Intent intent = new Intent(VerifyPhoneActivity.this, StartActivity.class);
                                startActivity(intent);
                                finish();
                            }

                        }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】:

    这个问题不是很清楚。您希望从哪个活动中获得这些信息?

    创建一个活动来获取用户的信息。 例如:-UserInformationActivity

    在 java 文件中你可以创建一个 firebase 数据库节点来存储这些信息

    数据库参考:

    DatabaseReference userinfo=FirebaseDatabase.getInstance().getReference().child("User Info").child(FirebaseAuth.getInstance().getCureentUser().getUid());
    

    使用Hashmap 将数据插入到节点中。

    Hashmap hash = new Hashmap();
    hash.put("Username", username);
    hash.put("Email", email);
    userinfo.updateChildren(hash);
    

    在您的VerifyPhoneActivity 类中,当您成功验证用户身份时,检查该引用的数据快照是否存在于 firebase 数据库中。像这样更新VerifyPhoneActivity 类中的代码:

    final DatabaseReference us=FirebaseDatabase.getInstance().getReference().child("User Info").child(FirebaseAuth.getInstance().getCurrentUser.getUid())
    

    然后像这样更新你的 signInwithCredential() 方法:

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if(user!=null){
        us.addValueEventlistner(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                    Intent intent = new Intent(VerifyPhoneActivity.this, DriverHome.class);
                    startActivity(intent);
                    finish(); }
                else{
                    Intent gotoUserInfo=new Intent(VerifyPhoneActivity.this,UserInformationActivity.class);
                    startActivity(gotoUserInfo);
                    finish();
                } }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }
    else {
        Intent intent = new Intent(VerifyPhoneActivity.this, StartActivity.class);
        startActivity(intent);
        finish();
    }
    

    希望这会有所帮助。谢谢!

    【讨论】:

    • 我试过你的代码,但它不起作用,让我解释一下我到底想要什么,我想创建像 Uber 这样的电话身份验证凭证,我的意思是当用户第一次使用该应用程序时在电话认证后完成他的注册信息,然后他将能够移动到 DriverHome 活动,但下次他使用认证时,他将自动重定向到 DriverHome 活动。
    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2018-03-07
    • 2012-10-27
    • 2015-09-05
    相关资源
    最近更新 更多