2

I'm getting this error

Updated error:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: xxx.com.xxx, PID: 4963
                  java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.tasks.Task
com.google.android.gms.common.api.GoogleApi.zzb(com.google.android.gms.common.api.internal.zzdf)'
on a null object reference
                      at com.google.android.gms.internal.zzdtp.zzb(Unknown Source)
                      at com.google.android.gms.internal.zzdtw.zza(Unknown Source)
                      at com.google.firebase.auth.FirebaseAuth.zza(Unknown Source)
                      at com.google.firebase.auth.PhoneAuthProvider.zza(Unknown Source)
                      at com.google.firebase.auth.PhoneAuthProvider.verifyPhoneNumber(Unknown
Source)
                      at xxx.com.xxx.PhoneNumberActivity.onClick(PhoneNumberActivity.java:110)
                      at android.view.View.performClick(View.java:5265)
                      at android.view.View$PerformClick.run(View.java:21534)
                      at android.os.Handler.handleCallback(Handler.java:815)
                      at android.os.Handler.dispatchMessage(Handler.java:104)
                      at android.os.Looper.loop(Looper.java:207)
                      at android.app.ActivityThread.main(ActivityThread.java:5728)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

When I try to run this code

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

In app build.gradle

implementation 'com.google.firebase:firebase-database:11.6.0'
implementation 'com.google.firebase:firebase-auth:11.6.0'

Why is it saying it's null? What is null? I'm running it on android device Android version 6.0. Is it because there's no sim card on the phone? I've already enabled phone authentication in the console and it's working on iOS.

Updates:

After Updating the version of firebase-core and firebasse-auth, the app doesn't crash any more.

implementation 'com.google.firebase:firebase-core:16.0.5'
implementation 'com.google.firebase:firebase-auth:16.0.5'

Found out it's caused by version 8.3.01 (2385995-434) Google Play services of the phone I'm testing on. Any solution to make it work with 8.3.01?

Error:

" W/GooglePlayServicesUtil: Google Play services out of date. Requires 12451000 but found 8301434"

Question:

How to control the min Google Play services version?

Rumit Patel
  • 8,830
  • 18
  • 51
  • 70
user1872384
  • 6,886
  • 11
  • 61
  • 103
  • Reason for downvoting please – user1872384 Nov 19 '18 at 07:49
  • *Is it because there's no sim card on the phone?* -> No. I'm using without SIM and it's working. and what variable you are getting `null?` – Rumit Patel Nov 19 '18 at 09:26
  • @RumitPatel I've updated the full error code when PhoneAuthProvider.getInstance().verifyPhoneNumber is called. I'm wondering what's the root cause for the app to crash as well. – user1872384 Nov 19 '18 at 09:49
  • update `com.google.gms:google-services`, `com.google.firebase:firebase-core`, and `com.google.firebase:firebase-auth` to the latest and try. – Rumit Patel Nov 19 '18 at 10:05
  • I'm using these: classpath 'com.google.gms:google-services:4.1.0' implementation 'com.google.firebase:firebase-database:11.6.0' implementation 'com.google.firebase:firebase-auth:11.6.0' Is it not compatible? is there a list showing which version of com.google.gms:google-services is compatible with com.google.firebase:? It's rather confusing – user1872384 Nov 22 '18 at 09:47

1 Answers1

3

You can have a look at this working code.

build.gradle(app-level)

dependencies {
    implementation 'com.google.firebase:firebase-core:16.0.5'
    implementation 'com.google.firebase:firebase-auth:16.0.5'
}

build.gradle(project-level)

buildscript {
    dependencies {
        classpath 'com.google.gms:google-services:4.1.0'
    }
}

Activity:

import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseException;
import com.google.firebase.FirebaseTooManyRequestsException;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;
import java.util.concurrent.TimeUnit;

public class FCMsmsTest extends AppCompatActivity {

