FireBase 身份验证登录/注册异常

Posted

技术标签:

【中文标题】FireBase 身份验证登录/注册异常【英文标题】:FireBase Authentication login/register Exception 【发布时间】:2018-06-19 03:35:58 【问题描述】:

大家好,我在使用 FireBase 创建用户和注册用户时遇到问题。下面是注册和登录的代码。我得到 nullPointer Exception 并且无法理解为什么.. 进行了初始化但尝试了这么多天却无法弄清楚。

注册:

public class RegisterActivity extends Activity 

        private EditText mDisName;
        private EditText mMail;
        private EditText mPass;
        private Button reg;
        private TextView error;
        private FirebaseAuth regAuth;
        private ProgressBar myprog;
        private int Progress =0;
        private Handler myHandler= new Handler();
        private DatabaseReference databaseRef;
        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_register);
            mDisName =(EditText) findViewById(R.id.reg_name);
            mMail = (EditText) findViewById(R.id.reg_mail);
            mPass = (EditText) findViewById(R.id.reg_password);
            reg = (Button) findViewById(R.id.reg_button);
            error = (TextView) findViewById(R.id.textView4);
            myprog = (ProgressBar) findViewById(R.id.progressbar);
            regAuth = FirebaseAuth.getInstance();
            databaseRef = FirebaseDatabase.getInstance().getReference().child("UserNames :");

            reg.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View view) 
                    String disName = mDisName.getText().toString();
                    String dmail = mMail.getText().toString();
                    String pass = mPass.getText().toString();
                    new Thread(new Runnable() 
                        @Override
                        public void run() 
                            while(Progress < 100) 
                                Progress++;
                                android.os.SystemClock.sleep(30);
                                myHandler.post(new Runnable() 
                                    @Override
                                    public void run() 
                                        myprog.setProgress(Progress);
                                    
                                );
                            

                        
                    ).start();
                    registerUser(disName,dmail,pass);
                
            );
        



        public void registerUser(final String displayName,String email, String password)
            databaseRef.push().setValue(displayName);
         -->Error line <--   regAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) 
                        if (task.isSuccessful()) 
                            Intent loginIntent = new Intent(RegisterActivity.this, login.class);
                            startActivity(loginIntent);
                            Spannable errormes = new SpannableString("\"Registration Successful As User :\"" + displayName);
                            errormes.setSpan(new ForegroundColorSpan(Color.GREEN), 0, errormes.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                            error.setText(errormes);
                            //finish();
                         else 
                            Toast.makeText(RegisterActivity.this, "Error with registration!", Toast.LENGTH_LONG).show();
                            error.setText("     Error 110! User already exists! \n    Please provide different username!");
                            try 
                                throw task.getException();
                             catch (FirebaseAuthWeakPasswordException e) 
                                Log.e("Exception", e.getMessage());
                             catch (FirebaseAuthInvalidCredentialsException e) 
                                Log.e("Exception", e.getMessage());
                             catch (FirebaseAuthUserCollisionException e) 
                                Log.e("Exception", e.getMessage());
                             catch (Exception e) 
                                Log.e("Exception", e.getMessage());
                            
                        
                    
                );

        

    

发布注册活动的日志错误:

java.lang.NullPointerException 在 com.google.android.gms.internal.zzdvv.zzb(未知来源) 在 com.google.android.gms.internal.zzdwc.zza(未知来源) 在 com.google.firebase.auth.FirebaseAuth.createUserWithEmailAndPassword(未知 资源) 在 com.package.myapp.RegisterActivity.registerUser(RegisterActivity.java:88) 在 com.package.myapp.RegisterActivity$1.onClick(RegisterActivity.java:79) 在 android.view.View.performClick(View.java:4438) 在 android.view.View$PerformClick.run(View.java:18422) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5017) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 在 dalvik.system.NativeStart.main(Native Method)

登录也会发生同样的事情(注册用户后,使用网站上的 firebase plus 按钮)

登录活动示例代码:

java.lang.IllegalStateException:无法执行的方法 活动 在 android.view.View$1.onClick(View.java:3823) 在 android.view.View.performClick(View.java:4438) 在 android.view.View$PerformClick.run(View.java:18422) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5017) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 在 dalvik.system.NativeStart.main(本机方法) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 android.view.View$1.onClick(View.java:3818) 在 android.view.View.performClick(View.java:4438) 在 android.view.View$PerformClick.run(View.java:18422) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5017) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 在 dalvik.system.NativeStart.main(本机方法) 引起:java.lang.NullPointerException 在 com.google.android.gms.internal.zzdvv.zzb(未知来源) 在 com.google.android.gms.internal.zzdwc.zzb(未知来源) 在 com.google.firebase.auth.FirebaseAuth.signInWithEmailAndPassword(未知 资源) 在 com.package.myapp.login.login(login.java:143)

