【问题标题】:Android Firebase - cant get userid using getUid() - Error: on null object referenceAndroid Firebase - 无法使用 getUid() 获取用户 ID - 错误:在空对象引用上
【发布时间】:2016-06-12 10:53:06
【问题描述】:

我正在使用 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 的简单电子邮件/密码登录。
  • 这意味着 AuthData 为空,您确定用户已登录吗?尝试检查 getAuth 是否为空。 See this link 此外,我建议您使用新的 Firebase sdk。
  • 我应该使用新的 Frebase SDK。我通过工作室安装它,在“云”设置下。
  • 似乎一旦我在我的 loginActivity 中进行了身份验证,我就开始了一个新的意图 (mainActivity)。当我单击菜单项转到我的 settingActivity 时,用户未通过身份验证。如何跨活动维护身份验证?

标签: android firebase firebase-authentication


【解决方案1】:

FirebaseAuth.getInstance().getUid(); 此 API 似乎已在 Firebase 12.0.0 中删除

改用这个 FirebaseAuth.getInstance().getCurrentUser().getUid();

使用适当的 null 检查,或使用 Firebase 12.0.1,我现在似乎有 @Hide 注释

【讨论】:

    【解决方案2】:

    需要添加AuthStateListener。

            mAuth=FirebaseAuth.getInstance();
            mAuthListener=new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
    
    
                if(firebaseAuth.getCurrentUser()==null){
    
                   //Your action here
    
                }
    
            }
        };
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在您的应用 build.gradle 中,将其添加到您的依赖项中

        编译'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();
        }
        

        【讨论】:

        【解决方案5】:
        • 在 Main Activity 类之后添加这个

          Firebase firebaseAuth;
          DatabaseReference reference;
          
        • onCreate中的任意位置添加

          String usern;
          usern = firebaseAuth.getInstance().getCurrentUser().getUid();
          
        • 上传到 Firebase 给他们相应的孩子

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

        【讨论】:

          猜你喜欢
          • 2019-06-07
          • 2018-08-11
          • 1970-01-01
          • 1970-01-01
          • 2020-08-13
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          • 2021-11-25
          相关资源
          最近更新 更多