kaist-madcamp / week1-android

Week 1 : Android with Java

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

정강이

이혜민, 강수아, 정이든

Contacts Photos Google Map

Tab1 : 연락처

연락처를 저장하고 바로 전화할 수 있습니다. 로컬의 연락처와 연동되어 앱에서 저장하면 로컬 연락처 저장소에도 저장됩니다. 보이는 연락처를 누르면 바로 전화를 걸 수 있습니다. 네이게이션 바를 이용해서 여러 프래그먼트 사이에 이동하는 것이 용이하게 디자인하였습니다.

  • 연락처 저장하기

    • 연락처를 local에서 가져오기 위해서 dexter 라이브러리를 사용함. READ_CONTACTS 권한을 요청함
    • query를 사용해서 local에 있는 Phone.CONTENT_URI 받아옴
    • DISPLAY_NAME은 이름, NUMBER는 전화번호, PHONE_URI는 연락처에 저장된 사진
    • Action Bar에 있는 item을 클릭하면 연락처 저장을 위한 alert dialog 뜸
    • Intent를 사용해서 데이터를 전달한 뒤 local 연락처에 전달받은 이름과 전화번호를 저장
    • 다시 연락처 화면으로 돌아가면 저장된 연락처가 포함되어 있음
  • 전화하기

    • Recycler View로 되어있는 layout을 클릭하면 전화가 걸리는 방식으로 프로그램 구성함
    • 하나의 view를 클릭하게 되면 전화 여부를 물어보는 alert dialog뜸
    • " 예"를 선택하게 되면 Intent를 사용해서 바로 전화 걸 수 있는 페이지로 넘어감
  • 연락처 검색하기

    • EditText로 검색할 이름 또는 번호를 받아옴
    • EditText에서 받아온 값이 변경될 때마다 사용할 수 있게 TextWatcher사용함
    • Filter를 사용해서 이름을 검색할 때와 번호를 검색하는 경우를 나눠 EditText에서 받아온 내용이 포함된 새로운 리스트를 생성해서 보여줌

Tab2 : 사진 앨범

사진 앨범 Tab은 Android 기기의 local storage에 존재하는 모든 사진파일을 보여주며, 촬영기능을 통해 새로운 사진을 local storage에 추가할 수 있는 화면입니다.

  • 갤러리 페이지

    • Android MediaStore를 사용하여 앱에서 local storage의 파일을 사용함
    • 사진 파일을 읽어오기 위해 사용자에게 READ_EXTERNAL_STORAGE 권한을 요청함
    • local storage에 존재하는 모든 이미지 파일의 uri주소를 반환하는 getAllShownImagesPath 함수를 구현함
    • uri주소로 접근한 이미지들을 GridView에 추가하여 화면을 구성함
  • 상세 사진 페이지

    • 갤러리 페이지에서 각각의 사진을 누르면 상세 사진 페이지로 이동할 수 있음
    • 사진을 눌렀을 때 사진의 uri 주소를 bundle 형태로 새로운 fragment로 전달함
    • 상세 사진 페이지에서 사진을 다시 한 번 누르면 갤러리 페이지로 돌아갈 수 있음
  • 촬영 페이지

    • 갤러리 페이지에서 우측 상단 카메라 아이콘을 누르면 촬영 페이지로 이동할 수 있음
    • Android Camera를 사용하여 앱에서 Android 디바이스의 카메라에 접근하여 사용함
    • SurfaceView 객체를 사용하여 카메라 preview화면을 간접적으로 보여줌
    • shoot 버튼을 클릭했을 때 camera.takePicture 메소드를 호출하여 사진을 촬영함
    • 촬영된 사진을 Bitmap 데이터로 변환하여 화면에 표시하고, 새로운 Uri 주소를 할당하여 local storage에 저장함
    • 촬영 페이지에서 다시 갤러리 페이지로 돌아갔을 때 촬영한 사진을 확인할 수 있음

Tab3 : Google map

Google map tab은 나의 현 위치와 우리 분반 친구들의 위치를 맵의 마커로서 확인할 수 있는 탭입니다. 또한 클러스터링 API를 사용하여 zoom level에 따라 '마커' <--> '군집' 변경되는 지도입니다.


  • 기본 화면

    • 정확한 위치 적용을 위해 ACCESS_FINE_LOCATION 퍼미션을 사용자에게 요청한다.
    • 사용자가 위치 허용을 하면 mGoogleMap.setMyLocationEnabled(true)를 통해 Floating button이 생성되고. 버튼을 클릭하면 기기의 위도, 경도값을 구글 서버에 보낸다. 그리고 구글로부터 현재 위치의 이미지 url을 받아 맵에 표시된다.
    • 현재 위치가 변경될 때 onLocationChanged 콜백이 fire되고 사용자의 새로운 위치가 마커로서 표시된다.
    • 맵 타입 변경 버튼을 누르면 구글 맵의 이미지 타입이 변경된다. 간단한 버튼 리스너 코드는 아래와 같다.
      @Override
      public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
          //Initialize view
          View rootView = inflater.inflate(R.layout.map_frag, container, false);
    
          Button map_type_btn = rootView.findViewById(R.id.map_type_btn);
          map_type_btn.setOnClickListener(new Button.OnClickListener() { // 버튼 리스너 등록.
              @Override
              public void onClick(View view) {
                  if(mGoogleMap.getMapType() == 1) {
                      mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); // 위성에서 찍은 이미지로 맵 타입 설정.
                  }else {
                      mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); // 디폴트 맵 이미지 타입
                  }
              }
          })

  • Zoom 시에 화면

    • 분반 친구들이 Cluster item의 마커로서 지도에 표시됨.
    • 친구들의 랜덤한 위치를 리턴하는 간단한 함수를 통해 마커를 표현.
    • 마커를 클릭하면 친구들의 이름이 Toast로서 표시됨.
    • 마커를 클릭하면 해당 마커로 카메라가 천천히 이동함.

  • Pinch 시에 화면

    • 특정 반경에 위치한 마커들의 무게중심에 하나의 Cluster(군집)으로 표시됨.

About

Week 1 : Android with Java


Languages

Language:Java 100.0%