1

我做了一個應用程序,可以讓用戶登錄並在谷歌地圖上設置標記,並將標記連接到屬於設置它的用戶的聊天室。無論我如何嘗試,Firebase用戶標識爲空?

現在的問題是,我不能在Chatactivity和MapFragment得到的uid無論我怎樣努力,也不斷出現空,我也不是什麼問題 下面是三個活動:

可有人請幫幫我~~

LoginActivity

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    auth = FirebaseAuth.getInstance(); 

    if (auth.getCurrentUser() != null) { 
     startActivity(new Intent(LoginActivity.this, MainActivity.class)); 
     finish(); 
    } 
    //authenticate user 
    auth.signInWithEmailAndPassword(email, password) 
      .addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         // there was an error 
         if (password.length() < 6) { 
          edUserid.setError("密碼太短,請輸入超過6個字元!"); 
         } else { 
          Toast.makeText(LoginActivity.this, "登入失敗", Toast.LENGTH_LONG).show(); 
         } 
        } else { 
         Toast.makeText(getApplicationContext(),"登入成功",Toast.LENGTH_LONG).show(); 
         startActivity(new Intent(LoginActivity.this, MainActivity.class)); 

         finish(); 
        } 
       } 
      }); 
} 

ChatActivity

fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      EditText input = (EditText)findViewById(R.id.input); 

      // Read the input field and push a new instance 
      // of ChatMessage to the Firebase database 
      FirebaseDatabase.getInstance() 
        .getReference(CHAT_PATH) 
        .push() 
        .setValue(new ChatMessage(input.getText().toString(), 
          FirebaseAuth.getInstance() 
            .getCurrentUser() 
            .getDisplayName()) 
        ); 

      // Clear the input 
      input.setText(""); 
     } 
    }); 
    ListView listOfMessages = (ListView)findViewById(R.id.list_of_messages); 

    adapter = new FirebaseListAdapter<ChatMessage>(this, ChatMessage.class, 
      R.layout.message, FirebaseDatabase.getInstance().getReference(CHAT_PATH)) { 
     @Override 
     protected void populateView(View v, ChatMessage model, int position) { 
      // Get references to the views of message.xml 
      TextView messageText = (TextView)v.findViewById(R.id.message_text); 
      TextView messageUser = (TextView)v.findViewById(R.id.message_user); 
      TextView messageTime = (TextView)v.findViewById(R.id.message_time); 

      // Set their text 
      messageText.setText(model.getMessageText()); 
      messageUser.setText(model.getMessageUser()); 

      // Format the date before showing it 
      messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)", 
        model.getMessageTime())); 
     } 
    }; 

    listOfMessages.setAdapter(adapter); 

} 

} 

MapFragment(的一部分)

 mFirebaseDatabase = FirebaseDatabase.getInstance(); 


     mFirebaseRef = mFirebaseDatabase.getReference("Map/"+userUID); 
     mFirebaseRef.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

       LatLng myLatLon = dataSnapshot.getValue(FirebaseMarker.class).toLatLng(); 

       // stash the key in the title, for recall later 

       Marker myMarker = mgoogleMap.addMarker(new MarkerOptions() 
         .position(myLatLon).draggable(true).icon(BitmapDescriptorFactory.fromResource(R.drawable.seedloc2)).title(dataSnapshot.getKey())); 

       // cache the marker locally 
       markers.put(dataSnapshot.getKey(), myMarker); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       LatLng myLatLon = dataSnapshot.getValue(FirebaseMarker.class).toLatLng(); 

       // Move markers on the map if changed on Firebase 
       Marker changedMarker = markers.get(dataSnapshot.getKey()); 
       changedMarker.setPosition(myLatLon); 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
       Marker deadMarker = markers.get(dataSnapshot.getKey()); 
       deadMarker.remove(); 
       markers.remove(dataSnapshot.getKey()); 
       Log.v(TAG, "moved !" + dataSnapshot.getValue()); 


      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.v(TAG, "canceled!" + databaseError.getMessage()); 

      } 
     }); 

    } 
} 

@Override 
public void onMapReady(final GoogleMap googleMap) { 
    MapsInitializer.initialize(getContext()); 

    mgoogleMap = googleMap; 
    googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener(){ 

     @Override 
     public void onInfoWindowClick(Marker marker) { 
      Intent intent = new Intent(getActivity(),ChatActivity.class); 
      startActivity(intent); 



     } 
    }); 
+0

您是否在任何階段使用Firebase身份驗證? –

+0

是的,我使用電子郵件驗證,我有一個可以創建帳戶的活動,並且它成功獲取用戶ID,但其他活動不能。 –

回答

1

如果在這一活動中,你可以正確得到uid,這是你說的,然後保存uid的一個值變量並將其存儲到intent並在活動之間使用它。在每個活動中都沒有必要獲得uid。你只需要得到它一次。

//FirstActivity 
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
intent.putExtra("uid", uid); 
startActivity(intent); 

並獲得UID回到第二個活動,請使用此代碼:如果你需要uid在您的整個應用程序,然後使用SharedPreferences來存儲它

//SecondActivity 
String uid = (String) getIntent().getExtras().get("uid"); 

希望它有幫助。

+0

我明白了,讓我試試看,非常感謝。 –

相關問題