안녕하세요. 오늘은 안드로이드 채팅앱을 만들어보려합니다.
말이 채팅앱이지 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
출처: https://www.blueswt.com/77 [꿈꾸는열정기록보관소]
'개발 > Adroid' 카테고리의 다른 글
[android] 20분만에 채팅App만들기 -Firebase(2) (0) | 2019.10.29 |
---|---|
[android] 20분만에 채팅App만들기 -Firebase(1) (0) | 2019.10.29 |
[android] 20분만에 채팅App만들기 -Firebase(1) (0) | 2019.10.26 |
[android] PagerSlidingTabStrip (0) | 2019.10.21 |
[android] 문자열 리소스 <string> (0) | 2019.10.16 |
댓글