如何通过单一声明获取当前用户信息?

时间:2019-07-01 21:49:18

标签: java android firebase firebase-realtime-database

我有很多活动,并且我的应用程序中有很多方法,每个活动都需要最新的用户信息,例如fristname,lastname,firebase数据库中的用户名。为此,我必须每次通过以下代码声明变量。

 UserRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                {
                    if(dataSnapshot.exists())
                    {
                        String myProfileImage=dataSnapshot.child("username").getValue().toString();
                        String userfirstname=dataSnapshot.child("firstname").getValue().toString();
                        String userlastname=dataSnapshot.child("lastname").getValue().toString();
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
        });

所以,现在的问题是,有没有办法在全局中声明这三个变量,并且可以在任何活动中使用它?

4 个答案:

答案 0 :(得分:1)

您可以使用以下方式获取当前的Firebase用户:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

答案 1 :(得分:1)

您可以使用FirebaseUser类来解决您的问题。它具有强大的功能,可用于存储用户个人资料数据。

当用户登录或注册时,请从FirebaseDatabase获取所需的所有详细信息(名字,姓氏photoUrl)。获得这些值后,将它们传递给下面的方法:

public void saveUserData(String firstName, String lastName, String photoUrl) {

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
    .setDisplayName(firstName + " "+lastName)
    .setPhotoUri(Uri.parse(photoUrl))
    .build();

    user.updateProfile(profileUpdates)
      .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                Log.d(TAG, "User profile updated..");
            }
        }
    });
}

现在,只要您想检索用户的个人资料,请执行以下操作:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    for (UserInfo profile : user.getProviderData()) {
        String firstName = profile.getDisplayName().split(" ")[0];
        String lastName = profile.getDisplayName().split(" ")[1];
        Uri photoUrl = profile.getPhotoUrl();
    }
}

我希望这会有所帮助。快活的编码!

答案 2 :(得分:1)

将登录的用户信息存储在“共享首选项”中的最佳方法。您可以创建AppPreference类,并根据需要设置getter和setter。我指的是设置并获取有用信息的答案,以跟随该链接:-Preventing users to login again after closing the app

答案 3 :(得分:1)

免责声明:

尽管我将建议使用这种方法,但它是一种粗略的方法。要以正确的方式(使用FirebaseUser)解决此问题,请查看my other answer


您可以使用SharedPreferences解决此问题。简而言之,当用户注册时,您可以将其详细信息保存到名为SharedPreferences的临时存储中。每次需要它时,只需用最少的代码行即可检索它。

要将用户详细信息保存到SharedPreferences中,可以使用以下方法:

public void saveToSharedPreferences(String firstName, String lastName, String photoUrl) {

    // declare your sharedpreferences and editor variables
    SharedPreferences sharedPreferences = context.getSharedPreferences("USER", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();

    // save your values
    editor.putString("firstName", firstName);
    editor.putString("lastName", lastName);
    editor.putString("photoUrl", photoUrl);

    // commit your changes
    editor.apply();

}

要检索您的值,请使用以下代码行:

SharedPreferences sharedPreferences = context.getSharedPreferences("USER", MODE_PRIVATE);

String firstName = sharedPreferences.getString("firstName", "not found");
String lastName = sharedPreferences.getString("lastName", "not found");
String photoUrl = sharedPreferences.getString("photoUrl", "not found");
  

请注意,“未找到” 代表您的占位符String   如果没有数据可供检索。

我希望这会有所帮助。快活的编码!