하나. SupportMapFragment :
일단 가장 중요한 것은 일반적인 View가 아닌 Fragment로 변경된 점인데요.다양한 화면 구성을 위해 Fragment를 선보이면서 이에 맞춰 기존의 MapView(이하 V1)에서 SupportMapFragment(이하 V2)로 클래스가 변경이 되었습니다.둘. APIKey 관리
그동안 V1을 사용 할 때는 각 PC에서 디버그용 Apikey 를 가지고 있어야 해서. PC를 옮겨서 작업할 때는 V1에 들어갈 Apikey를 계속 바꿔줘야 하는 번거로움이 있었습니다. 하지만 V2에선 API Console을 통해 키를 발급받아 좀더 효율적인 APIkey 관리를 할 수 있게 되어 다른 PC에서도 APIkey를 변경 하지 않고도 Google Map이 출력이 됩니다.
셋. Google APIs? Byebye~
기존의 V1을 사용하기 위해서는 Project build target을 Google APIs로 바꿔서 작업을 해야 했는데 V2를 사용 하기 위해서는 google-play-services_lib 프로젝트를 불러와 사용해야 합니다. ( 저는 이점에 제일 번거롭다고 생각이 듭니다.. ㅠㅠ)
2. 일단 띄워보자
하나. 준비작업
V2를 해보면서 제일 번거로웠던 점은 V1보다 번거로워진 준비 작업이 아닐까 싶은데요. 일단 스텝바이스텝으로 천천히 설명해보겠습니다.
- API Console 등록
https://code.google.com/apis/console/ API Console로 접속해 새로운 프로젝트를 생성 해야합니다.
![]()
첫번째로 프로젝트 생성을 해줍니다. 이정도는 뭐 껌이죠 ~_~
![]()
프로젝트 이름을 정해줍니다. 저는 MapV2Test라고 했네요.
![]()
프로젝트를 생성하게 되면 바로 Services 탭으로 넘어가게 됩니다.
![]()
Google Map Android V2라는 항목이 있습니다. 이걸 Off -> On으로 돌려준 뒤 API Access탭으로 넘어갑니다.
![]()
API Access탭으로 넘어 가면 바로 API Key가 보이게 되는데 이 키가 V1에서 사용되던 APIKey처럼 V2에서도 같은 역할을 해주는 키값이 되겠습니다.
둘. 맵 띄워 보기
- SDK 업데이트
일단 맵을 띄우기 위해선 SDK를 최신버전으로 업데이트 해야 합니다. ( 필수 )
밑에 스크린샷에 보이는 Google PlayService 를 최신버전으로 업데이트 시켜줘야 합니다.
![]()
- import library project
맵을 호출 하기 위해서는 SDK폴더에 있는 라이브러리 프로젝트가 필요 합니다.
SDK 폴더 안에 있는 sdk/extras/google/google_play_services/libproject/google-play-services_lib 를 import 해줍니다.
![]()
- 맵뷰를 띄울 새 프로젝트 만들기
일단 샘플링을 하기 위해서는 빈 프로젝트가 필요 하겠죠? 새 안드로이드 프로젝트를 만들어 줍니다.
이때 주의할 사항은 Target SDK를 Google APIs로 맞출 필요가 없다는 것 입니다.
원하시는 SDK을 잡으시고 빈 프로젝트를 만들어 줍니다. ( 스크린샷을 안떠서 바로 넘어 가겠습니다 ' ㅅ';;)
- 라이브러리 불러오기
새로 만든 프로젝트에 import 해온 google-play-services_lib를 추가해 줍니다.
![]()
![]()
![]()
참 쉽죠?
- support-v4 라이브러리 추가
SupportMapFragment를 넣기 위해서는 서포트 라이브러리가 꼭!!!! 필요 합니다.
![]()
-Manifest 설정
매니패스트 설정 부분입니다. 첫번째 스크린샷은 application 밖에서 설정 해주는 부분입니다.
![]()
meta-data 설정을 하는 부분입니다.
해당 엘리먼트는 API Console 에서 발급받은 API key를 입력을 해야 올바른 맵을 볼 수 있으니 꼭 넣어 주셔야 합니다 ( 제 테스트 키 값은 이러네요.. )
- xml : SupportMapFragment 추가
위에서 말씀드렸듯이 V1에서는 View형태로 사용 했지만 V2에서는 Fragment 형태로 변경이 되었습니다.
![]()
- Activity - > FragmentActivity로 변경
SupportMapFragment는 서포트 라이브러리의 FragmentActivity에서 동작을 합니다.
MainActivity가 상속한 Activity를 Fragment Activity 로 바꿔줍니다.
![]()
- Run as Application
일단 실행 시켜보겠습니다.
![]()
3. 그밖의 기능
하나. 마커
V2 샘플을 만들면서 가장 편했던 기능은 V1의 Overlays 관리, V2에서는 Market 관리인것 같습니다.
V1에서는 Overlays를 MapController에 넣어 줘야 하는 번거로움이 있었지만 V2에서는 MapController와 같은 Controller 클래스는 찾아 볼수가 없었다는 점인데요.
아래 소스 캡쳐 화면을 보시면 좀더 간결하게 진행 할 수 있다는것을 보실 수 있습니다.
![]()
- 위에서 설명이 안됐지만 MapFragment를 선언 해주는 부분과 마커를 추가 하는 소스입니다.
<1> 은 V1의 MapView 클래스에서 V2의 GoogleMap 클래스로 클래스명이 변경되었습니다. 좀더 직관적으로 바꼈네요.
<2>은 MapFragment를 불러오는 부분입니다. Fragment를 불러오는 형식이 비슷해 보이네요
<3>은 MapFragment에 마커를 추가 하는 부분인데요. MarketOptions(추후 설명 업데이트) 클래스와 LatLng(Double타입, Double타입) 클래스가 눈에 띕니다.
둘. animate & move
마커를 찍어봤으니 이제 카메라를 이동 시켜봐야겠죠.
일단 제일 간단한 animateCamera와 moveCamera를 소개해 드리겠습니다.
- animateCamera
animateCamera 함수는 이전에 V1에서 사용 했던 animateTo 함수와 같은 기능을 합니다.
void setAnimate(){ googleMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(37, 123))); }
V2에서 바뀐점은 CameraUpdate라는 클래스를 사용하는 것인데 해당 클래스를 사용 할 때는 CameraUpdateFactory를 가져와 사용 합니다. 여기서도 중요한것은 LatLng 클래스를 사용 합니다.
- moveCamera
moveCamera 함수는 animateCamera처럼 애니메이션이 적용 되지 않고, 바로바로 맵이 이동되는 함수 입니다.
void setMove(){ googleMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(37, 123))); }
벌써 서른이라니..
- 111.png (3.7KB)(60)
- 222.png (5.0KB)(48)
- 333.png (57.5KB)(8)
- 5555.png (37.2KB)(6)
- 4444.png (42.2KB)(9)
- 123.png (109.9KB)(5)
- 234.png (13.4KB)(9)
- 345.png (56.7KB)(12)
- 456.png (20.7KB)(8)
- 567.png (60.1KB)(6)
- 678.png (18.9KB)(7)
- 789.png (17.1KB)(9)
- 000000002.png (9.2KB)(25)
- 000000000000000003.png (6.1KB)(8)
- 000000004.png (24.2KB)(9)
- 0000001.png (140.4KB)(5)
- 454545545.png (31.8KB)(10)
- 454545545.png (31.8KB)(29)
안녕하세요... 저 화면까지는 만들어 봤는데요... 어떻게 하면 화면 중간에 울나라... 아니 울집이 나오게 할 수 있을까용???
ㅋㅋㅋ. 너무 허접한 질문인가요???
감사합니다... 들어 주셔서...
확대축소 버튼은 보이는데 맵은 보이지 않고 흰화면만 보입니다.
로그를 확인 해보니
Failed to load map. Could not contact Google servers.
이렇게 나옵니다.
api key, sha1 지문키 다 확인해보고. 다시 처음부터 세번이나 해봤지만
여전히 흰화면과 확대축소 버튼만 보이고 맵은 보이지가 않습니다.
지금 프로젝트 진행 중인데, 예상치도 못한 부분에서 막혀서 쩔쩔 매고 있습니다.
빠른 해결방안 부탁 드립니다.
수고하십시오.
저도 똑같은 문제 때문에 며칠째 삽질하는 중입니다. ㅠㅠ
써주신대로 똑같이 따라서 했는데...지도가 뜨질않네요.
코드를 보여드릴필요가 없는게, 아예 똑같습니다.
java 파일에서 물론 파일 이름에 따라서
setContentView(R.layout.activity_google_map);
getMenuInflater().inflate(R.menu.google_map, menu);
이거만 다를뿐...
근데 inflate(R.menu.google_map, menu); 이부분에서 R.menu 여기서 가져오는거 맞나요..?
그리고..제가 폰을 업글안해서
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="10" />
이렇게 사용중인데..혹시 버젼때문에 맵이 뜨지 않는건가요?
답변부탁드립니다 ㅠㅠ!도와주세용!
보고 잘 따라하고 있습니다^^ 혹시 줌 레벨을 지정할 수 있을까요? 이전버전에는 setZoom 이라는 것이 이던데....
googleMap 클래스에 getMaxZoomLevel() 이라는 것이 있던데 이걸 사용하면 될 것 같은데
어떻게 사용하지는 모르겠습니다ㅠㅠ
animateCamera와 moveCamera 함수를 찾아보니 카메라를 이동하는 것이라고 나오더군요 ㅠ
제가 하고 싶은건 최대 확대 수? 최소 축소 수를 지정하고 싶은 것이였는데 말이죠....
혹시 이 두가지를 사용해서도 되는건가요? 제가 잘 몰라서요ㅠㅠㅠ...
CameraUpdateFactory 의 zoom 함수 관련 이 있던데 제가 찾는게 어떤 것인지 도대체 알 수가 없더라구요..
답변 달아주셔서 감사합니다^^
sample project 에서 maps 을 생성했는데... layout 에서 오류가 납니다... map:cameraTagetLat 이런 것들이 없다고 나오는데...
API버젼이 문제일까요??? 16, 17 다 해 보았는데... 오류가 나더라구요... 흠...
알려주세요... 제발~ 플리즈~~~
이걸 참고해서 어떻게 되기는 했는데요...
library project 로 사용하는데... sdk-폴더를 c: 드라이브에 깔고 eclipse 을 d : 드라이드에 설치해서 사용하고 있어서 sdk 가 있는 c 드라이브에 있는 것을 설정해 주었더니 계속 library project 설정이 오류가 나더군요... 해서 eclipse 가 있는 d 드라이브에 있는 걸루 다가 다시 했더니 잘 되네요.. 흠... 일단 한가지는 성공을 했네요.. 감사 드려요... ㅎㅎ
해봤는데 실행이 되지 않습니다.
구글 라이브러리 임포트 이후에
퍼미션 설정 부분부터 조금씩 애매하게 모르겟는데
도움좀 주실수 있나요?
구글맵만 3주 보다가 지도도 못띄어 보고 접을만큼 맨붕이 와서 그렇습니다.
ㅋ 복사하기가 어렵군요...
그렇다면.. ㅋ
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ezmo.ezmogooglemaptest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="17" />
<permission
android:name="com.example.mapdemo.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.mapdemo.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<!--
The following two permissions are not required to use
Google Maps Android API v2, but are recommended.
-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyBgg7e9KagR-qYJM_EHP5EBFv3WcJxrvzw" />
<activity
android:name="com.ezmo.ezmogooglemaptest.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activities.EzmoMap"></activity>
</application>
</manifest>
증강현실과 지도를 함께 사용하려고 하는데요
이번에 바뀐 구글맵에서 gl을 사용하더라구요
surfaceView와 카메라뷰 위에 구글맵 올렸더니 카메라화면만 나오네요ㅠㅠ
어떻게 하면 될까요?ㅜㅜ
갈무리님 그리고 커니의 안드로이드 블로그의 커니님 (안드로이드펍의 와니님이신건가요????)
정보 덕에 맵띄우기에 성공했습니다 ^ㅡ^
무더운데 수고하세요 ~ ㅎㅎㅎ
갈무리님~ 님 덕분에 며칠째 고생하던 구글맵을 드디어 띄워보나보다! 하고 열심히 코드 따라했는데요. 구글맵이 안뜨네요 ㅠ
로그는 xml에서 fragment가 이상하다는데 뭐가 잘못된걸까요? ㅠ 안되서 다시 새롭게 프로젝트 생성해서 나름 한줄한줄 꼼꼼하게 다 따라한것 같은데 말이에요.
제 xml과 로그 스샷한거 첨부할께요.
로그는 저 밑에도 더 있어요. 혹시 아래도 필요하실까봐 txt파일로 첨부했어요.
조언 부탁드립니다.
좋은 게시물을 보고 따라 해 봤읍니다. 감사합니다.
그런데 MapView에서 사용하던 Overlay 기능은 어떻게 써야 하는지 알려 주시면 감사하겠읍니다.
Marker나 line 그리는 것은 V2 Version에서 제공하는 것을 사용하면 되는 것 같은데
그냥 지도 Fragment 위에다 제가 그리고 싶은 그림이나 Text등을 출력하려고 하면 어떻게 하는 것이 좋을 까요?
인터넷을 며칠째 찾고 있는데 Overlay 기능을 찾을수가 없네요...
감사합니다.
저도 그게 궁금해서 찾다가 Ground Overlays 라는 기능이 그 역할은 대신한다는걸 알았습니다.
https://developers.google.com/maps/documentation/android/groundoverlay
위 링크 타고가 보시면 오버레이 하는 방법들 나와있습니다.
V2로 올라가면서 메모리 누수가 좀 잡혔으려나요..