|
안드로이드앱 개발시 Daum 지도 Android API 를 이용해 Daum 지도를 사용할 수 있습니다.
(지원 사양 Android 2.1(API Level 7) 이상)
Daum 지도 Android API 를 사용하기 전에 준비해야 할 사항에 대해 설명합니다.
최신버전
구버전
(2012/11/01) Android 지도API Release 1.2.0
Daum 지도 Android API 는 키 발급을 받아야 사용할 수 있습니다. 왼쪽 메뉴의 열쇠모양 을 클릭하면 App 생성 관리 페이지 로 이동합니다. 해당 페이지에서 App을 생성하고 키를 발급 받을 수 있습니다.
API Key 는 package name 당 하나가 발급됩니다. Android 앱의 package name 은 AndroidManifest.xml
파일 내 manifest
엘리먼트의 package
속성에 설정됩니다.
Android Daum Map 라이브러리는 libDaumMapAndroid.jar
와 아키텍쳐별로 libMapEngineApi.so
두개의 바이너리로 구성되어 있습니다.
주어진 압축파일 libs 에 있는 파일들을 해당 프로젝트 /libs/
로 모두 복사 해야 합니다.
AndroidManifest.xml
에 Permission 추가Daum 지도 Android API 를 사용하는 코드 예제입니다.
더욱 자세한 내용은 Sample App 을 통해 확인 가능합니다.
net.daum.mf.map.api.MapView 객체를 생성하여 Activity
의 content-view
에 삽입하면 지도화면을 손쉽게 구현할 수 있습니다.
지도화면이 보여지기 전에 발급받은 API Key 를 MapView
객체에 지정해 주어야 합니다.
MapView.MapViewEventListener, MapView.POIItemEventListener, MapView.OpenAPIKeyAuthenticationResultListener 등의 Interface 를 구현해 각 이벤트 발생에 대한 결과를 통보받을 수 있습니다. 각 이벤트에 대한 상세한 내용은 문서 를 참고하세요.
구현한 Interface 객체는 MapView
내 setter
메소드로 등록하면 됩니다.
MapView
클래스가 제공하는 메소드를 이용하여 손쉽게 지도 중심점 과 지도 확대/축소 레벨 을 변경할 수 있습니다.
지도뷰 위에 올라가는 마커를 생성할 수 있습니다.
다음지도에서 제공하는 기본 마커 외 커스텀 마커도 올릴 수 있습니다.
마커 관련 이벤트는 MapView.POIItemEventListener Interface를 구현함으로써 감지 가능합니다.
지도뷰 위에 Polyline 과 Circle 을 그릴 수 있습니다.
MapReverseGeoCoder 클래스를 이용하여 지도 좌표로 주소 정보를 가져올 수 있습니다.
로컬 장소검색 OpenAPI 를 사용하는 코드 예제입니다.
더욱 자세한 내용은 Sample APP 의 Search 예제를 통해 확인 가능합니다.
개발중인 App
or Web
에서 Daum 지도앱으로 연결하고 싶으신 경우에는 다음과 같은 URL Scheme을 이용하시면 됩니다.
지도앱 버전 | OS 버전 | URL Scheme | 설명 |
---|---|---|---|
모든버전 | 1.6 + | daummaps://open | 지도앱을 실행합니다. |
3.8.0 + | 1.6 + | daummaps://open?page=placeSearch | 지도앱을 실행하고 장소 검색 입력 화면 을 보여줍니다. |
3.8.0 + | 1.6 + | daummaps://open?page=routeSearch | 지도앱을 실행하고 길찾기 입력 화면 을 보여줍니다. |
지도앱 버전 | OS 버전 | URL Scheme | 설명 |
---|---|---|---|
모든버전 | 1.6 + | daummaps://look?p=37.537229,127.005515 | 지도앱을 실행하고 지정된 좌표 중심으로 지도를 보여주고 마커를 표시합니다. |
지도앱 버전 | OS 버전 | URL Scheme | 설명 |
---|---|---|---|
모든버전 | 1.6 + | daummaps://place?id=7813422 | 지도앱을 실행하고 지정(장소ID)된 장소를 중심으로 지도를 보여주고 마커를 표시합니다. |
지도앱 버전 | OS 버전 | URL Scheme | 설명 |
---|---|---|---|
모든버전 | 1.6 + | daummaps://search?q=맛집&p=37.537229,127.005515 | 지도앱을 실행하고 지정된 좌표(WGS84) 중심으로 검색합니다. |
지도앱 버전 | OS 버전 | URL Scheme | 설명 |
---|---|---|---|
모든버전 | 1.6 + | daummaps://route?sp=37.537229,127.005515&ep=37.4979502,127.0276368&by=CAR | 지도앱을 실행하고 출발지 좌표(WGS84)부터 도착지 좌표(WGS84)까지자동차 길찾기합니다. |
모든버전 | 1.6 + | daummaps://route?sp=37.537229,127.005515&ep=37.4979502,127.0276368&by=PUBLICTRANSIT | 지도앱을 실행하고 출발지 좌표(WGS84)부터 도착지 좌표(WGS84)까지대중교통 길찾기합니다. |
모든버전 | 1.6 + | daummaps://route?sp=37.537229,127.005515&ep=37.4979502,127.0276368&by=FOOT | 지도앱을 실행하고 출발지 좌표(WGS84)부터 도착지 좌표(WGS84)까지도보 길찾기합니다. |
지도앱 버전 | OS 버전 | URL Scheme | 설명 |
---|---|---|---|
모든버전 | 1.6 + | daummaps://roadView?p=37.537229,127.005515 | 지도앱을 실행하고 지정된 좌표(WGS84)의 로드뷰 마커 를 보여줍니다. |
지도앱 버전 | OS 버전 | URL Scheme | 설명 |
---|---|---|---|
모든버전 | 1.6 + | daummaps://transitInfo?id=1100061001&type=busline | 지도앱을 실행하고 버스 노선 상세화면을 보여줍니다. |
모든버전 | 1.6 + | daummaps://transitInfo?id=11030671004&type=busstop | 지도앱을 실행하고 버스정류장 상세화면을 보여줍니다. |
모든버전 | 1.6 + | daummaps://transitInfo?id=11030671004&type=busstop&busStopName=순천향대학병원 | 지도앱을 실행하고 버스정류장 패널을 보여줍니다. |
모든버전 | 1.6 + | daummaps://transitInfo?id=SES2632&type=subway | 지도앱을 실행하고 지하철역 상세화면을 보여줍니다. |
지도앱 버전 | OS 버전 | URL Scheme | 설명 |
---|---|---|---|
모든버전 | 1.6 + | daummaps://storeview?id=659 | 지도앱을 실행하고 지정(스토어뷰ID)된 스토어뷰를 보여줍니다. |
geo:37.537229,127.005515
geo:0,0?q=서울+용산구+이태원로+179
Daum 지도 Android API 를 시작하는 방법과 기능에 대해 간략하게 소개해 보았습니다. 여러분의 멋진 어플리케이션을 위해서 더 자세한 API의 기능들을 살펴보세요.
참고해야 할 사항
하기 참고사항은 http://swalloow.tistory.com/81 사이트를 참고하였습니다.
1.
우선 키 발급받는 과정입니다.
간단한 과정이라 API 페이지에 따로 언급이 없습니다.
http://developers.daum.net/console/
위 링크의 다음 개발자 페이지의 좌측 상단에 앱 만들기 버튼을 눌러 내 프로젝트를 생성해야 합니다.
그리고 나면 자동으로 키가 발급됩니다.
이 때 안드로이드 패키지 명은 com.company.projectName 형식으로 들어가면 됩니다.
* 잘 모르겠다면 AndroidManifest.xml 에 있는 package = " " 부분을 보시면 됩니다.
2.
라이브러리를 추가해야 할 때 가이드 문서를 보면 오류가 나는 경우가 많습니다.
저는 http://developljy.tistory.com/11 이 링크의 도움을 받았습니다.
결과적으로 libs 라는 폴더에는 libDaumMapAndroid.jar 파일을 넣고
나머지 armeabi 폴더에 있는 .so 파일들은 main 디렉토리 하위에 넣어 해결했습니다.
3.
마시멜로 버전부터 적용되는 권한 체크 문제입니다.
분명히 Manifest.xml 에 ACCESS_FINE_LOCATION 권한을 추가했는데 이러한 오류가 발생할 것입니다.
java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
API level 23 부터는 사용자의 사생활 침해 문제로 인해 권한 체크가 필수가 되었습니다.
따라서 사용자는 앱 설치 후, 위치정보나 카메라 등 접근권한을 동의해야만 사용가능합니다.
그 중에서 위치정보를 받는 권한은 필수 권한이기 때문에 체크를 하지 않으면 오류가 발생합니다.
이를 해결하기 위한 제일 간단한 방법은 targetSdkVersion을 23으로 낮추는 방법인데,
마시멜로 버전 지원이 안되기 때문에 권하지 않습니다.
따라서 보통 다이얼로그를 띄워 권한을 체크하는 것으로 해결합니다.
권한 체크에 대한 안드로이드 공식 문서는 아래의 링크를 참고
https://developer.android.com/training/permissions/requesting.html
저는 TedPermission이라는 박상권님의 권한체크 라이브러리를 사용해서 해결했습니다.
라이브러리 소개 링크 : http://gun0912.tistory.com/61
실제 적용된 코드는 다음과 같습니다.
public class MainActivity extends AppCompatActivity {
static final String API_KEY = "please edit your api key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Using TedPermission library
PermissionListener permissionlistener = new PermissionListener() {
@Override
public void onPermissionGranted() {
Toast.makeText(MainActivity.this, "권한 허가", Toast.LENGTH_SHORT).show();
// MapView 객체생성 및 API Key 설정
MapView mapView = new MapView(MainActivity.this);
mapView.setDaumMapApiKey(API_KEY);
RelativeLayout mapViewContainer = (RelativeLayout) findViewById(R.id.map_view);
mapViewContainer.addView(mapView);
// 중심점 변경
mapView.setMapCenterPoint(MapPoint.mapPointWithGeoCoord(37.53737528, 127.00557633), true);
// 마커 생성 및 설정
MapPOIItem marker = new MapPOIItem();
marker.setItemName("Default Marker");
marker.setTag(0);
marker.setMapPoint(MapPoint.mapPointWithGeoCoord(37.53737528, 127.00557633));
marker.setMarkerType(MapPOIItem.MarkerType.BluePin); // 기본으로 제공하는 BluePin 마커 모양.
marker.setSelectedMarkerType(MapPOIItem.MarkerType.RedPin); // 마커를 클릭했을때, 기본으로 제공하는 RedPin 마커 모양.
mapView.addPOIItem(marker);
}
@Override
public void onPermissionDenied(ArrayList<String> deniedPermissions) {
Toast.makeText(MainActivity.this, "권한 거부\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
}
};
new TedPermission(this)
.setPermissionListener(permissionlistener)
.setRationaleMessage("지도 서비스를 사용하기 위해서는 위치 접근 권한이 필요해요")
.setDeniedMessage("왜 거부하셨어요...\n하지만 [설정] > [권한] 에서 권한을 허용할 수 있어요.")
.setPermissions(Manifest.permission.ACCESS_FINE_LOCATION)
.check();
}
}
출처: http://seyo73.tistory.com/1 [CLOUD7]