본문 바로가기
Developer/Android, Java

[안드로이드] 네이버 지도 API v3 기본맵 띄우기

by Doony 2019. 5. 20.

 

작년이었나요. 네이버에서 제공하던 지도 API를 엔클라우드로 통합하여 운영한다고 발표했습니다. 그와 함께 새로운 지도API 버젼을 발표했는데요. 기존 버전 대비 신규 버전은 확실히 직관적이고, 간결하게 코드가 짜여질 수 있습니다.

기존 네이버 지도 API를 써보셨다면 아시겠지만 개발자 사이트에 있는 정보들이 다소 불친절합니다. 때문에 구글링을 통해 다른 개발자들이 올려놓은 코드를 보고 구현하곤 했는데요. 새롭게 출시된 네이버 지도(v3)는 직관적으로 코드가 구성되어 있어, 개발자 사이트만 보고도 충분히 구현이 가능했습니다. 기능도 더 다양해진 것 같고요. 아직 모든 기능을 사용해본 것은 아니지만, 우선 액티비티에 네이버 맵을 띄우는 과정에 대해 포스팅해보고자 합니다.

구성은 다음과 같습니다.

  • AndroidManifest.xml
  • MainActivity.java
  • mainactivity.xml

구현하는 기능은 딱 하나입니다.
GPS 내위치를 보여주는 버튼을 만들기.
간단한 코드만으로 해당 버튼과 기능을 구현할 수 있습니다.

네이버 API 클라이언트 이용 신청

여기에서 클라이언트 이용 신청 방법에 대해 알 수 있습니다. 기존 버젼과 유사한 방식으로 아이디를 발급받으면 됩니다. 기본적인 Gradle 등록 절차까지 마무리한 후, 아래 코드 부분을 보면 됩니다.

AndroidManifest.xml

안드로이드 manifest에 다음 내용을 입력합니다.

<manifest>
    <application>
        <meta-data
            android:name="com.naver.maps.map.CLIENT_ID"
            android:value="YOUR_CLIENT_ID_HERE" />
    </application>
</manifest>
cs

YOUR_CLIENT_ID_HERE 부분에 발급받은 아이디값을 부여합니다.

 

 

mainactivity.xml

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <com.naver.maps.map.MapView
        android:id="@+id/map_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </com.naver.maps.map.MapView>
 
    <com.naver.maps.map.widget.LocationButtonView
        android:id="@+id/locationbuttonview"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginEnd="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="100dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </com.naver.maps.map.widget.LocationButtonView>
 
</ConstrainLayout>
cs

xml에 네이버지도 MapView 를 추가하고, 아이디를 map_view로 저장합니다. 위치 버튼인 LocationButtonView를 추가하고, 아이디를 locationbuttonview로 저장합니다.

 

 

MainActivity.java

public class MainActivity extends Activity implements OnMapReadyCallback {
 
    // NaverMap API 3.0
    private MapView mapView;
    private LocationButtonView locationButtonView;
 
    // FusedLocationSource (Google)
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1000;
    private FusedLocationSource locationSource;
 
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainactivity);
 
        mapView = findViewById(R.id.map_view);
        mapView.onCreate(savedInstanceState);
 
        naverMapBasicSettings();
 
 
    }
 
 
    public void naverMapBasicSettings() {
        mapView.getMapAsync(this);
        //내위치 버튼
        locationButtonView = findViewById(R.id.locationbuttonview_post);
        // 내위치 찾기 위한 source
        locationSource = new FusedLocationSource(this, LOCATION_PERMISSION_REQUEST_CODE);
    }
 
 
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (locationSource.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
 
 
    @Override
    public void onMapReady(@NonNull final NaverMap naverMap) {
        //naverMap.getUiSettings().setLocationButtonEnabled(true);
        locationButtonView.setMap(naverMap);
 
        // Location Change Listener을 사용하기 위한 FusedLocationSource 설정
        naverMap.setLocationSource(locationSource);
        naverMap.setLocationTrackingMode(LocationTrackingMode.NoFollow);
    }
 
 
    @Override
    protected void onStart() {
        super.onStart();
        mapView.onStart();
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }
 
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        mapView.onStop();
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }
 
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }
 
 
}
cs

onMapReady 메소드 안에 지도 관련 설정들을 넣어줘야 값을 못받는 에러가 발생하지 않습니다.
위와 같이 구성 후, 앱을 실행하면 지도와 내 위치표기 버튼이 동작하는 것을 보실 수 있습니다.

(개발 중 일부만 발췌해서 포스팅하는 것이기 때문에, 일부 오류가 있을 수 있습니다.)

댓글