Kotlin

2. Android - JPA Client with location DB

kakaroo 2022. 3. 1. 15:58
반응형

 

article logo

 

지난 서버측 포스팅에 이어

클라이언트가 되는 안드로이드에서
값을 주기적으로 저장하고, 
저장된 정보를 읽어와서
지도화면에 시간별로 출력해 보겠습니다.

 

개발에 필요한 내용 정리

 

1. 값 생성하기

현재 위치와 현재 시간 가져오기

저장 주기 설정

저장 주기마다 값을 서버에 POST 하기

 

2. 값 읽어오기

서버의 저장된 DB값을 ReadAll > RecyclerView로 list-up

Item 선택시 지도로 보여주기

Item 복수 선택시 시간순서대로 이동 경로 보여주기 (화살표 등으로 표현)

전체 삭제하기

 

3. 확장판

저장하는 App(client1)에서는 백그라운드 서비스로 동작함 (ex. 자녀폰)

동작시키는 App(client2)에서는 client1을 on/off 하거나 설정을 변경할 수 있음 (ex. 부모폰)

설정은 또 다른 db 형태로 만들어서 해당 값대로 client1을 설정함

               

 

 

2. 값 읽어오기

지도 권한 설정 : Dependency 추가

// 위치 정보
implementation 'com.google.android.gms:play-services-location:17.0.0'
// 구글 지도, MapsActivity 추가 시 자동으로 추가됨
implementation 'com.google.android.gms:play-services-maps:17.0.0'

Google Map API 키 발급

 

res>values 폴더의 google_maps_api.xml에 주석처리 되어있는 https://console.developers.google.com/... 로 이동한다.

다음 화면에서 프로젝트 만들기를 누른 후 API키 발급 버튼을 눌러 API키를 발급 받는다.

발급받은 키를 복사해 google_maps_api.xml의 아래 코드 부분에 붙여넣는다.

 

<string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">발급받은 키 입력</string>

 

AndroidManifest.xml에 권한 등록

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

 

지도 앱 실행시 권한 체크 코드 추가

if( (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
|| (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) ){
var permissions = arrayOf( android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION )
ActivityCompat.requestPermissions(context as Activity, permissions, Common.MY_PERMISSION_ACCESS_ALL)

 

 


ArrayLIst를 Intent로 넘기기 위해 Parcelable 을 이용합니다.

 

plugins {
...
    id 'kotlin-parcelize'
}

 

Ojbect로 사용되는 Data 클래스를 @Parcelize 어노테이션으로 정의합니다.

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class FootPrinter(var idx: Int, var id: Long, var time: String?, var latitude: Double, var longitude: Double) : Parcelable {

 

Database를 Get 방식으로 읽어와서 화면에 list-up을 합니다.

앞의 index는 숫자가 클수록 최신에 저장된 값입니다.

가장 최근의 데이터를 상단에 표시하기 위해 list를 reverse 합니다.

 

server에 저장된 목록을 get 메소드를 통해 읽어와서 list를 구성합니다.

 

여러 item을 선택해서 지도맵을 호출하면 아래와 같이 디스플레이 됩니다.

빨간색 마커가 가장 최신의 위치 정보입니다. 마커를 눌러보면 순서(낮을수록 최신, 1부터 시작)와 시간정보가 나타납니다.

 

구글맵에서 경로가 보이며 Marker를 누르면 주소와 시간이 보입니다.

 

IconGenerator

implementation 'com.google.maps.android:android-maps-utils:0.4+'

 

<marker_layout.xml>

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >

    <TextView
        android:id="@+id/tv_recent_marker"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:background="@mipmap/my_position"
        android:paddingBottom="12dp" />

    <TextView
        android:id="@+id/tv_marker"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:gravity="center"
        android:text="1"
        android:textStyle="bold|italic"
        android:paddingBottom="12dp"
        android:textSize="17dp" />
</FrameLayout>

 

markerbinding = MarkerLayoutBinding.inflate(layoutInflater)

mIconGenerator = IconGenerator(this)
mIconGenerator.setContentView(markerbinding.root)

 

 

source code : https://github.com/kakarooJ/Android-Kotiln-Location-Client

 

GitHub - kakarooJ/Android-Kotiln-Location-Client

Contribute to kakarooJ/Android-Kotiln-Location-Client development by creating an account on GitHub.

github.com

 

반응형