无法从Firebase Phone Auth(印度)接收OTP

时间:2019-12-24 01:25:22

标签: android kotlin firebase-authentication

我正在创建一个使用Firebase Phone Auth中的signIn的android应用程序。我以前使用的是电子邮件验证,它的工作原理就像魅力一样,现在我正在同一项目上迁移到Phone Auth。我在Fragment上写我的身份验证,当我遵循给定链接https://firebase.google.com/docs/auth/android/phone-auth时,出现编译错误,提示“使用提供的参数无法调用以下函数”在“ PhoneAuthProvider.getInstance()。verifyPhoneNumber”上,下面是代码

渐变


    apply plugin: 'com.android.application'

    apply plugin: 'com.google.gms.google-services'

    apply plugin: 'kotlin-android'

    apply plugin: 'kotlin-android-extensions'

    apply plugin: 'kotlin-kapt'

    apply plugin: "androidx.navigation.safeargs.kotlin"


    android {
        compileSdkVersion 29
        buildToolsVersion "29.0.2"
        defaultConfig {
            applicationId "com.sstech.racemanager"
            minSdkVersion 22
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        // Enables data binding.
        dataBinding {
            enabled = true
        }

    }

    dependencies {
        // def versions
        def nav_version = "2.1.0"
        def lifecycle_version = "2.1.0"

    //    kapt("groupId:artifactId:version")
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        implementation 'androidx.appcompat:appcompat:1.1.0'
        implementation 'androidx.core:core-ktx:1.1.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        implementation 'androidx.legacy:legacy-support-v4:1.0.0'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
        // Add the Firebase SDK for Google Analytics
        implementation 'com.google.firebase:firebase-analytics:17.2.1'

        // Add the SDKs for any other Firebase products you want to use in your app
        // For example, to use Firebase Authentication and Cloud Firestore
        implementation 'com.google.firebase:firebase-auth:19.2.0'
        implementation 'com.google.firebase:firebase-firestore:21.3.1'
        implementation 'com.google.firebase:firebase-storage:19.1.0'
        implementation 'com.google.firebase:firebase-database:19.2.0'

        // Fragment
        implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
        implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

        // LifeCycle
        implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
        kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

        // Circle Image View
        implementation 'de.hdodenhof:circleimageview:3.0.1'
    }

片段类


    class RegisterPage : Fragment() {
        lateinit var binding: FragmentRegisterBinding
        lateinit var callbacks: PhoneAuthProvider.OnVerificationStateChangedCallbacks
        lateinit var mAuth: FirebaseAuth
        lateinit var otpPin: String
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?): View? {
            mAuth= FirebaseAuth.getInstance()

            binding = DataBindingUtil.inflate(inflater,
                R.layout.fragment_register,container,false)

            binding.loginAlready.setOnClickListener { view: View->
                view.findNavController().navigate(R.id.action_registerPage_to_logPage)
            }

            binding.register.setOnClickListener {
                    registerAUser(binding)

            }

            binding.loginImage.setOnClickListener{
                    selectimage()

            }

    //        view.findNavController().navigate(R.id.action_registerPage_to_logPage)


            return binding.root
        }

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
        }

        private fun selectimage(){
    //        val intent = Intent(Intent.ACTION_PICK_ACTIVITY)
    ////        intent.type="image/*"
            val intent = Intent(Intent.ACTION_GET_CONTENT)
            intent.type="image/*"
            startActivityForResult(Intent.createChooser(intent,"pick an image"),0)

        }
            var selectedImageUri : Uri?= null

        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            super.onActivityResult(requestCode, resultCode, data)
            Toast.makeText(activity,"entered result",Toast.LENGTH_SHORT).show()
            if(requestCode==0 && resultCode== Activity.RESULT_OK && data != null){
                // image ok
                try {
                     selectedImageUri = data.data
                    val bitmap: Bitmap =
                        MediaStore.Images.Media.getBitmap(activity?.contentResolver, selectedImageUri)
                        binding.loginImageRound.setImageBitmap(bitmap)
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                        binding.loginImage.alpha=0f
                    }else{
                        binding.loginImage.visibility=INVISIBLE
                    }
    //                val bitmapDrawable = BitmapDrawable(bitmap)
    //                binding.loginImage.setBackgroundDrawable(bitmapDrawable)
                }catch(ex:Exception){
                    Toast.makeText(activity, ex.localizedMessage,Toast.LENGTH_SHORT).show()
                }


            }else{
                if(requestCode==0){Toast.makeText(activity,"resultCode ok",Toast.LENGTH_LONG).show()}
                if(resultCode== Activity.RESULT_OK){Toast.makeText(activity,"resultCode error",Toast.LENGTH_LONG).show()}

                if(data==null){
                    Toast.makeText(activity,"Data is empty",Toast.LENGTH_LONG).show()
                }

            }
        }


       private fun registerAUser(binding: FragmentRegisterBinding){
           val phno : String = binding.loginPhno.text.toString()
           val name : String = binding.loginName.text.toString()
            if(phno.isEmpty() || name.isEmpty() ){
                Toast.makeText(activity,"Phone number/Name should not be empty",Toast.LENGTH_SHORT).show()
                return
            }
           if(phno.length!=10) {
               Toast.makeText(activity,"Phone number should be 10 numbers",Toast.LENGTH_SHORT).show()
               return
           }

           verify("+91$phno")

       }

        private fun verify(phno: String) {
            verificationCallbacks()
            Log.i("ph",phno)
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                phno, // Phone number to verify
                60, // Timeout duration
                TimeUnit.SECONDS, // Unit of timeout
                this, // Activity (for callback binding)
                callbacks) // OnVerificationStateChangedCallbacks
            Log.i("ph","Code Sent")
        }


        private fun verificationCallbacks (){
            callbacks= object : PhoneAuthProvider.OnVerificationStateChangedCallbacks(){
                override fun onCodeSent(p0: String, p1: PhoneAuthProvider.ForceResendingToken) {
                    super.onCodeSent(p0, p1)
                    Log.i("ph","On Code Sent Cred $p0")

                }

                override fun onCodeAutoRetrievalTimeOut(p0: String) {
                    super.onCodeAutoRetrievalTimeOut(p0)

                }

                override fun onVerificationCompleted(p0: PhoneAuthCredential) {
                    Log.i("ph","Sign in verification callback")
                   signInWithPhoneAuthCredential(p0)
                }

                override fun onVerificationFailed(p0: FirebaseException) {
                    if (p0 is FirebaseAuthInvalidCredentialsException) {
                        Toast.makeText(activity,"Invalid request",Toast.LENGTH_SHORT).show()
                    } else if (p0 is FirebaseTooManyRequestsException) {
                        Toast.makeText(activity,"Quota Over contact Developer",Toast.LENGTH_SHORT).show()
                    }
                }
            }

        }

        private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential){
            mAuth.signInWithCredential(credential)
                .addOnCompleteListener { task: Task<AuthResult> ->
                    if (task.isSuccessful) {
                        // Sign in success, update UI with the signed-in user's information

                        val user = task.result?.user
                        // ...
                    } else {
                        // Sign in failed, display a message and update the UI
                        if (task.exception is FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }

        }


    }

在跟踪和错误之后,我将MainActivity()放在“活动”位置后,我的错误消失了,但是如果代码没有进入OnCodeSent函数,我没有收到OTP。(我已启用电话验证功能我的控制台)

有人可以在这里帮忙吗?

1 个答案:

答案 0 :(得分:0)

当我将身份验证系统从邮件更改为电话号码时,我忘记了将应用程序重新连接到Firebase。

重新连接后一切正常