안드로이드 채팅 (1/3) - 로그인과 회원가입(210414)
(210518 수정)
우리 일상생활 속
스마트폰으로 가장 많이 사용 되고 있는 카카오톡.
다른 앱들보다 친근한 앱이기에
더 재밌게 공부할 수 있었다.
채팅을 하려면 상대방과 채팅을 주고 받으며 대화를 해야 하기 때문에
간단한 회원가입을 하고 로그인을 하는 법 부터 공부해보겠다.
----------------------------------------------------------------------------------------------
첫 화면인 로그인화면을 activity_main.xml(ConstraintLayout)로 설정하고
이 xml파일을 인플레이션 시키는 액티비티를 MainActivity.class로 설정한다.
----생략------- (레이아웃은 ConstraintLayout, 로그인 버튼 id=login, 회원가입 버튼 id=register)
<EditText
android:id="@+id/etId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="ID"
android:ems="10"
android:layout_marginTop="36dp"
android:inputType="textEmailAddress"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
hint는 이름 그대로 힌트.
이 EditText가 어떤 내용의 위젯인지 힌트를 주는데, 문자를 하나라도 입력하면 보이지 않는다.
ems는 너비.
inputType을 textEmailAddress로 주면 @을 사용할 수 있는 문자열 키보드로 바뀌게 된다.
<EditText
android:id="@+id/etPw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="PASSWORD"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etId" />
inputType을 textPassword로 주면 문자를 입력할 때마다
비밀번호 노출방지를 위해
문자들이 검은색 동그라미들로 바뀐다.
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"
tools:ignore="MissingConstraints" />
-visibility 설정-
visible : 보임
invisible : 있는데 안보임
gone : 사라져서 안보임
activity_main.xml의 간단하지만 핵심적인 내용들을 몇 가지 적어봤고
다음으로는 기능을 구현할 MainActivity.class를 보겠다.
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
public class MainActivity extends AppCompatActivity {
EditText etId;
EditText etPw;
private FirebaseAuth mAuth; // 현재 Firebase 인증 상태 확인 변수
private static final String TAG = "MainActivity";
ProgressBar progressBar;
FirebaseDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
database = FirebaseDatabase.getInstance(); // FirebaseDatabase 인스턴스를 초기화
mAuth = FirebaseAuth.getInstance(); // FirebaseAuth 인스턴스를 초기화
etId = (EditText) findViewById(R.id.etId);
etPw = (EditText) findViewById(R.id.etPw);
progressBar = (ProgressBar)findViewById(R.id.progressbar);
Button login = (Button)findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() { // 로그인 버튼을 누르면 onClick 메서드 발생
@Override
public void onClick(View v) {
String stEmail = etId.getText().toString(); // 아이디 입력창에 입력한 문자열을 stEmail에 대입
String stPw = etPw.getText().toString(); // 패스워드 입력창에 입력한 문자열을 stPw에 대입
if(stEmail.isEmpty()) { // 아이디 입력창이 비어있으면
Toast.makeText(MainActivity.this, "이메일을 입력하세요. ", Toast.LENGTH_SHORT).show();
return;
}
if (stPw.isEmpty()) { // 패스워드 입력창이 비어있으면
Toast.makeText(MainActivity.this, "패스워드를 입력해주세요. ", Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE); // 로그인 버튼을 누르면 gone에서 visible로 바뀌면서 프로그래스바가 보여지게됨
Button register = (Button)findViewById(R.id.register);
register.setOnClickListener(new View.OnClickListener() { // 회원가입 버튼을 누르면
@Override
public void onClick(View v) {
String stEmail = etId.getText().toString(); // 아이디 입력창에 입력한 문자열을 stEmail에 대입함
String stPw = etPw.getText().toString(); // 패스워드 입력창에 입력한 문자열을 stPw에 대입함
if(stEmail.isEmpty()) { // stEmail이 비어있다면
Toast.makeText(MainActivity.this, "이메일을 입력하세요. ", Toast.LENGTH_SHORT).show();
return;
}
if(stPw.isEmpty()) { // stPW이 비어있다면
Toast.makeText(MainActivity.this, "패스워드를 입력하세요. ", Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE); // 로그인 버튼을 누르면 visible로 바뀌면서 프로그래스바가 보여지게됨
// 신규 회원가입
mAuth.createUserWithEmailAndPassword(stEmail, stPw)
.addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressBar.setVisibility(View.GONE); // 로딩이 끝나면 gone으로 바뀌면서 사라짐
if(task.isSuccessful()) { // 회원가입에 성공했다면
Log.d(TAG, "이메일 생성에 성공하였습니다. ");
FirebaseUser user = mAuth.getCurrentUser(); // 로그인한 회원의 계정정보 가져오기
DatabaseReference myRef = database.getReference("users").child(user.getUid()); // 회원가입을 하면 유니크아이디가 생기는데 user의 chile에 생성
Hashtable<String, String> numbers // 해시테이블에 이메일과 텍스트가 들어감
= new Hashtable<String, String>();
numbers.put("email", user.getEmail()); // 회원의 이메일 가져오기
Toast.makeText(MainActivity.this, "회원가입 성공", Toast.LENGTH_SHORT).show(); // 회원가입을 하면 user 데이터베이스에 정보가 들어감
myRef.setValue(numbers);
} else {
Log.w(TAG, "이메일 생성에 실패하였습니다. ", task.getException());
Toast.makeText(MainActivity.this, "이메일 생성에 실패하였습니다. ", Toast.LENGTH_SHORT).show();
}
}
});
}
});
// 기존 사용자 로그인
mAuth.signInWithEmailAndPassword(stEmail, stPw)
.addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressBar.setVisibility(View.GONE); // 로딩이 끝나면 gone으로 바뀌면서 프로그래스바가 다시 안보여짐
if(task.isSuccessful()) { // 로그인에 성공한다면
Log.d(TAG, "이메일 로그인에 성공하였습니다. ");
FirebaseUser user = mAuth.getCurrentUser(); // 로그인한 회원의 계정 정보 가져오기
String stUserEmail = user.getEmail(); // 사용자의 이메일을 가져와서 문자열 레퍼런스 stUserEmail에 대입
Log.d(TAG, "회원님의 이메일: " + stUserEmail );
Toast.makeText(MainActivity.this, "로그인이 되었습니다. ", Toast.LENGTH_SHORT).show();
SharedPreferences sharedPref = getSharedPreferences("shared", Context.MODE_PRIVATE); //
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("email", stUserEmail);
editor.commit(); // editor에 commit()을 사용하여 디크스에 동기적으로 쓸 수 있음
Intent intent = new Intent(MainActivity.this, ChatActivity.class);
intent.putExtra("email", stEmail); // 로그인하면서 채팅창으로 화면전환할 때 이메일도 넘기기
startActivity(intent);
} else { // 로그인에 실패하면
Log.w(TAG, "이메일 로그인에 실패하였습니다. ", task.getException());
Toast.makeText(MainActivity.this, "로그인에 실패하였습니다. ", Toast.LENGTH_SHORT).show();
}
}
});
}
});
}
@Override
public void onStart() {
super.onStart();
FirebaseUser currentUser = mAuth.getCurrentUser(); // 로그인한 회원의 계정 데이터 정보 가져오기
}
}
|
cs |
피드백은 언제나 환영입니다.