下面还提供了登录java类:

public class login extends Activity 

    private EditText user;
    private EditText password;
    private TextView registerView;
    private TextView loginView;
    private Spannable errormes;
    private FirebaseAuth mAuth;
    private Button login;
    private CallbackManager callbackManager ;
    private ImageView loginIma;
    private ImageView image;
    private ImageView image2;
    private CardView cardView;

    private GoogleSignInOptions gso;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        user = (EditText) findViewById(R.id.username);
        image=(ImageView)findViewById(R.id.imageView4);
        image2=(ImageView)findViewById(R.id.imageView3);
        errormes = new SpannableString("Error 100! User doesnt exists! \n Please register first");
        userdatabase = FirebaseDatabase.getInstance().getReference().child("Users :");
        mAuth = FirebaseAuth.getInstance();
        registerView = (TextView) findViewById(R.id.registerView);
        password = (EditText)findViewById(R.id.passwordView);
        callbackManager = CallbackManager.Factory.create();
        boolean loggedIn = AccessToken.getCurrentAccessToken() == null;
        cardView=(CardView)findViewById(R.id.cardView);
        loginView = (TextView) findViewById(R.id.loginView);

        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() 
                    @Override
                    public void onSuccess(LoginResult loginResult) 
                        Intent account = new Intent(login.this,menu_activity.class);
                        startActivity(account);
                    

                    @Override
                    public void onCancel() 
                        Intent main = new Intent(login.this,login.class);
                        startActivity(main);
                        finish();

                    

                    @Override
                    public void onError(FacebookException exception) 
                        Toast.makeText(login.this, "Error 500! Facebook login failed!", Toast.LENGTH_SHORT).show();
                    
                );

    





    private int size = 0;
    private HashMap<String, String> users = new HashMap<String, String>();

    private DatabaseReference userdatabase;

    private FirebaseAuth.AuthStateListener mAuthListener;


    public void setSize(int newsize) 
        this.size = newsize;
    

    public void login(View view) 
        EditText user = (EditText) findViewById(R.id.username);
        EditText password = (EditText) findViewById(R.id.passwordView);
        Spannable errormes = new SpannableString("Error 100! User doesnt exists! \n Please register first");
        errormes.setSpan(new ForegroundColorSpan(Color.RED), 0, errormes.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        Intent userAcc = new Intent(login.this,menu_activity.class);
        startActivity(userAcc);

    **//error line** mAuth.signInWithEmailAndPassword(user.getText().toString(), password.getText().toString())
                        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) 
                                if (task.isSuccessful()) 
                                    // Sign in success, update UI with the signed-in user's information
                                    Log.d("Loged on!", "signInWithEmail:success");
                                    Toast.makeText(login.this, "Loged On!.", Toast.LENGTH_SHORT).show();
                                    Intent userAcc = new Intent(login.this,menu_activity.class);
                                    startActivity(userAcc);
                                 else 
                                    // If sign in fails, display a message to the user.
                                    Log.w("Login Failed!", "signInWithEmail:failure", task.getException());
                                    Toast.makeText(login.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
                                

                                // ...
                            
                        );
        

如果有人能提供帮助,我会很高兴。提前致谢!

【问题讨论】:

您是否检查过您传递给注册和登录的参数? 在应用程序初始化此警告时查看 logcat:W/GooglePlayServicesUtil: Google Play services out of date。设备或模拟器必须安装支持构建应用的 Firebase SDK 版本的 Play 服务版本。 Benjith binja 感谢您的新编辑! @BobSnyder 会看看这个 @BobSnyder 是的,非常感谢你 【参考方案1】:

感谢@BobSnyder,问题出在 api 上。您必须安装带有 (Google API) 插件的 API。

【讨论】:

以上是关于FireBase 身份验证登录/注册异常的主要内容,如果未能解决你的问题,请参考以下文章

Firebase UI 身份验证登录错误 api 异常

该电子邮件地址已被另一个帐户使用(使用电子邮件/密码 Firebase 进行身份验证)

密码注册后 Firebase 云功能出现未经身份验证的错误

Flutter:Firebase身份验证无需登录即可创建用户

颤动的firebase身份验证提供者未通知

Firebase 身份验证会话未过期 [重复]