    private EditText editText;
    private String mVerificationId = "";
    PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        @Override
        public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
            Toast.makeText(FCMsmsTest.this, "onVerificationCompleted " + phoneAuthCredential.toString(), Toast.LENGTH_SHORT).show();
            signInWithPhoneAuthCredential(phoneAuthCredential);
        }

        @Override
        public void onVerificationFailed(FirebaseException e) {
            Toast.makeText(FCMsmsTest.this, "onVerificationFailed " + e.toString(), Toast.LENGTH_SHORT).show();

            if (e instanceof FirebaseAuthInvalidCredentialsException) {
                Toast.makeText(FCMsmsTest.this, "Invalid Request " + e.toString(), Toast.LENGTH_SHORT).show();
            } else if (e instanceof FirebaseTooManyRequestsException) {
                Toast.makeText(FCMsmsTest.this, "The SMS quota for the project has been exceeded " + e.toString(), Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onCodeSent(String verificationId,
                               PhoneAuthProvider.ForceResendingToken token) {
            Toast.makeText(FCMsmsTest.this, "onCodeSent " + verificationId, Toast.LENGTH_SHORT).show();
            editText.setText("");

            mVerificationId = verificationId;
            PhoneAuthProvider.ForceResendingToken mResendToken = token;

            showDialog();

        }

    };

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

        editText = findViewById(R.id.edit_text);
        findViewById(R.id.btn_send_sms).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (editText.getText().toString().trim().length() > 9) {
                    sendSMS("+91" + editText.getText().toString().trim());
                } else {
                    Toast.makeText(FCMsmsTest.this, "Enter Valid PhoneNumber", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }

    private void sendSMS(String phoneNumber) {
        PhoneAuthProvider.getInstance().verifyPhoneNumber(
                phoneNumber,        // Phone number to verify
                60,                 // Timeout duration
                TimeUnit.SECONDS,   // Unit of timeout
                this,               // Activity (for callback binding)
                mCallbacks);
    }

    private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
        FirebaseAuth mAuth = FirebaseAuth.getInstance();
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Toast.makeText(FCMsmsTest.this, "signInWithCredential:success", Toast.LENGTH_SHORT).show();
                            FirebaseUser user = task.getResult().getUser();
                        } else {
                            Toast.makeText(FCMsmsTest.this, "signInWithCredential:failure", Toast.LENGTH_SHORT).show();
                            if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                                Toast.makeText(FCMsmsTest.this, "The verification code entered was invalid", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                });
    }

    private void showDialog() {
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        final EditText edittextCode = new EditText(FCMsmsTest.this);
        alert.setMessage("Enter Your Message");
        alert.setTitle("Enter Your Title");

        alert.setView(edittextCode);

        alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                String YouEditTextValueString = edittextCode.getText().toString();

                PhoneAuthCredential credential = PhoneAuthProvider.getCredential(mVerificationId, YouEditTextValueString);
                signInWithPhoneAuthCredential(credential);

            }
        });
        alert.show();
    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="50dp">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="+91" />

        <EditText
            android:id="@+id/edit_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="phone" />
    </TableRow>

    <Button
        android:id="@+id/btn_send_sms"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="Send OTP" />

</LinearLayout>

Update your project accordingly.

Rumit Patel
  • 8,830
  • 18
  • 51
  • 70
  • @user1872384 have you checked it out? – Rumit Patel Nov 27 '18 at 10:38
  • Rumit Patel, I've tried to upgrade the version but still doesn't receive an sms – user1872384 Nov 27 '18 at 14:04
  • I've found out that the phone I'm using is having version 8.3.01 (2385995-434) Google Play services which might be the root cause, are there any documentation stating that it must be higher than version 9.0.0? According to this answer https://stackoverflow.com/questions/43422021/android-auth-firebase-error-local-module-descriptor-class-for-com-google-fireba – user1872384 Nov 30 '18 at 06:20
  • However in the error logs it states that I need version "12.4.51.000" instead of "8.3.01.434" – user1872384 Nov 30 '18 at 06:46
  • You can check [this question.](https://stackoverflow.com/questions/17858215/google-play-services-out-of-date-requires-3159100-but-found-3158130) – Rumit Patel Nov 30 '18 at 07:51
  • also have a loot at [this question.](https://stackoverflow.com/questions/44584698/google-play-services-out-of-date-requires-11011000-but-found-10289574/45312782) and let me know if you have any issue. – Rumit Patel Nov 30 '18 at 07:58