当前位置: 首页 > 知识库问答 >
问题:

Android Firebase注销应用程序在我注销后崩溃

李甫
2023-03-14
String userID = Objects.requireNonNull(mAuth.getCurrentUser()).getUid();

它给出:

下面是我使用的代码:

@Override
protected void onStart() {
    super.onStart();
    usersRef.child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            if (!snapshot.hasChild("name"))
            {
                sendUserToLoginActivity();
            }
        }

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

        }
    });
    if (mAuth == null || currentUser == null || mAuth.getCurrentUser().getUid() == null ){
        finish();
        sendUserToLoginActivity();
    }
    else {
        if(mAuth.getCurrentUser().getProviderId() == "google.com"){
            user.setmGoogleSignInClient(mGoogleSignInClient);
        }
        user.setMauth(mAuth);
        if (loginOutFlag>-1)
            verifyUserExistence();
    }
    checkLocation();
    if (isNew!=null)
    {
        if (isNew.equals("true")){
            sendUserToSettingsActivity();
        }
    }
}

方法verifyUserExistance是;

 private void verifyUserExistence() {
    if (!verified && loginOutFlag > -1) {
        String currentUserID = mAuth.getCurrentUser().getUid();
        try {


            rootRef.child("Users").child(currentUserID).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.child("name").exists()) {
                        loginOutFlag = 1;
                        Toast.makeText(Main_Chat_Activity.this, "Welcome" + dataSnapshot.child("name").getValue().toString(), Toast.LENGTH_SHORT).show();
                        Log.w("Reportname:", dataSnapshot.child("name").getValue().toString());
                        Calendar cal = Calendar.getInstance();
                        final String timeNDate = cal.getTime().toString();
                        HashMap<String, Object> profileMap = new HashMap<>();
                        profileMap.put("connection", timeNDate);
                        rootRef.child("Users").child(currentUserID).updateChildren(profileMap)
                                .addOnCompleteListener(task ->
                                {
                                    if (task.isSuccessful()) {
                                        Toast.makeText(Main_Chat_Activity.this, "Success ", Toast.LENGTH_SHORT).show();
                                        verified = true;
                                        FirebaseMessaging.getInstance().getToken()
                                                .addOnCompleteListener(task13 -> {
                                                    String userID = Objects.requireNonNull(mAuth.getCurrentUser()).getUid();
                                                    if (!task13.isSuccessful()) {
                                                        Log.w("FCM", "Fetching FCM registration token failed", task13.getException());
                                                        return;
                                                    }

                                                    // Get new FCM registration token
                                                    String deviceToken = task13.getResult();

                                                    // Log and toast

                                                    Log.d("FCM", deviceToken);
                                                    Toast.makeText(Main_Chat_Activity.this, deviceToken, Toast.LENGTH_SHORT).show();
                                                    final int[] no = {0};
                                                    DatabaseReference tokens = usersRef.child(userID).child("device_tokens");
                                                    ValueEventListener valueEventListener = new ValueEventListener() {
                                                        @Override
                                                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                                                            no[0] = (int) snapshot.getChildrenCount();
                                                        }

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

                                                        }
                                                    };
                                                    tokens.addListenerForSingleValueEvent(valueEventListener);
                                                    String devName = "device" + no[0];
                                                    String token = deviceToken.split(":")[1];
                                                    usersRef.child(userID).child("device_tokens").child(devName)
                                                            .setValue(token)
                                                            .addOnCompleteListener(task12 -> {
                                                                if (task12.isSuccessful()) {
                                                                    Toast.makeText(Main_Chat_Activity.this, "Token updated succesfully.", Toast.LENGTH_LONG).show();
                                                                }
                                                            });

                                                });
                                    } else {
                                        String errorMSG = Objects.requireNonNull(task.getException()).toString();
                                        //user.setMauth(null);
                                        Toast.makeText(Main_Chat_Activity.this, "Error : " + errorMSG, Toast.LENGTH_SHORT).show();
                                    }

                                });

                    }
                }

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

                }
            });
        }
        catch (Exception e)
        {
            Log.d("EXCEPTION", e.toString());
        }
    }


}

