안드로이드에서 지도를 구현하기 위해 Naver Map API를 사용해보았다.
우선, Naver Map API를 사용하기 위해서 네이버 클라우드 플랫폼에 접속하고 회원가입을 진행해야한다.
이전에 Naver API를 사용하기 위해 가입한적이 있기에 그대로 사용해줬다.
결제수단을 미리 등록해두어야 API 사용이 가능하다.
다음으로 Naver Maps 이용 신청을 진행하고 Application 등록에 내가 사용할 프로젝트를 등록한다.
이때, Mobile Dynamic Map, Directions 5, Geocoding, Reverse Geocoding 이 4가지 서비스만 사용 신청해주었다.
(자신의 필요에 맞게 신청)
등록을 완료하고나면 인증 정보에서 API 사용에 필요한 Client ID, Client Secret 키 등을 확인할 수 있다.
프로젝트를 진행하면서 반드시 필요하기 때문에 잘 확인해두어야한다.
Naver Map API를 사용하기 위해서 우선 Project 단위의 settings.gradle에 maven을 추가해주어야한다.
최신 버전에서는 이 maven을 추가하는 방법이 살짝 다르다.
옛 버전에서 추가하는 방식은 검색을 하면 아주 많이 나오고 있다.
만약 최신 안드로이드 스튜디오를 사용한다면 아래 내용을 참고하면 된다.
repositories {
google()
mavenCentral()
jcenter()
maven {
url 'https://naver.jfrog.io/artifactory/maven/'
}
}
다음으로 Android 단위의 Module build.gradle에 naver maps를 추가해주고 Sync 해준다.
dependencies {
implementation 'com.naver.maps:map-sdk:3.14.0'
}
Manifest에 Internet 권한을 부여하고 앞서 인증키에서 파악해 둔 Client_ID를 <application> 안에 추가해준다.
<uses-permission android:name="android.permission.INTERNET" />
<application>
<meta-data
android:name="com.naver.maps.map.CLIENT_ID"
android:value="CLIENT_ID" />
</application>
이제 마지막으로 Layout에 맵을 사용하기 위한 fragment만 추가해주면 안드로이드 화면에 맵 구현하기는 끝이다.
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mapFragment"
android:name="com.naver.maps.map.MapFragment" />
이제 구현된 맵 위에 사용자의 현재 위치를 표시할 수 있도록 만들어보겠습니다.
위에서 여태까지 구현한 내용 위에 추가로 구현하도록 하겠습니다.
먼저 위치 추척을 허용하기 위한 권한을 추가해줍니다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
build.gradle (Module)에 위치 정보를 사용하기 위한 의존성을 추가합니다.
dependencies {
implementation 'com.google.android.gms:play-services-location:20.0.0'
}
이제 activity에 구현을 위한 코드만 작성해주면 완료입니다.
- OnMapReadyCallback을 상속받도록 함
- 지도와 위치 정보에 관해 필요한 변수들과 권한을 정의
- 맵 화면을 생성
NaverMap 프로젝트
MainActivity.java
package com.example.navermap;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.Manifest;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.Volley;
import com.naver.maps.geometry.LatLng;
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;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
// private Button button;
private NaverMap naverMap;
private FusedLocationSource locationSource;
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1000;
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_main);
FragmentManager fragmentManager = getSupportFragmentManager();
MapFragment mapFragment = (MapFragment)fragmentManager.findFragmentById(R.id.mapFragment);
if (mapFragment == null) {
fragmentManager.beginTransaction().add(R.id.mapFragment, mapFragment).commit();
}
mapFragment.getMapAsync(this);
locationSource = new FusedLocationSource(this, LOCATION_PERMISSION_REQUEST_CODE);
}
@Override
public void onMapReady(@NonNull NaverMap naverMap) {
this.naverMap = naverMap;
// 현재위치
naverMap.setLocationSource(locationSource);
// 권한확인
ActivityCompat.requestPermissions(this, PERMISSIONS, LOCATION_PERMISSION_REQUEST_CODE);
// 마커표시
Marker marker = new Marker();
marker.setPosition(new LatLng(37.4967449, 127.030570));
marker.setPosition(new LatLng(indexFirst, inderLast));
marker.setMap(naverMap);
}
// 권한확인
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (locationSource.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
if (!locationSource.isActivated()) {
naverMap.setLocationTrackingMode(LocationTrackingMode.None);
return;
}
else {
naverMap.setLocationTrackingMode(LocationTrackingMode.Follow);
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
'Android' 카테고리의 다른 글
[Android] Firebase 이용한 회원가입과 로그인 (0) | 2023.04.13 |
---|---|
[Android] Naver Map API 사용해보기 (2) Geocoding (0) | 2022.07.28 |
[Android] Firebase로 OCR 사용해보기 (2) (0) | 2022.07.11 |
[Android] php 이용하여 로그인/회원가입 구현 (0) | 2022.06.15 |
[Android] 카카오톡 연동 로그인 구현 with Kotlin (0) | 2022.06.13 |