Tech. Forum 개발자들을 위한 정보 공유의 장입니다
닫기

Tech.Forum

TMap 안드로이드 SDK의 void setTrackingMode(boolean Mode)를 켠다고 바로 현위치 추적이 되진 않습니다.

#1

SDK version: v1.62
Platform: Android

원래는 문의글이었으나 코드를 보다보니 생각한 것과 좀 다르게 작동하도록 되어있어서 공유합니다.

테스트 코드입니다.

package com.example.tmap_test

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.skt.Tmap.TMapView

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tmapView = TMapView(this)

        tmapView.apply {
            setSKTMapApiKey("API_KEY")
            zoomLevel = 15
            setIconVisibility(true)
            setTrackingMode(true)
            setCompassMode(true)
        }

        setContentView(tmapView)
    }
}

현위치는 서대문역 근처입니다.
하지만 결과 화면은 SKT 타워만 계속 비추고 있습니다.

setTrackingMode() 메소드를 따라가본바
TrackingThread의 run이 돌게 되고.

public void run() {
    this.currentThread = Thread.currentThread();

    try {
        while(!this.stopped) {
            Thread.sleep(1000L);
            long TimeGap = ((new Date()).getTime() - this.lastCheckTime.getTime()) / 1000L;
            if (TimeGap >= 2L) {
                this.view.setCenterPoint(this.view.getLocationPoint().getLongitude(), this.view.getLocationPoint().getLatitude());
                this.lastCheckTime = new Date();
            }
        }
    } catch (Exception var3) {
    }

    this.currentThread = null;
}

위 함수에서 this.view.setCenterPointthis.view.getLocationPoint()의 좌표를 받아와 지도 중심으로 합니다.
하지만 SDK를 보면 딱히 디바이스에서 GPS 정보를 받아오는 부분이 있지 않습니다.
그렇게 되면 따로 setLocationPoint를 해주지 않으면 TMapView의 파라미터의 default 값인

private double locationLatitude = 37.566474D;
private double locationLongitude = 126.985022D;

위의 값이 계속 초기화되게 되어 SKT타워가 지도 중심이 되며 현위치 아이콘도 그 곳에 나타나게 됩니다.

즉 현위치를 추적하게 하고 싶다면 단지 setTrackingMode(true)만 하는게 아니라 디바이스에서 GPS이 갱신될 떄마다 setLocationPoint메소드를 통해 SDK에 현위치 값을 넣어주어야 합니다.

날림 코드이긴 하지만 위 내용을 적용한 코드입니다.

package com.example.tmap_test

import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
import com.skt.Tmap.TMapView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val tmapView = TMapView(this)

        val locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
                locationResult ?: return
                for (location in locationResult.locations) {
                    tmapView.setLocationPoint(location.longitude, location.latitude)
                }
            }
        }

        val fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)!!

        val locationRequest = LocationRequest()

        fusedLocationClient.requestLocationUpdates(
            locationRequest,
            locationCallback, null
        )

        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? ->
                location ?: return@addOnSuccessListener
            }
        }

        tmapView.apply {
            setSKTMapApiKey("API_KEY")
            zoomLevel = 15
            setIconVisibility(true)
            setTrackingMode(true)
            setCompassMode(true)
        }

        setContentView(tmapView)
    }
}
0 Likes

#2

안녕하세요.

T map API 운영담당자입니다.

우선 이용에 불편을 드려 죄송합니다.

작성해주신 내용을 토대로 T map SDK 확인 후 답변드리겠습니다.

감사합니다.

1 Like