我就是这样处理注销的;

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);

    if (item.getItemId() == R.id.main_logout_option) {
        updateUserStatus("offline");
        String currentUserID = mAuth.getCurrentUser().getUid();

        rootRef.child("Users").child(currentUserID).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                if (dataSnapshot.child("name").exists()) {

                    Calendar cal = Calendar.getInstance();
                    final String timeNDate = cal.getTime().toString();
                    HashMap<String, Object> profileMap = new HashMap<>();
                    profileMap.put("connection", timeNDate);
                    rootRef.child("Users").child(currentUserID).updateChildren(profileMap)
                            .addOnCompleteListener(task ->
                            {
                                if (task.isSuccessful()) {
                                    loginOutFlag = -1;
                                } else {
                                    String errorMSG = Objects.requireNonNull(task.getException()).toString();
                                    Toast.makeText(Main_Chat_Activity.this, "This error : " + errorMSG, Toast.LENGTH_SHORT).show();
                                }
                                mGoogleSignInClient.signOut().addOnCompleteListener(task1 -> {
                                    if (task1.isSuccessful()){
                                        mAuth.signOut(); // very important if you are using firebase.
                                        LoginManager.getInstance().logOut();
                                        sendUserToLoginActivity();
                                        finish();
                                    }
                                });
                            });
                }

            }

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

            }
        });

        sendUserToLoginActivity();
    }

    if (item.getItemId() == R.id.main_settings_option) {
        sendUserToSettingsActivity();
    }
    if (item.getItemId() == R.id.main_find_friends_option) {
        sendUserToFindFriendsActivity();
    }
    return true;
}

共有1个答案

金慈
2023-03-14

问题是我注销后,应用程序崩溃:

at line String userID = Objects.requireNonNull(mAuth.getCurrentUser()).getUid()

注销时,mauth对象CT变为null。因此,对这样的对象调用getCurrentUser(),而不是返回FirebaseUser对象,它将返回null,因此存在NullPointerExcepetion。

返回当前登录的FirebaseUser,如果没有,则返回null。

因此,解决问题的方法是等待异步操作完成,然后立即注销,否则,您将始终得到NullPointerExcepetion。

下面是一个示例,您可以等待,直到数据从实时数据库加载完毕:

  • 如何作为方法的结果返回DataSnapshot值?
 类似资料:
  • 问题内容: 我已经在我的应用中实现了GCM通知。我现在尝试在用户注销时注销该应用程序。我正在使用以下代码。执行此代码时,它将导致应用程序崩溃,并显示以下logcat: 这是代码: 问题答案: 将支持库更新为25.0.0后,我遇到了同样的问题。对我来说,更新下面的库之后,在应用程序gradle文件中,问题消失了。

  • 我已经设置了一个使用OKTA作为IDP的应用程序。该应用程序基于SAML。这部分工作正常。 但我无法注销。为此,我们有1。已启用单一注销2。设置单一注销URL(我从标题Identity Provider Single Logout URL下的IDP元数据中收到此URL)3。Sp问题(我从标题Identity Provider Issuer下的IDP元数据中收到此消息)4。签名证书(这是IDP的证书

  • jboss网站。xml 独立的。xml 网状物xml(摘录) 登录servlet。java(与doPost(…)相同) 我有一个自定义验证器,它扩展了DatabaseServerLoginModule,并覆盖createPasswordHash方法以确保其自身的安全性。 我的问题是,当我使用经理角色登录并使用其他浏览器更改登录用户的角色时,它会缓存该用户的角色。只有当我注销用户并再次登录时,他才能

  • 在我的本地开发Ubuntu框中,我使用MySQL和phpmyadmin来处理数据库。 每当phpmyadmin空闲1440秒(24分钟)时,会话将过期。我失去了我的位置,不得不登录并重新开始。 我尝试更改内的,但它仍然在1440秒内超时。 我已经重新启动了所有程序并清除了浏览器缓存(Firefox历史记录)- 我不知道为什么增加的超时没有生效。我做错了什么?

  • 问题内容: 我正在考虑为我的应用程序使用OAuth2。我尝试实现的体系结构如下: 我将拥有自己的(仅此)授权服务器 一些资源应用程序使用授权服务器验证对资源的访问 某些客户端应用程序(网络,移动设备)会将用户重定向到授权服务器进行身份验证,如果成功,则会在资源应用程序上使用api。 到目前为止,我已经成功实现了3个基本应用程序(1个身份验证服务器,1个资源服务器和1个客户端)之间的交互。我无法正常