我一直在获取java.lang.String com.google.firebase.auth.FirebaseUser.getUid()';错误,尽管已确认他们是用户
我有相对较新的Fire Base实现。我已经做了同样的事情一遍又一遍,但现在当我使用它失败时,它仍然有效。当我试图从数据库中检索数据时出现错误。应用程序崩溃时会说nullpoint error getUid(),我将在下面发布错误。在我已经登录并验证该用户之后,会出现此错误 代码如下:我一直在获取java.lang.String com.google.firebase.auth.FirebaseUser.getUid()';错误,尽管已确认他们是用户,java,android,firebase,firebase-realtime-database,firebase-authentication,Java,Android,Firebase,Firebase Realtime Database,Firebase Authentication,我有相对较新的Fire Base实现。我已经做了同样的事情一遍又一遍,但现在当我使用它失败时,它仍然有效。当我试图从数据库中检索数据时出现错误。应用程序崩溃时会说nullpoint error getUid(),我将在下面发布错误。在我已经登录并验证该用户之后,会出现此错误 代码如下: import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.cont
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
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.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 java.util.HashMap;
import java.util.Objects;
import de.hdodenhof.circleimageview.CircleImageView;
public class SettingsActivity extends AppCompatActivity {
private Button UpdateAccountSettings;
private EditText UserName, UserStatus;
private CircleImageView UserProfileImage;
private FirebaseAuth mAuth;
private FirebaseUser currentUser;
private DatabaseReference RootRef;
private String currentUserID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
mAuth = FirebaseAuth.getInstance();
currentUser = mAuth.getCurrentUser();
currentUserID = currentUser.getUid();
RootRef = FirebaseDatabase.getInstance("https://chatrcsapp-default-rtdb.firebaseio.com").getReference();
IntializeFields();
UpdateAccountSettings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UpdateSettings();
}
});
RetrieveUserInfo();
}
private void IntializeFields() {
UpdateAccountSettings = findViewById(R.id.update_settings_button);
UserName = findViewById(R.id.set_user_name);
UserStatus = findViewById(R.id.set_profile_status);
UserProfileImage = findViewById(R.id.profile_image);
}
private void UpdateSettings() {
String setUserName = UserName.getText().toString();
String setUserStatus = UserStatus.getText().toString();
if(TextUtils.isEmpty(setUserName)){
Toast.makeText(this, "Insert User Name, please...", Toast.LENGTH_SHORT).show();
}
if(TextUtils.isEmpty(setUserStatus)){
Toast.makeText(this, "Insert User Status, please...", Toast.LENGTH_SHORT).show();
}
else {
HashMap<String, String> profileMap = new HashMap<>();
profileMap.put("uid", currentUserID);
profileMap.put("name", setUserName);
profileMap.put("status", setUserStatus);
RootRef.child("Users").child(currentUserID).setValue(profileMap)
.addOnCompleteListener(task -> {
if (task.isSuccessful()){
SendUserToMainActivity();
Toast.makeText(SettingsActivity.this, "Details Added Successfully...", Toast.LENGTH_SHORT).show();
}
else {
String message = task.getException().toString();
Toast.makeText(SettingsActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show();
}
});
}
}
private void RetrieveUserInfo() {
RootRef.child("Users").child(currentUserID)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if ((dataSnapshot.exists()) && (dataSnapshot.hasChild("name") && (dataSnapshot.hasChild("image")))){
String retrieveUserName = dataSnapshot.child("name").getValue().toString();
String retrieveUserStatus = dataSnapshot.child("status").getValue().toString();
String retrieveUserProfileImage = dataSnapshot.child("image").getValue().toString();
UserName.setText(retrieveUserName);
UserStatus.setText(retrieveUserStatus);
}
else if ((dataSnapshot.exists()) && (dataSnapshot.hasChild("name"))){
String retrieveUserName = dataSnapshot.child("name").getValue().toString();
String retrieveUserStatus = dataSnapshot.child("status").getValue().toString();
UserName.setText(retrieveUserName);
UserStatus.setText(retrieveUserStatus);
}
else{
UserName.setVisibility(View.VISIBLE);
Toast.makeText(SettingsActivity.this, "Please Update your Information...", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void SendUserToMainActivity() {
Intent mainActivity= new Intent(SettingsActivity.this, MainActivity.class);
mainActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainActivity);
finish();
}
private void SendUserToLoginActivity() {
Intent loginIntent = new Intent(SettingsActivity.this, LoginActivity.class);
loginIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(loginIntent);
finish();
}
}
错误消息非常明确: 所以不管你怎么想,在whic代码中,
currentUser
实际上是null
currentUser = mAuth.getCurrentUser();
currentUserID = currentUser.getUid();
这很可能是因为Firebase在代码运行时尚未设置mAuth.getCurrentUser()
。要防止出现这种情况,可以使用身份验证状态侦听器,以确保在身份验证状态更改时自动运行代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
mAuth = FirebaseAuth.getInstance();
RootRef = FirebaseDatabase.getInstance("https://chatrcsapp-default-rtdb.firebaseio.com").getReference();
IntializeFields();
UpdateAccountSettings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UpdateSettings();
}
});
mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
currentUser = mAuth.getCurrentUser();
currentUserID = currentUser.getUid();
if (user != null ) {
RetrieveUserInfo();
} else { //user is not logged in
...
}
}
});
};
}您的currentUser为空,这是一种常见情况。阅读以下内容:感谢您的回复,我已经尝试过了,但应用程序确实会从主活动进入设置活动,但当我更新设置()时;它崩溃了,这意味着它不从Firebase检索数据,而是以空状态运行它的活动。我的答案集中在
设置活动。onCreate
,因为这是您问题中的堆栈跟踪。根据我的回答,特定的堆栈跟踪应该已经消失。是这样吗?如果是这样,这就回答了您在这个问题中发布的错误。其他地方的基本问题可能与我在回答中解释的问题相同:在大多数地方,您不能依赖getCurrentUser()
返回实际用户,需要将其置于身份验证状态侦听器中。嘿@Arthur2020有何更新?
currentUser = mAuth.getCurrentUser();
currentUserID = currentUser.getUid();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
mAuth = FirebaseAuth.getInstance();
RootRef = FirebaseDatabase.getInstance("https://chatrcsapp-default-rtdb.firebaseio.com").getReference();
IntializeFields();
UpdateAccountSettings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UpdateSettings();
}
});
mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
currentUser = mAuth.getCurrentUser();
currentUserID = currentUser.getUid();
if (user != null ) {
RetrieveUserInfo();
} else { //user is not logged in
...
}
}
});
};