스마트 인재개발원/3차프로젝트

(광주인공지능학원) 3차프로젝트 안드로이드 어플리케이션 만들기 및 논문분석

광주인공지능학원에서의 프로젝트 최종관문 안드로이드 어플리케이션 만들기이다.

광주인공지능학원 이은비쌤에게 전수 받은 안드로이드 실력을 뽐내본다.

광주인공지능학원 수업 중 안드로이드 수업은 모든 학생들이 최고 열심히 듣는다

바로바로 결과물이보이기도하고 광주인공지능학원 이은비쌤이 정말.. 열정적으로 알려주시기도 하신다. 

그리고 광주인공지능학원 우리팀은 웹으로 만들지 않고 안드로이드로 직접 코딩하며 제작하였다.

다들 자바개발자가 되고싶기도하고 좀 더 우리 스스로 만들어보고 싶은 욕구가 강하기 때문이다.

광주인공지능학원에서 약 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한다는 선행 연구의 주장을 뒷받침하는 

과를 얻었다

일반적으로 발성은 성대의 진동에서 시작이 되는데 성대진동을 위해서

 우선적으로 성문상압과 성문하압의 충분한 차이가 있었다.

"스마트인재개발원에서 진행된 수업내용입니다"

https://www.smhrd.or.kr/