安卓Firebase——使用getUid()无法获取用户ID——错误:空对象引用

10

我正在使用Firebase,并且已经成功实现了注册/登录活动,但我还希望每个用户能够更新用户名。 看起来我无法运行:

firebaseRef.getAuth().getUid()

我在应用程序仿真器中遇到了一个错误:“很抱歉,应用停止运行”。

这似乎是我在Android Studio监视器中遇到的主要错误:与getUid()有关。

java.lang.NullPointerException:尝试对空对象引用调用虚拟方法'java.lang.String com.firebase.client.AuthData.getUid()'

以下是我的活动代码:

package me.netsync.netconnect;

import android.app.ActionBar;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.firebase.client.AuthData;
import com.firebase.client.Firebase;

public class SettingActivity extends AppCompatActivity {

    private Firebase mRef;
    private Button BtnSettings;
    private EditText TxtUsername;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);

        mRef = new Firebase(Constants.FIREBASE_URL);

        BtnSettings = (Button)findViewById(R.id.BtnSettings);
        BtnSettings.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // username txt update the profile
                TxtUsername = (EditText)findViewById(R.id.TxtUsername);
                String TxtUsernameStr = TxtUsername.getText().toString();
                TxtUsernameStr = TxtUsernameStr.trim();

                // check we can get a userid
               /* if(mRef.getAuth() == null){
                    Intent intent = new Intent(SettingActivity.this,LoginActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                }*/

                if(TxtUsernameStr.isEmpty()){
                    // show a dialog box
                    AlertDialog.Builder builder = new AlertDialog.Builder(SettingActivity.this);
                    builder.setMessage("Please make sure you enter a Username" + TxtUsernameStr)
                            .setTitle("Error!")
                            .setPositiveButton(android.R.string.ok, null);
                    AlertDialog dialog = builder.create();
                    dialog.show();
                }else{
                    Firebase upDateUserProfile = new Firebase(Constants.FIREBASE_URL);
                    String uid = upDateUserProfile.getAuth().getUid();
                    User user = new User(TxtUsernameStr);
                    upDateUserProfile.child("users").child(uid).child("username").setValue(user);
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        int btn = item.getItemId();

        if(btn == R.id.action_logout){
            mRef.unauth();
            Intent intent = new Intent(this,LoginActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
        }

        if(btn == R.id.action_settings){
            mRef.unauth();
            Intent intent = new Intent(this,SettingActivity.class);
            startActivity(intent);
        }

        return true;
    }
}

非常感谢您提供的任何提示。


只是确认一下,我正在使用 Firebase 的简单电子邮件/密码登录。 - user3200080
这意味着AuthData为null,你确定用户已经登录了吗?尝试检查getAuth是否为null。[请参阅此链接](https://www.firebase.com/docs/android/guide/user-auth.html)此外,我建议您使用新的Firebase sdk。 - Borja
如果您使用了云选项,那么您很可能正在使用Firebase 2.x。您是否在firebase.google.com上创建了项目?如果是这样,您不能使用Firebase 2.x身份验证SDK,而应该使用此处记录的SDK:https://firebase.google.com/docs/auth/ - Frank van Puffelen
我也遇到了这个问题...并且正在按照文档进行操作,我正在使用版本9.4.0,不确定是否有问题?我的代码在这里http://stackoverflow.com/questions/40309345/firebase-uid-always-null - Lion789
非常感谢任何指点。希望这是一个微妙的双关语...如果是的话,我给予赞赏。 - darkpbj
显示剩余3条评论
5个回答

4
在你的应用程序build.gradle文件中,将以下内容添加到依赖项中:
compile 'com.google.firebase:firebase-auth:9.4.0'
import com.google.firebase.auth.FirebaseAuth;
...
...

if (FirebaseAuth.getInstance().getCurrentUser() == null) {
    //Go to login 
}
else{
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
}

我已经添加了一个if else,但它总是为空... http://stackoverflow.com/questions/40309345/firebase-uid-always-null - Lion789
1
为什么即使您检查了FirebaseAuth.getInstance().getCurrentUser()不为空,它仍然会显示警告方法调用'getUid'可能会产生'java.lang.NullPointerException'? - Slick Slime

1

FirebaseAuth.getInstance().getUid();

这个 API 在 Firebase 12.0.0 中似乎已被移除。

请改为使用以下代码: FirebaseAuth.getInstance().getCurrentUser().getUid();

需要进行适当的空值检查,或者升级到 Firebase 12.0.1,其中似乎现在有 @Hide 注释。


1
需要添加AuthStateListener。
        mAuth=FirebaseAuth.getInstance();
        mAuthListener=new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {


            if(firebaseAuth.getCurrentUser()==null){

               //Your action here

            }

        }
    };

0
  • 在MainActivity类之后添加以下内容:

    Firebase firebaseAuth;
    DatabaseReference reference;
    
  • 在onCreate的任何位置添加以下内容:

    String usern;
    usern = firebaseAuth.getInstance().getCurrentUser().getUid();
    
  • 将其上传到Firebase的相应子节点中:

    reference=FirebaseDatabase.getInstance()
              .getReference().child("Patients")
              .child("Patient" + usern).child("Pres");
    

-1

检查 Firebase 依赖项是否有更新的简单方法:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接