광주인공지능학원에서의 프로젝트 최종관문 안드로이드 어플리케이션 만들기이다.
광주인공지능학원 이은비쌤에게 전수 받은 안드로이드 실력을 뽐내본다.
광주인공지능학원 수업 중 안드로이드 수업은 모든 학생들이 최고 열심히 듣는다
바로바로 결과물이보이기도하고 광주인공지능학원 이은비쌤이 정말.. 열정적으로 알려주시기도 하신다.
그리고 광주인공지능학원 우리팀은 웹으로 만들지 않고 안드로이드로 직접 코딩하며 제작하였다.
다들 자바개발자가 되고싶기도하고 좀 더 우리 스스로 만들어보고 싶은 욕구가 강하기 때문이다.
광주인공지능학원에서 약 2주정도 배웠지만 정말 퀄리티가 높게 나온 것 같다.
아직 디자인적인 요소가 부족하지만 이런부분들은 차차 보완할 요소이다.
아래는 광주인공지능학원에서 배운 안드로이드이다.
package com.example.aim_project;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.nfc.Tag;
import android.os.Bundle;
import android.view.MenuItem;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.firebase.iid.FirebaseInstanceIdReceiver;
import com.google.firebase.messaging.FirebaseMessaging;
import com.google.firebase.messaging.FirebaseMessagingService;
public class MainActivity extends AppCompatActivity {
BottomNavigationView bnv;
FragmentCamera fragmentCamera;
// FragmentDiary fragmentDiary;
FragmentDiary_1 fragmentDiary_1;
FragmentMyinfo fragmentMyinfo;
FragmentSound fragmentSound;
FragmentMain fragmentMain;
FragmentMyinfo_1_ fragmentMyinfo_1_;
FragmentMyinfo_2_noBo fragmentMyinfo_2_noBo_;
FragmentMyinfo_3_noLicense fragmentMyinfo_3_noLicense_;
FragmentMyinfo_4_ fragmentMyinfo_4_;
FragmentMyinfo_5_ fragmentMyinfo_5_;
FragmentMyinfo_6_ fragmentMyinfo_6_;
// private String TAG; //이 부분 수정
private static final String TAG = "FMS";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bnv = findViewById(R.id.menubar);
fragmentCamera = new FragmentCamera();
// fragmentDiary = new FragmentDiary();
fragmentDiary_1 = new FragmentDiary_1();
fragmentMyinfo = new FragmentMyinfo();
fragmentSound = new FragmentSound();
fragmentMain = new FragmentMain();
fragmentMyinfo_1_ = new FragmentMyinfo_1_();
fragmentMyinfo_2_noBo_ = new FragmentMyinfo_2_noBo();
fragmentMyinfo_3_noLicense_ = new FragmentMyinfo_3_noLicense();
fragmentMyinfo_4_ = new FragmentMyinfo_4_();
fragmentMyinfo_5_ = new FragmentMyinfo_5_();
fragmentMyinfo_6_ = new FragmentMyinfo_6_();
FirebaseMessaging.getInstance().getToken().
addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete( Task<String> task) {
if (!task.isSuccessful()){
Log.w(TAG,"Fetching FCM registration failed",task.getException());
return;
}
String token = task.getResult();
String msg = getString(R.string.msg_token_fmt,token);
Log.d(TAG,msg);
Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
}
});
// if(getIntent().getExtras() != null){
// Log.d("MainActivity",getIntent().getExtras().getString("test"));
// }
getSupportFragmentManager().beginTransaction()
.replace(R.id.container2,fragmentMain).commit();
bnv.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.uq:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container2,fragmentCamera).commit();
break;
case R.id.diary1:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container2,fragmentDiary_1).commit();
break;
case R.id.chatbot:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container2,fragmentMyinfo).commit();
break;
case R.id.oneQue:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container2,fragmentSound).commit();
break;
// 테스트
}
return true;
}
});
}
}
package com.example.aim_project;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.w3c.dom.Text;
import java.util.HashMap;
import java.util.Map;
public class LoginActivity extends AppCompatActivity {
EditText tv_id,tv_pw; // 로그인 화면 아이디,비밀번호
Button btn_login; // 로그인 화면 가입완료 버튼
TextView tx_join; // 로그인 화면 아이디 없을 시 회원가입
String[] list = new String[3];
RequestQueue requestQueue;
StringRequest stringRequest_login; // 로그인 알고리즘
CheckBox ck_remember_id2,ck_autologin2;
Boolean check3 = false; // 아이디 기억용 boolean
Boolean check4 = false; // 자동로그인 기억용 boolean
DBManager manager; // 로그인을 위한 DBManager 객체 생성
Dialog dilaog01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
tv_id = findViewById(R.id.tv_id);
tv_pw = findViewById(R.id.tv_pw);
btn_login = findViewById(R.id.btn_login);
tx_join = findViewById(R.id.tx_join);
ck_remember_id2 = findViewById(R.id.ck_remember_id2);
ck_autologin2 = findViewById(R.id.ck_autologin2);
dilaog01 = new Dialog(LoginActivity.this); // Dialog 초기화
dilaog01.requestWindowFeature(Window.FEATURE_NO_TITLE); // 타이틀 제거
dilaog01.setContentView(R.layout.dialog02_fail); // xml 레이아웃 파일과 연결
// requestQueue 생성
requestQueue = Volley.newRequestQueue(getApplicationContext());
manager = new DBManager(getApplicationContext()); // 로그인을 위한 DBManager 객체 생성
boolean okman = manager.loginOpCheck();
if (okman == true) { // 로그인 옵션 테이블이 생성되어 있을경우
list = manager.loginOp_return();
if (list[2].equals("yeah")) { // 자동로그인 체크한경우
Toast.makeText(getApplicationContext(), list[0] + "님, 환영합니다!", Toast.LENGTH_SHORT).show();
ck_autologin2.setChecked(true);
check4 = true;
Intent it_login2 = new Intent(LoginActivity.this, MainActivity.class);
// 나중에 로그인한 회원 정보 담아서 보낼것!!!
it_login2.putExtra("loginId", list[0]);
startActivity(it_login2);
} else if (list[1].equals("yeah")) { // 아이디 기억 체크한경우
ck_remember_id2.setChecked(true);
check3 = true;
tv_id.setText(list[0]);
}
}else{ // 어플 사용 처음일 경우 default 값으로 넣어주기
manager.loginOpDefault();
}
stringRequest_login = new StringRequest(Request.Method.POST, "http://172.30.1.15:8090/AIM_DBServer/LoginServlet",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// 응답을 처리
if (response.equals("true")) {
Toast.makeText(getApplicationContext(), tv_id.getText().toString() + "님, 환영합니다!", Toast.LENGTH_SHORT).show();
Intent it_login = new Intent(LoginActivity.this, MainActivity.class);
// 나중에 로그인한 회원 정보 담아서 보낼것!!!
it_login.putExtra("loginId", tv_id.getText().toString());
startActivity(it_login);
} else {
showDialog01();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("id", tv_id.getText().toString());
params.put("pw", tv_pw.getText().toString());
return params;
}
};
// 회원가입 텍스트 누르면 -> 회원가입 화면으로
tx_join.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent it_join = new Intent(LoginActivity.this, JoinActivity.class);
startActivityForResult(it_join, 1001);
}
});
// 로그인이 완료되면 -> 메인화면으로
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
requestQueue.add(stringRequest_login);
}
});
ck_remember_id2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(check3 == true){ // 아이디 기억 해제 하기
manager.idRember_off();
check3 = false;
}else{ // 아이디 기억 설정 하기
manager.idRember_on();
check3 = true;
}
}
});
ck_autologin2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(check4 == true){ // 자동로그인 해제 하기
manager.autoLogin_off();
check4 = false;
}else{ // 자동로그인 설정 하기
manager.autoLogin_on();
check4 = true;
}
}
});
}
// dialog02을 디자인하는 함수
public void showDialog01() {
dilaog01.show();
dilaog01.findViewById(R.id.btn_yes).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 원하는 기능 구현
dilaog01.dismiss(); // 다이얼로그 닫기
}
});
}
}
뒤에 있는 기능들은 최종발표회에서 보기 바람..;;
오늘은 논문 분석을 좀 더 했다.
아이의 울음분석
먼저, 기본주파수를 통해 살펴본 결과 배고픔의 울음은 400.54Hz, 표준편차는 19.33
이었고 통증의 울음은 441.04Hz, 표준편차는 26.08로 두 울음간의 평균의 차이가 크게
나타났고 통계적으로 유의한 결과를 얻었다. Murry & Amundson(1976)의 연구41에서
는 배고픔과 통증에 따른 신생아 울음을 기본주파수를 중심으로 살펴본 결과 배고픔
의 울음은 438.5Hz, 표준편차는 42, 통증의 울음은 441.0Hz, 표준편차는 47.03으로 나
타났다. 본 연구와 Murry & Amundson(1976) 연구의 차이점을 표준편차를 통해 살펴
보면 다음과 같다. 본 연구가 Murry & Amundson(1976)의 연구보다 배고픔과 통증의
울음에서 표준편차가 더 작게 나타났는데 이에 대한 해석으로는 울음을 유도하는 방
법적인 측면에서의 차이를 통해 살펴볼 수 있다.
특히, 두 연구 모두 통증 울음의 기본주파수가 441.0Hz로 동일한 수치를 얻었으나 본 연구는 자료 수집 시 대상자인 신
생아의 상황을 아주 일관성이 있게 통제하는 것이 매우 중요하다는 인식을 갖고 모든
대상자에게 선천성 대사이상검사를 통해 동일한 자극을 줌으로써 울음을 유도하였다.
그러나 Murry & Amundson(1976) 연구에서는 대상자의 발바닥을 손바닥으로 치는
방법으로 울음을 유도하였다. 이는 모든 대상자들에게 동일한 강도나 횟수로 자극을
주는데 제한이 있다고 판단된다.
본 연구에서 통증의 울음이 배고픔의 울음보다 높게 나타났는데 이는 통증을 느끼
는 것과 같은 스트레스를 받는 상황에서는 골격근(skeletal muscle)이 긴장하고 호흡
의 속도가 증가하면서 기본주파수가 증가61한다는 선행 연구의 주장을 뒷받침하는 결
과를 얻었다.
일반적으로 발성은 성대의 진동에서 시작이 되는데 성대진동을 위해서
는 우선적으로 성문상압과 성문하압의 충분한 차이가 있었다.
"스마트인재개발원에서 진행된 수업내용입니다"
'스마트 인재개발원 > 3차프로젝트' 카테고리의 다른 글
(광주인공지능학원) 마지막 3차프로젝트 이야기 (1) | 2021.09.04 |
---|---|
(광주인공지능학원)3차프로젝트 MFCC 복습하기 (0) | 2021.08.29 |
(광주인공지능학원) 3차프로젝트 멀티쓰레드 설계 및 울음소리 분석 (0) | 2021.08.22 |
(광주인공지능학원) 3차프로젝트 파이썬 멀티쓰레드 & CNN 신생아 울음소리 분석(2) (0) | 2021.08.15 |
(광주인공지능학원)신생아 울음소리 분석 CNN모델 만들기 (4) | 2021.08.15 |