본문 바로가기
안드로이드 자바

[Android][Java] 네이버 지도에 현재 위치 표시하기

by teamnova 2023. 4. 22.

네이버 지도 API 를 이용해 지도를 띄우는 것을 완료했다면 이젠 유저의 현재 위치를 표시해보겠습니다.

 

네이버 지도 api 개발자 가이드에 위치를 표시하는 방법에 대해 설명되어 있으니 참고바랍니다.

https://navermaps.github.io/android-map-sdk/guide-ko/4-2.html

 

위치 · 네이버 지도 안드로이드 SDK

No results matching ""

navermaps.github.io

 

네이버 지도 Api 사용 준비가 되지 않았다면 아래 글을 참고해주세요.


[Android][Java] 네이버 맵 API 사용하기

https://stickode.tistory.com/767 

 

1. 현재 위치 가져오기

현재 위치를 가져오기 위해서는 위치정보 사용을 위한 권한이 필요합니다. 

 

(1) AndroidManifest.xml 에서 위치정보 사용을 위한 권한을 추가해줍니다.

 

<uses-permission android:name="android.permission.INTERNET">

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

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">

 

build.gradle(Module:app)에서 위치정보를 사용하기 위한 의존성을 추가해줍니다.

 

dependencies{

           implementation 'com.google.android.gms:play-services-location:17.0.0'

}

 

(2) LocationTrackingActivity.java

OnMapReadyCallback을 상속받아서 지도를 표시할 수 있도록 해줍니다.

 

아래는 전체 코드입니다.

FusedLocationSource는 런타임 권한 처리를 위해 액티비티 또는 프래그먼트를 필요로 합니다. 생성자에 액티비티나 프래그먼트 객체를 전달하고 권한 요청 코드를 지정해야 합니다. 그리고 onRequestPermissionResult()의 결과를 FusedLocationSource의 onRequestPermissionsResult()에 전달해야 합니다.

 

다음은 액티비티에서 FusedLocationSource를 생성하고 NaverMap에 지정하는 코드입니다.

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentManager;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;

import com.google.android.gms.maps.GoogleMap;
import com.naver.maps.map.LocationTrackingMode;
import com.naver.maps.map.MapFragment;
import com.naver.maps.map.NaverMap;
import com.naver.maps.map.OnMapReadyCallback;
import com.naver.maps.map.overlay.Marker;
import com.naver.maps.map.util.FusedLocationSource;

public class LocationTrackingActivity extends AppCompatActivity implements OnMapReadyCallback {

    private FusedLocationSource locationSource;
    private NaverMap mNaverMap;

    private static final int PERMISSION_REQUEST_CODE = 100;
    private static final String[] PERMISSIONS = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location_tracking);

        //지도 객체 생성하기
        FragmentManager fragmentManager = getSupportFragmentManager();
        MapFragment mapFragment = (MapFragment) fragmentManager.findFragmentById(R.id.map);
        if(mapFragment == null){
            mapFragment = MapFragment.newInstance();
            fragmentManager.beginTransaction().add(R.id.map, mapFragment).commit();

        }

        //getMapAsync 호출해 비동기로 onMapReady 콜백 메서드 호출
        //onMapReady에서 NaverMap 객체를 받음.
        mapFragment.getMapAsync(this);

        //위치를 반환하는 구현체인 FusedLocationSource 생성
        locationSource = new FusedLocationSource(this, PERMISSION_REQUEST_CODE);


    }


    @Override
    public void onMapReady(@NonNull NaverMap naverMap) {
        
  
        // NaverMap 객체 받아서 NaverMap 객체에 위치 소스 지정
        mNaverMap = naverMap;
        mNaverMap.setLocationSource(locationSource);
        
        // 권한 확인, 결과는 onRequestPermissionResult 콜백 메서드 호출
        ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_REQUEST_CODE);
        
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // request code와 권한 획득 여부 확인
        if(requestCode == PERMISSION_REQUEST_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                mNaverMap.setLocationTrackingMode(LocationTrackingMode.Follow);
            }
        }
    }
}