안드로이드 채팅앱 (firebase 를 사용한)
안녕하세요. 오늘은 안드로이드 채팅앱을 만들어보려합니다.
말이 채팅앱이지 firebase 를 이용해서 만들면 정말 간단하게 구현할 수 있습니다.
구글 firebase는 정말 강력한 플랫폼인것 같습니다. 여러곳에서 사용되고 있는 FCM푸시 서비스도 그렇고
여러가지 강력한 서비스들을 무료로 사용할 수 있습니다. 이번에는 firebase 실시간 데이터베이스를 이용하여
앱을 만들어 보겠습니다.
우선은 firebase 프로젝트를 생성해야 합니다. 기존에 FCM 등에서 만들어둔 프로젝트에 추가하셔도 되구요.
이부분은 설명하지 않겠습니다.
1.추가된 프로젝트의 google-service.json 파일을 다운로드 받고 파일은 프로젝트/app 경로에 넣어주시면 됩니다. 다음은 라이브러리들을 추가해줍니다.
2.app 경로의 build.gradle 파일을 수정해줍시다.
1
2
3
4
5
6
7
8
9
|
...
dependencies {
implementation 'com.google.firebase:firebase-core:16+'
implementation 'com.google.firebase:firebase-database:16+'
...
}
|
cs |
//맨밑 하단부에 구글서비스 플러그인도 추가해줍니다.
1
|
apply plugin: 'com.google.gms.google-services'
|
cs |
프로젝트 경로의 build.gradle 파일 역시 수정해 줍니다.
1
2
3
4
5
6
7
|
dependencies {
...
classpath 'com.google.gms:google-services:4.0.1'
...
}
|
cs |
3. AndroidManifest.xml 에서 인터넷 권한을 추가해줍니다.
1
|
<uses-permission android:name="android.permission.INTERNET" />
|
cs |
4. 구글 콘솔의 ruleset 을 설정해 줍니다.
firebase console -> 프로젝트 진입 -> Database메뉴 -> 실시간데이터베이스 -> 규칙탭 으로 이동합니다.
그리고 아래와 같이 설정합니다.
1
2
3
4
5
6
7
8
|
{
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
".read": true,
".write": true
}
}
|
cs |
5. 소스코드 작성
설정은 끝났고 이제 소스코드를 작성하면 됩니다.
최대한 단순하게 구현해보았습니다. 1:1 대화 상황을 가정하여
화면에는 텍스트뷰와 버튼밖에 없습니다.
우선 메세지를 담아서 사용할 DTO 객체를 하나 만들어 줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public class ChatMessageDTO {
private String userName;
private String message;
public ChatMessageDTO() { }
public ChatMessageDTO(String userName, String message) {
this.userName = userName;
this.message = message;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
|
cs |
그리고 화면단의 구현입니다.
정말이지 간단하게 구현이 가능합니다. (예전에 복잡한 소켓통신을 이용해서 구현했던게 생각나네요...)
firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference = firebaseDatabase.getReference();
구글 데이터베이스객체를 참조하고
보낼때는 이렇게...
ChatMessageDTO chatData = new ChatMessageDTO("사용자A", msgText.getText().toString()); // 유저 이름과 메세지로 chatData 만들기
databaseReference.child("message").push().setValue(chatData); // 기본 database 하위 message라는 child에 chatData를 list로 만들기
받을때는
ChildEventListener 를 구현해서 콜백받습니다.
https://firebase.google.com/docs/reference/android/com/google/firebase/database/ChildEventListener
실시간 데이터베이스 이므로 firebase 상의 데이터를 감지하여 변경사항이 있다면 자동으로 콜백이 들어옵니다.
정말 신기하지 않습니까?~
예제 소스는 이쪽으로
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
public class MainActivity extends AppCompatActivity {
private TextView personTextA = null;
private TextView personTextB = null;
private EditText msgText = null;
private Button sendBtn = null;
private FirebaseDatabase firebaseDatabase = null;
private DatabaseReference databaseReference = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference = firebaseDatabase.getReference();
personTextA = findViewById(R.id.chat_texta); //나
personTextB = findViewById(R.id.chat_textb); //상대
msgText = findViewById(R.id.chatMsgText);
sendBtn = findViewById(R.id.msgSendBtn);
sendBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
ChatMessageDTO chatData = new ChatMessageDTO("사용자A", msgText.getText().toString()); // 유저 이름과 메세지로 chatData 만들기
databaseReference.child("message").push().setValue(chatData); // 기본 database 하위 message라는 child에 chatData를 list로 만들
Log.i("CHAT-TAG", msgText.getText().toString());
personTextA.setText(msgText.getText().toString());
msgText.setText("");
}
});
databaseReference.child("message").addChildEventListener(new ChildEventListener() {
// message는 child의 이벤트를 수신합니다.
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
ChatMessageDTO chatData = dataSnapshot.getValue(ChatMessageDTO.class); // chatData를 가져오고
personTextB.setText(chatData.getMessage()); //상대메세지
Log.i("CHAT-TAG",chatData.getMessage());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
|
cs |
참조
https://corikachu.github.io/articles/android/firebase/android-firebase-realtime-chatting-app
'개발 코딩 정보 공유 > 안드로이드 자바 코틀린' 카테고리의 다른 글
함께하는 스터디 도대체 자바가 뭐에유? 객체지향은 또 뭐람??? (0) | 2019.03.15 |
---|---|
자바 1.8 람다식 잘 사용해보자~! (0) | 2018.11.18 |
안드로이드 메모리 관리는 어떻게 ? (누수 예방법) (0) | 2018.10.20 |
안드로이드 FCM 푸시서버 예제 (0) | 2018.10.20 |
안드로이드 FCM 푸시서버 구현 (0) | 2018.10.16 |