📱인프런 모바일 App 😆
파이어베이스를 활용한 메신져 만들기 - Android

파이어베이스를 활용한 메신져 만들기 - Android

(9개의 수강평)

240명의 수강생

22,000원

평생
활용
수료증
19개 수업, 총 10시간 24분
위시리스트 추가
박수은 프로필

chat_messgages 생성이 안됩니다. 박수은 2018.07.23

하루 꼬박 강의 몇번반복해도...

sendMessage() 메서드 실행시 첫줄의

mChatMemeberRef = mFirebaseDb.getReference("chat_members").child(mChatId);

이게 작동을 안하는것 같습니다. RealTimeBase를 조회해도

  • chat_members
  • users

    밖에없네요... 뭐가 문제일까요??

    아래에 수업해주신 ChatActivity 소스코드 입니다.

    public class ChatActivity extends AppCompatActivity {

    private String mChatId;

    @BindView(R.id.senderBtn)

    ImageView mSenderButton;

    @BindView(R.id.edtContent)

    EditText mMessageText;

    private FirebaseDatabase mFirebaseDb;

    private FirebaseUser mFirebaseUser;

    private DatabaseReference mChatRef;

    private DatabaseReference mChatMemberRef;

    private DatabaseReference mChatMessageRef;

    private DatabaseReference mUserRef;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.content_chat);

    ButterKnife.bind(this);

    mChatId = getIntent().getStringExtra("chat_id");

    mFirebaseDb = FirebaseDatabase.getInstance();

    mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    mUserRef = mFirebaseDb.getReference("users");

    }

    @OnClick(R.id.senderBtn)

    public void onSendEvent(View v) {

    if (mChatId != null) {

    sendMessage();

    Log.d("sendMessgae","센드메시지 실행");

    } else {

    createChat();

    Log.d("createChat","크리트 채팅 실행");

    }

    }

    private void sendMessage() {

    //메세지 키 생성

    mChatMessageRef = mFirebaseDb.getReference("chat_messages").child(mChatId);

    // chat_message > {chat_id} > {message_id} > messageInfo

    String messageId = mChatMessageRef.push().getKey();

    Log.d("chat_messages", messageId);

    String messageText = mMessageText.getText().toString();

    if (messageText.isEmpty()) {

    return;

    }

    final TextMessage textMessage = new TextMessage();

    textMessage.setMessageText(messageText);

    textMessage.setMessageDate(new Date());

    textMessage.setChatId(mChatId);

    textMessage.setMessageId(messageId);

    textMessage.setMessageType(Message.MessageType.TEXT);

    textMessage.setReadUserList(Arrays.asList(new String[]{mFirebaseUser.getUid()}));

    String[] uids = getIntent().getStringArrayExtra("uids");

    if (uids != null) {

    textMessage.setUnreadCount(uids.length - 1);

    }

    mMessageText.setText("");

    mChatMemberRef.addListenerForSingleValueEvent(new ValueEventListener() {

    @Override

    public void onDataChange(final DataSnapshot dataSnapshot) {

    //unreadCount 셋팅하기 위한 대화 상대의 수 가져온다.

    long memberCount = dataSnapshot.getChildrenCount();

    textMessage.setUnreadCount((int) memberCount - 1);

    mChatMemberRef.child(textMessage.getMessageId()).setValue(textMessage, new DatabaseReference.CompletionListener() {

    @Override

    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

    Iterator<DataSnapshot> memberIterator = dataSnapshot.getChildren().iterator();

    while (memberIterator.hasNext()) {

    User chatMember = memberIterator.next().getValue(User.class);

    mUserRef.child(chatMember.getUid())

    .child("chats")

    .child(mChatId)

    .child("lastMessage")

    .setValue(textMessage);

    if (!chatMember.getUid().equals(mFirebaseUser.getUid())) {

    mUserRef.child(chatMember.getUid())

    .child("chats")

    .child(mChatId)

    .child("totalUnreadCount")

    .addListenerForSingleValueEvent(new ValueEventListener() {

    @Override

    public void onDataChange(DataSnapshot dataSnapshot) {

    long totalUnreadCount = dataSnapshot.getValue(long.class);

    dataSnapshot.getRef().setValue(totalUnreadCount+1);

    }

    @Override

    public void onCancelled(DatabaseError databaseError) {

    }

    });

    }

    }

    }

    });

    }

    @Override

    public void onCancelled(DatabaseError databaseError) {

    }

    });

    }

    private boolean isSentMessage = false;

    private void createChat() {

    //<방생성>

    //0. 방 정보 설정 <-- 기존 방이어야 가능함

    //1. 대화 상대가 내가 선택한 사람 추가

    //2. 각 상대별 chats에 방추가

    //3. 에너지 정보 중 읽은 사람에 내 정보 추가

    //4. 첫 메세지 전송

    final Chat chat = new Chat();

    mChatRef = mFirebaseDb.getReference("users").child(mFirebaseUser.getUid()).child("chats");

    mChatId = mChatRef.push().getKey();

    mChatMemberRef = mFirebaseDb.getReference("chat_members").child(mChatId);

    // mChatId = mChatRef.push() --> users >> uid >> chats >> chat_id 가져옴

    chat.setChatId(mChatId);

    chat.setCreateDate(new Date());

    //1:1 채팅

    String uid = getIntent().getStringExtra("uid");

    //1:n 채팅

    String[] uids = getIntent().getStringArrayExtra("uids");

    if (uid != null) {

    //1:1

    uids = new String[]{uid};

    }

    List<String> uidList = new ArrayList<>(Arrays.asList(uids));

    uidList.add(mFirebaseUser.getUid());

    // 방타이틀 == 나를제외한 사용자이름 출력

    final StringBuffer titleBuffer = new StringBuffer();

    for (String userId : uidList) {

    // 유저의 uid >> userInfo

    mUserRef.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {

    @Override

    public void onDataChange(final DataSnapshot dataSnapshot) {

    User member = dataSnapshot.getValue(User.class);

    mChatMemberRef.child(member.getUid())

    .setValue(member, new DatabaseReference.CompletionListener() {

    @Override

    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

    // USERS >> chats >> {chat_id} >> chatinfo

    dataSnapshot.getRef().child("chats").child(mChatId).setValue(chat);

    if (!isSentMessage) {

    Log.d("센드메세지","센드메세지 실행");

    sendMessage();

    isSentMessage = true;

    }

    }

    });

    }

    @Override

    public void onCancelled(DatabaseError databaseError) {

    }

    });

    }

    }

    }

