Java 从firebase在导航栏中加载配置文件图像和用户名
我试图在导航标题中检索用户在注册过程中保存的配置文件图像和用户名。这是我做的一些事情。起初我试图获取字符串当前用户,但它显示空指针异常,然后我尝试使用if语句,并将子项从当前用户id更改为用户,它只解决了空指针问题,但没有从firebase检索数据 MainActivity.javaJava 从firebase在导航栏中加载配置文件图像和用户名,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图在导航标题中检索用户在注册过程中保存的配置文件图像和用户名。这是我做的一些事情。起初我试图获取字符串当前用户,但它显示空指针异常,然后我尝试使用if语句,并将子项从当前用户id更改为用户,它只解决了空指针问题,但没有从firebase检索数据 MainActivity.java import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.g
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;
import de.hdodenhof.circleimageview.CircleImageView;
public class MainActivity extends AppCompatActivity {
private NavigationView navigationView;
private DrawerLayout drawerLayout;
private RecyclerView postlist;
private Toolbar mToolbar;
private ActionBarDrawerToggle actionBarDrawerToggle;
private FirebaseAuth mAuth;
private FirebaseUser FirebaseUser;
private DatabaseReference UsersRef;
private CircleImageView NavProfileImage;
private TextView NavProfileUserName;
String currentUserID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FirebaseUser mFirebaseUser = mAuth.getCurrentUser();
if (mFirebaseUser != null) {
currentUserID = mFirebaseUser.getUid();
}
mAuth = FirebaseAuth.getInstance();
mToolbar =(Toolbar) findViewById(R.id.main_page_toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setTitle("Home");
drawerLayout = (DrawerLayout) findViewById(R.id.drawable_layout);
actionBarDrawerToggle = new ActionBarDrawerToggle(MainActivity.this,drawerLayout,R.string.drawer_open, R.string.drawer_close);
navigationView = (NavigationView)findViewById(R.id.navigation_view);
drawerLayout.addDrawerListener(actionBarDrawerToggle);
actionBarDrawerToggle.syncState();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
View navView = navigationView.inflateHeaderView(R.layout.nav_header);
NavProfileImage = (CircleImageView)navView.findViewById(R.id.nav_profile_image);
NavProfileUserName = (TextView) navView.findViewById(R.id.nav_user_full_name);
UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
if(dataSnapshot.exists())
{ if (dataSnapshot.hasChild("fullname")){
String fullname = dataSnapshot.child("fullname").getValue().toString();
NavProfileUserName.setText(fullname);
}if (dataSnapshot.hasChild("profileimages")) {
String image = dataSnapshot.child("profileimages").getValue().toString();
Picasso.with(MainActivity.this).load(image).placeholder(R.drawable.profile).into(NavProfileImage);
}else {
Toast.makeText(MainActivity.this, "Profile name do not exists...", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
{ UserMenuSelector(item);
return false;
}
});
}
@Override
protected void onStart() {
super.onStart();
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser == null)
{
sendUserToLoginActivity();
}else{
CheckUserExistance();
}
}
private void CheckUserExistance()
{
final String current_user_id = mAuth.getCurrentUser().getUid();
UsersRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!dataSnapshot.hasChild(current_user_id)){
sendUserToSetupActivity();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void sendUserToSetupActivity() {
Intent setupIntent = new Intent(MainActivity.this, SetupActivity.class);
setupIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(setupIntent);
finish();
}
private void sendUserToLoginActivity()
{
Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
loginIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(loginIntent);
finish();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (actionBarDrawerToggle.onOptionsItemSelected(item))
{
return true;
}
return super.onOptionsItemSelected(item);
}
private void UserMenuSelector(MenuItem item)
{
switch (item.getItemId())
{
case R.id.nav_home:
Toast.makeText(this,"Home",Toast.LENGTH_SHORT).show();
break;
case R.id.nav_post:
break;
case R.id.nav_Profile:
Toast.makeText(this,"profile",Toast.LENGTH_SHORT).show();
break;
case R.id.nav_find_friends:
Toast.makeText(this,"frns",Toast.LENGTH_SHORT).show();
break;
case R.id.nav_logout:
mAuth.signOut();
sendUserToLoginActivity();
break;
}
}
}
我使用glide从firebase加载图像。应该是这样的:
import com.bumptech.glide.Glide;
UserModel userModel = new UserModel;
Glide.with(YourActivity.this)
.load(userModel.getUser_image())
.into(user_image);
有关更多信息,请查看。在注册用户时,您应该这样保存用户信息
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
userModel.setUserid(user.getUid());
userModel.setMobile("120xxxxxxxx");
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName("Some Name")
.setPhotoUri("Phot url of the user")
.build();
user.updateProfile(profileUpdates);
然后,当您希望从用户信息中检索图像时,其他信息也会……
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
headerResult = new AccountHeaderBuilder()
.withActivity(MainActivity.this)
.withHeaderBackground(R.drawable.gradient_home_background)
.addProfiles(
new ProfileDrawerItem().withName(user.getDisplayName()).withEmail(user.getPhoneNumber()).withIcon(user.getPhotoUrl())
)
.withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() {
@Override
public boolean onProfileChanged(View view, IProfile profile, boolean currentProfile) {
return false;
}
})
.build();
} else {
headerResult = new AccountHeaderBuilder()
.withActivity(MainActivity.this)
.withHeaderBackground(R.drawable.gradient_home_background)
.withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() {
@Override
public boolean onProfileChanged(View view, IProfile profile, boolean currentProfile) {
return false;
}
})
.build();
}
看到您的数据库结构后,我相信
Users
节点中的子节点是当前firebase用户的UID
,在Users
节点中,如果您试图获取当前用户的用户详细信息,那么您的查询应该是这样的
if (mFirebaseUser != null) {
currentUserID = mFirebaseUser.getUid();
}
UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
if(dataSnapshot.exists())
{ if (dataSnapshot.hasChild("fullname")){
String fullname = dataSnapshot.child("fullname").getValue().toString();
NavProfileUserName.setText(fullname);
}if (dataSnapshot.hasChild("profileimages")) {
String image = dataSnapshot.child("profileimages").getValue().toString();
Picasso.with(MainActivity.this).load(image).placeholder(R.drawable.profile).into(NavProfileImage);
}else {
Toast.makeText(MainActivity.this, "Profile name do not exists...", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我明白了,你在初始化它之前使用过mAuth!所以它返回null
FirebaseUser mFirebaseUser = **mAuth**.getCurrentUser();
if (mFirebaseUser != null) {
currentUserID = mFirebaseUser.getUid();
}
**mAuth = FirebaseAuth.getInstance();**
MovemAuth=FirebaseAuth.getInstance()代码>
FirebaseUser mFirebaseUser=mAuth.getCurrentUser()前面的一行代码>行glide是否有依赖项?是的,您只需要使用glideimport com.bumptech.glide.glide;我还需要添加注释处理器吗?是的,在github链接上,他们解释了如何在项目上添加注释处理器。我认为您在数据库上的查询是错误的。显示firebase数据库结构。您已将Users
节点作为基本数据库引用,并且您正在查询另一个同名的子节点,即UsersRef.child(“Users”)。我已添加firebase,请在下面重试我的回答。希望它能起作用。添加此行mAuth=FirebaseAuth.getInstance()代码>此行上方FirebaseUser mFirebaseUser=mAuth.getCurrentUser()代码>从注册到存储,一切都很顺利,但在检索用户数据之前,我无法在导航栏上获取这些信息。用户必须使用某些firebase凭据登录。或者它会返回一个异常。得到这个:java.lang.NullPointerException:尝试在mezohn.com.alfachat1.MainActivity.onCreate(MainActivity.java:48)的空对象引用上调用虚拟方法'com.google.firebase.auth.FirebaseUser.com.google.firebase.auth.FirebaseAuth.getCurrentUser()。我从你的问题中复制了代码。只需将我的代码行更改为和您的代码行相同的代码行,其余代码行保持原样即可;添加此行mAuth=FirebaseAuth.getInstance()代码>这是在那里