【问题标题】:How do I get Firebase Phone Authentication to work for my app?如何让 Firebase 电话身份验证适用于我的应用?
【发布时间】:2018-08-22 12:04:50
【问题描述】:

不知道我做错了什么,我已经在 Stack Overflow 上搜索并阅读文章和观看视频,但仍然没有解决方案。

基本上我想通过 Firebase 向用户的手机发送短信以验证电话号码。我的应用程序不在 Play 商店或类似的地方,我只是通过使用 USB 电缆将手机连接到 PC 来运行它。

据我所知,我已正确设置。这是我在 Android Studio 中看到的:

在 FireBase 中:

这是我的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity  {

    EditText editTextPhone, editTextCode;

    FirebaseAuth mAuth;

    String codeSent;

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

        mAuth = FirebaseAuth.getInstance();

        editTextCode = findViewById(R.id.editTextCode);
        editTextPhone = findViewById(R.id.editTextPhone);

        findViewById(R.id.buttonGetVerificationCode).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendVerificationCode();
            }
        });


        findViewById(R.id.buttonSignIn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                verifySignInCode();
            }
        });
    }

    private void verifySignInCode(){
        String code = editTextCode.getText().toString();
        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(codeSent, 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()) {
                        //here you can open new activity
                        Toast.makeText(getApplicationContext(),
                            "Login Successfull", Toast.LENGTH_LONG).show();
                    } else {
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            Toast.makeText(getApplicationContext(),
                                "Incorrect Verification Code ", Toast.LENGTH_LONG).show();
                        }
                    }
                }
            });
    }

    private void sendVerificationCode(){

        String phone = editTextPhone.getText().toString();

        if(phone.isEmpty()){
            editTextPhone.setError("Phone number is required");
            editTextPhone.requestFocus();
            return;
        }

        if(phone.length() < 10 ){
            editTextPhone.setError("Please enter a valid phone");
            editTextPhone.requestFocus();
            return;
        }

        System.out.println("code should be sent");

        PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phone,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            this,               // Activity (for callback binding)
            mCallbacks);        // OnVerificationStateChangedCallbacks
    }



    PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        @Override
        public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {

        }

        @Override
        public void onVerificationFailed(FirebaseException e) {

        }

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

            codeSent = s;
        }
    };


}

当我单击获取验证按钮时,我在日志中看到System.out.println,“应该发送代码”,所以按钮工作正常,只是没有发送代码。请问有什么想法吗?

另外,我相信我已经正确设置了我的 SHA-1。我通过单击 Gradle 选项卡中的“signingReport”并将数字复制到 Firebase 控制台从 Android Studio 获得它,如下所示。

【问题讨论】:

  • 可能是免打扰服务,不确定。也可以用其他号码试试。并尝试打印一些登录 onVerificationFailed()onCodeSent()
  • @CHarris,您是否在 firebase 控制台中设置了应用的 SHA-1 哈希?
  • @RaviRupareliya 试过不同的手机,都不行。
  • @NiravBhavsar 我最初确实设置了 SHA-1,但没有工作,但后来我删除了该项目,因为不确定它是否设置正确,开始了一个新的 Firebase 项目,这次没有设置 SHA-1,因为我真的想从最基本的开始并逐个消除可能的问题。SHA-1 是必需的,即使不在 Play 商店中?
  • @CHarris,是的,当您在调试模式和发布模式下运行时,SHA-1 是必需的。

标签: java android firebase firebase-authentication


【解决方案1】:

带国家代码的通行证号码,例如 +91-(10 位数字)

【讨论】:

  • 谢谢,但我已经这样做了 - 将国家代码放在手机号码之前。
【解决方案2】:

这里一切看起来都很好。 我认为出了问题的是移动输入字段,即editTextPhone,因为firebase使用了

的格式

[国家代码 10 位手机号]

例如。印度 +91 9090102030

因此,您应该在 onVerificationFailed 方法的日志部分中抛出异常或将其打印出来。

【讨论】:

    【解决方案3】:

    我的代码是基于这个视频,我从推荐的github账号复制粘贴源代码:

    https://www.youtube.com/watch?v=N6HBStmDkMQ

    在我的 Firebase 控制台中一切看起来都不错,源代码正在加载并且没有错误 - 除了发送的 SMS 我的意思是 - 所以我从这个项目中复制并粘贴了代码,而不需要更改任何 FireBase设置:

    https://www.simplifiedcoding.net/firebase-phone-authentication-android-tutorial/

    现在它正在发送 SMS 消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多