如果用户已经存在,则Firebase登录应该转到主屏幕

时间:2020-07-19 21:21:15

标签: java android firebase-realtime-database firebase-authentication

首先,我将介绍我的应用程序的流程。
登录屏幕( SignInActivity.java)->输入详细信息( MainActivity.java )->主屏幕( HomeScreenActivity.java )< / strong>
在我的应用程序中,我使用了Firebase身份验证和Firebase数据库。当用户是新用户时,应从SignInActivity转到Main Activity,在该用户中输入他的姓名,简短说明和爱好。详细信息存储在Firebase数据库中,然后HomeScreenActivity打开,在“回收者视图”中显示用户详细信息。

但是当前发生的情况是当同一用户再次登录时,它再次询问用户详细信息。我想检查用户Firebase Auth中是否已经存在用户Google帐户,而不是询问详细信息,它应该直接转到HomeScreenActivity。

我在StackOverflow上检查了很多答案,但似乎没有任何效果。我尝试过的一件事是 additionalUserInfo.isNewUser ,但是在此应用中,当用户再次登录时崩溃,显示空错误,在HomeScreenActivity中显示用户详细信息。

SignInActivity.java

private void firebaseAuthWithGoogle(String idToken) {
        AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
        mAuthIn.signInWithCredential(credential)
                .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(TAG, "SignInWithCredential:success");
                            startActivity(new Intent(SignInActivity.this, MainActivity.class));
                            finish();

                        } else {
                            // If sign in fails, display a message to the user.
                            Toast.makeText(SignInActivity.this, "Authentication Failed", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }

MainActivity.java

public void init() {
        hobbiesContinueButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name=user.getText().toString().trim();
                String desc=description.getText().toString().trim();
                String hobby=spinner.getSelectedItem().toString();
                String image="default";
                String thumbnail="default";
                if(!TextUtils.isEmpty(name))
                {
                    FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
                    assert currentUser != null;
                    String userId=currentUser.getUid();

                    User user=new User(name,hobby,desc,image,thumbnail);
                    dbRef.child(userId).setValue(user);
                    startActivity(new Intent(getApplicationContext(), HomeScreenActivity.class));
                    finish();
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Enter a name",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }  

HomeScreenActivity.java

dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                imgvw = headerView.findViewById(R.id.imageView);
                imgvw.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //to open gallery
                        Intent galleryIntent = new Intent();
                        galleryIntent.setType("image/*");
                        galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                        startActivityForResult(Intent.createChooser(galleryIntent, "SELECT IMAGE"), GALLERY_PICK);
                    }
                });

                TextView nameDrawer = findViewById(R.id.navName);
                TextView descDrawer = findViewById(R.id.navDescription);
                User change = snapshot.getValue(User.class);
                assert change != null;
                //This is where null error occurs
                nameDrawer.setText(change.getUserName());
                descDrawer.setText(change.getUserDesc());

                //change profile picture
                image= Objects.requireNonNull(snapshot.child("userImage").getValue()).toString();
                Log.d(TAG, "onComplete: "+image);
                if(!image.equals("default")){
                    Picasso.get().load(image).placeholder(R.drawable.avatar).into(imgvw);
                }
            }


  

1 个答案:

答案 0 :(得分:0)

解决方案是在用户登录时首次将用户详细信息保存在共享首选项中,然后在用户注销并再次对其进行签名后,您将从共享首选项中获取数据并将其直接设置为编辑文本 尝试以下代码:

   ///save sharedpreferences
        SharedPreferences sharedPreferences = 
       getSharedPreferences("prefs",Context.MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPreferences.edit();
      editor.putString("username","put here your username"); //
      editor.putString("email","put your email here"); //you can add more details
      editor.apply();


        ///get sharedpreferences
        SharedPreferences sharedPreferences1 = 
        getSharedPreferences("prefs",Context.MODE_PRIVATE);
        String username = sharedPreferences1.getString("username","");
        String email = sharedPreferences1.getString("email","");
        
         //then here set the valeus from sharedpreferences to your edittexts