0
이경준 프로필

언리드카운트가 long형인 이유가 있나요? 이경준 2018.06.29

int형으로 해도 무관하지 않나요?

이유가 있나요?

0
You lim 프로필

로그인 기능과 관련하여 You lim 2018.06.28

안녕하세요?

로그인 기능을 보면 구글과 연동 하는듯 한데 IRC처럼 비회원이 익명으로 채팅방에 참가 할 수 없는지요?

0
인프러러러런 프로필

sign in 누르고 구글 로그인하면 안넘어가요.. 인프러러러런 2018.04.23

왜그러죠 대체 firebase.google에 다 설정햇는데ㅔ 이러네요

1
MMK MMK 프로필

git hub 오류, 파이어베이스 데이타베이스 설정 MMK MMK 2018.03.22

view > LoginActivity에서

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {

....

user.setEmail(firebaseUser.getEmail());

user.setName(firebaseUser.getDisplayName());

user.setUid(firebaseUser.getUid());

받아오는 이메일 이름 아이디 값이 오류가 나오는데

어디서 고쳐야 하는것인지 잘 모르겠습니다.

파이어베이스에서 데이터베이스를 만드셨는데

무료 아이디여도 만드는데 문제는 없는건가요?

예제소스대로 따라 가려면 일일히 설명해주시는 구조들을 수강생이 만들어야 하는것인가요?

아니면 guthub처럼 파일로 불러올수 있는건가요?

0
Taewoo Jeon 프로필

프로젝트가 정상적으로 안드로이드 스튜디오에서 불러와지지 않습니다. Taewoo Jeon 2018.03.22

아래와 같은 에러가 납니다.

Gradle 'firebaseMsg' project refresh failed

Error: Failed to find build Tools revision 25.0.0

위의 툴을 인스톨하고 싱크 프로젝트해도 에러가 사라지지 않네요;;;어떻게 해야하나요?

0