'받는법'에 해당되는 글 1

  1. 2013.12.27 구글맵(GoogleMap) v2 띄우기 (최신) (101)

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

작성일에 직접 만들어가면서 포스팅한것이기 때문에,

작성일 기준으로 가장 최신 자료입니다.


1. 맵 표시를 위해 SDK Manager를 이용해 Google Play Service 최신버전 업데이트 


작은 빨간네모안의 SDK Manager를 누르면 Android SDK Manager 창이 위와같이 뜬다.

휠을 내려서 Extras 를 찾아서 하위의 Google Play services 를 체크하고 Install packages... 를 누른다

(필자는 이미 최신버전이라 단추가 비활성화상태)


이까지 마친 뒤 SDK 폴더로 이동 한 다음,

sdk/extras/google/google_play_services/libproject/google-play-services_lib 파일을 import해 준다.

밑의 사진을 보고 따라한다.







이 그림은 필자와 약~간 다를건데 필자는 이미 라이브러리를 import 해놨기때문에 위와같이 나온다. 상관하지않는다.




그럼 이렇게 프로젝트가 생성되고,


생성된 프로젝트를 우클릭 > Properties 한 다음 설정을 위와 같이 맞춘다.

Build Target은 꼭 2.3.3 이 아니라도 상관 없다. (보다 낮은것은 추천하지 않는다.)



그리고 이제 지도를 띄울 프로젝트를 만들어 보겠다.


File > New > Android Application Project 순서로 실행 

(Android Application Project 가 없는사람은 당황하지 말고 Other... > Android > Android Activity 순으로 실행한다.



Next 한 다음 대충 다음 다음 Finish 해 주면 프로젝트 생성 완료.



만들어진 프로젝트에 우클릭 > Properties 을 해 주고,





Android 클릭, Add.. 클릭 , google-play-services_lib 클릭 후 ok > ok 해 준다.

아까와는 달리 Is Library는 체크하지 않는다.


이까지 했다면 이제 맵을 띄울 바탕은 끝났다. 본격적으로 맵을 띄워보자.



2. 구글맵 API Console 등록

우선 구글계정이 필수, 로그인 하였다면

https://code.google.com/apis/console로 접속한다.


보는바와 같이 APIs & auth의 APIs 카테고리에서

구글맵 서비스를 이용하기 위해 Google Maps Android API v2 를 OFF > ON 으로 바꿔준다. 필수



3. API Key 발급

맵을 띄우기 위해서는 자신만의 고유한 API Key를 발급받아야한다.


이를 발급받기 위해서는 컴퓨터의 디버그용 키스토어를 발급받아야하는데, 간단히 설명하자면

개발을 할 때는 디버그 키스토어라는것을 이용해 어플에 서명(자신을 각인)하여 개발하고,

상용할 때는 배포용 디버그 키스토어를 이용해 어플에 서명을 하고 배포해야 사용이 가능하다.

여기서는 디버그 키스토어를 사용하는데, 잘 이해가 안간다면 깊히 생각하지 않아도 된다.


시작 > 실행 > cmd 를 이용해 명령프롬프트창을 띄운다(단축키  윈도우키 + R 후 cmd 엔터)

디버그용 키스토어가 저장되는 위치로 이동하기 위해 본인의 운영체제에 따라 다음과 같이 입력한다. 

Windows XP : C:\Documents And Settings\사용자 계정\.android

Windows Vista/7 : C:\Users\사용자 계정\.android

OSX/Linux : ~/.android


필자는 윈7에 사용자계정은 fureun 이므로




엔터를 치면 경로가 이동하게 되고, 그 다음 위 사진과 같이

keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android

이렇게 입력후 엔터를 치면


이렇게 나오는데, 여기서 맵을 띄우기 위해 필요한것은 SHA1: 뒤의 16진수이다.

창을 닫기 전에 따로 메모장등에 적어서 보관해놓는다.


그리고 아까 API Console로 돌아가서



누르면 창이하나 뜨는데 Android를 선택 하고,


위와같이 입력한 뒤 Create Client ID 를 누른다.

큰 네모에는 아까 명령프롬프트에서 추출한 SHA1값;패키지명


드디어 API key가 나왔다.


위의 키값을 따로 저장한 뒤, 다시 프로젝트로 돌아가보겠다.


매니패스트를 켠 뒤 AndroidManifest.xml 에서

다음과 같이 빨간네모부분을 추가한다






맨밑의 android:value= 에는 조금전 발급받은 Api key를 입력하면 된다.

따라치기 귀찮으면 밑의 글 복붙


    <uses-feature

        android:glEsVersion="0x00020000"

        android:required="true" />

    

    <permission

        android:name="com.example.SearchMJ.permission.MAPS_RECEIVE"

        android:protectionLevel="signature" >

    </permission>


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

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

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

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

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

-------------------------------------------------

<meta-data

            android:name="com.google.android.maps.v2.API_KEY"

            android:value="Api key" />

<meta-data

            android:name="com.google.android.gms.version"

            android:value="@integer/google_play_services_version" />


그리고 메인액티비티의 레이아웃(res > layout > activity_main.xml)으로 이동해서


입력. 소스는

    <fragment

   android:id="@+id/map"

   android:name="com.example.GoogleMapVersion2.Fragment"

   android:layout_width="fill_parent"

   android:layout_height="fill_parent"

   class="com.google.android.gms.maps.SupportMapFragment" />




다음과 같이 MainActivity extends ActivityFragmentActivity 로 바꿔준다

그리고 실행 하면



짜잔 ~ 하고 맵이 나타난다.

최초 시작 위치나 카메라 줌 레벨 등은 동일 카테고리 내의 다른 포스팅을 참조하기 바란다.



혹시 에러사항이 있거나 문의사항이 있다면 댓글 남기면 친절히 답변 달아드리겠음

한참걸렸네 ..



댓글을 달아 주세요

  1. 이전 댓글 더보기
  2.  댓글주소  수정/삭제  댓글쓰기 덩치 2014.09.23 10:44 신고

    ActionBarActivity를 사용하셔서 그런것같습니다.
    새로운 액티비티를 만드시고, extends Activity를 FragmentActivity로 변경하신 다음, 컨트롤+시프트+O로 임포트 해주시고
    기존 액티비티에서 맵 액티비티로 intent 시키는 방식으로 하시면 될듯합니다.

    •  댓글주소  수정/삭제 구글맵한번 2014.09.23 13:58

      네... 그렇군요.. 감사 드립니다.

      (초보인 저에게도 친절하게 답변주셔서 완전 감사드려요^^)

  3.  댓글주소  수정/삭제  댓글쓰기 DungChi Plz 2014.10.09 19:27

    안녕하세요 글을 읽고 따라하다가..cmd 창에서 keytool -list ~~ 이런 명령어를 입력하는데 keytool은 내부 또는 외부 명령, 실행할 수 없는 프로그램, 또는 배치 파일이 아닙니다. 라고 뜨는데...이거 어떡하죠??ㅜㅜ진도가 안나가네용....

  4.  댓글주소  수정/삭제  댓글쓰기 2014.10.20 23:01

    비밀댓글입니다

  5.  댓글주소  수정/삭제  댓글쓰기 강민경 2014.10.28 13:11

    위에 있는 예제대로해서 핸드폰으로 확인했는데 지도화면만 안뜨네요ㅠㅠㅠ이거 어떡해해야 지도가 화면에 나올까요????ㅠㅠ

    •  댓글주소  수정/삭제 덩치 2014.10.31 11:07 신고

      지도만 나타나지 않는 에러의 경우 대부분 api 키값이 정상적이지 않을 경우 발생합니다.
      api키가 정확한지 다시한번 확인해보세요

  6.  댓글주소  수정/삭제  댓글쓰기 꺌갸루 2014.11.04 00:48

    핸드폰을 통해 실행하자 마자 바로 종료되었는데 로그캣을 봐도 어떤 오류인지 모르겠어서요..
    무엇이 잘못 되었을까요..

    11-04 00:32:02.243: W/dalvikvm(32575): Unable to resolve superclass of Lcom/example/googlemap/MainActivity; (3)
    11-04 00:32:02.243: W/dalvikvm(32575): Link of class 'Lcom/example/googlemap/MainActivity;' failed
    11-04 00:32:02.243: D/AndroidRuntime(32575): Shutting down VM
    11-04 00:32:02.243: W/dalvikvm(32575): threadid=1: thread exiting with uncaught exception (group=0x41715da0)
    11-04 00:32:02.243: E/AndroidRuntime(32575): FATAL EXCEPTION: main
    11-04 00:32:02.243: E/AndroidRuntime(32575): Process: com.example.googlemap, PID: 32575
    11-04 00:32:02.243: E/AndroidRuntime(32575): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.googlemap/com.example.googlemap.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.googlemap.MainActivity" on path: DexPathList[[zip file "/data/app/com.example.googlemap-4.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.googlemap-4, /vendor/lib, /system/lib]]
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.app.ActivityThread.access$900(ActivityThread.java:161)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.os.Handler.dispatchMessage(Handler.java:102)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.os.Looper.loop(Looper.java:157)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.app.ActivityThread.main(ActivityThread.java:5356)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at java.lang.reflect.Method.invokeNative(Native Method)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at java.lang.reflect.Method.invoke(Method.java:515)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at dalvik.system.NativeStart.main(Native Method)
    11-04 00:32:02.243: E/AndroidRuntime(32575): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.googlemap.MainActivity" on path: DexPathList[[zip file "/data/app/com.example.googlemap-4.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.googlemap-4, /vendor/lib, /system/lib]]
    11-04 00:32:02.243: E/AndroidRuntime(32575): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.app.Instrumentation.newActivity(Instrumentation.java:1079)
    11-04 00:32:02.243: E/AndroidRuntime(32575): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2222)
    11-04 00:32:02.243: E/AndroidRuntime(32575): ... 11 more

  7.  댓글주소  수정/삭제  댓글쓰기 안녕하세요 .. 2014.11.08 13:11

    안녕하세요 저는 public class MainActivity extends ActionBarActivity 되는데요 .
    그리고R.layout 이게 r을 못찾아요.. 왜이런지 아세요>>ㅠㅠ

    •  댓글주소  수정/삭제 덩치 2014.11.08 17:55 신고

      ActionBarActivity 에서
      ActionBar 를 지우시고
      빨간줄 다 떠있는 상태에서
      ctrl + shift + O
      를 눌러주신다음
      맨위쪽 import부분에 import android.R;
      이 있다면 지워주시고
      R을 제외한 빨간줄 뜨는부분을 전부 소스코드상에서 지워주신 다음
      실행해보세요

  8.  댓글주소  수정/삭제  댓글쓰기 회색창 2014.11.12 01:55

    이클립스에서 window- preferences - Android - Build에 있는 MD5와 SHA1 fingerprint를 이용하여 구글 api key를 받아와서 구글에서 api key를 만들었는데요 apk파일로 만들어서 실행시키면 아래 구글과 확대 축소 버튼만있고 지도맵에는 회색으로 뜨네요ㅠㅠ 저렇게 키를 받아오면 안되나요? 오류뜨는건 하나도없어요ㅠㅠ

    •  댓글주소  수정/삭제 덩치 2014.11.12 08:39 신고

      apk파일로 만든다는것은 사이닝을 한다는 말씀이시죠 ?
      그러면 디버그용 키스토어가 아니라 배포용 키스토어를 받으셔야합니다.
      배포용 키스토어 로 검색해보세요 ~

  9.  댓글주소  수정/삭제  댓글쓰기 안드로이드 2014.11.12 20:59

    안녕하세요 블로그 글 참고하면서 잘보고잇습니다!
    다름이 아니고 에뮬레이터에서는 구글맵이 정상적으로 뜨는데 디바이스에 들어가면
    흰색화면만 뜹니다..왜이런지 혹시 이유를 아시나요?

  10.  댓글주소  수정/삭제  댓글쓰기 안드로이드 2014.11.12 21:18

    11-12 06:20:02.587: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:02.587: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:02.587: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:02.587: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:02.597: E/SurfaceFlinger(49): glCheckFramebufferStatusOES error -537631906
    11-12 06:20:02.597: E/SurfaceFlinger(49): got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot
    11-12 06:20:02.597: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:02.597: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:08.677: E/SoundPool(381): error loading /system/media/audio/ui/Effect_Tick.ogg
    11-12 06:20:08.677: E/SoundPool(381): error loading /system/media/audio/ui/Effect_Tick.ogg
    11-12 06:20:08.687: E/SoundPool(381): error loading /system/media/audio/ui/Effect_Tick.ogg
    11-12 06:20:08.687: E/SoundPool(381): error loading /system/media/audio/ui/Effect_Tick.ogg
    11-12 06:20:08.687: E/SoundPool(381): error loading /system/media/audio/ui/Effect_Tick.ogg
    11-12 06:20:08.687: E/SoundPool(381): error loading /system/media/audio/ui/KeypressStandard.ogg
    11-12 06:20:08.697: E/SoundPool(381): error loading /system/media/audio/ui/KeypressSpacebar.ogg
    11-12 06:20:08.697: E/SoundPool(381): error loading /system/media/audio/ui/KeypressDelete.ogg
    11-12 06:20:08.697: E/SoundPool(381): error loading /system/media/audio/ui/KeypressReturn.ogg
    11-12 06:20:08.697: E/SoundPool(381): error loading /system/media/audio/ui/KeypressInvalid.ogg
    11-12 06:20:08.817: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:08.827: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:08.827: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:08.827: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:08.827: E/SurfaceFlinger(49): glCheckFramebufferStatusOES error -537631906
    11-12 06:20:08.827: E/SurfaceFlinger(49): got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot
    11-12 06:20:08.827: E/libEGL(49): called unimplemented OpenGL ES API
    11-12 06:20:08.827: E/libEGL(49): called unimplemented OpenGL ES API
    로그캣을 첨부하겟습니다!!!

  11.  댓글주소  수정/삭제  댓글쓰기 쎄미 2015.02.11 11:52 신고

    고맙습니다~

  12.  댓글주소  수정/삭제  댓글쓰기 초보초보 2015.03.31 13:22

    android:name="com.example.GoogleMapVersion2.Fragment"
    에서 GoogleMapVersion2.Fragment에 빨간줄이떠요.. 왜그럴까요ㅠㅠ

  13.  댓글주소  수정/삭제  댓글쓰기 완전초보임 2015.04.14 21:21

    덩치형님 맵은 일단 성공했슴돠
    저는 여기서 gps 기능을 추가 하고싶습니다ㅠㅠ
    부탁합니다 형님

  14.  댓글주소  수정/삭제  댓글쓰기 멍멍 2015.05.12 21:01

    안녕하세요. 올려주신 글 보면서 하고 있는데요, 마지막 부분에서 MainActivity extends Activity 를 FragmentActivity 로 바꿔주라고 하셔서 바꿔봤는데, 빨간 줄이 많이 뜨네요...
    그래서 그냥 ctrl + shift + o 키 눌러서 빨간줄 없애긴 했는데.. 옆에는 느낌표가 많이 뜨구요..
    이 다음에는 어떻게 해야 하나요?? 완전 초보라서..ㅠㅜ
    알려주시면 감사하겠습니다!!

  15.  댓글주소  수정/삭제  댓글쓰기 함호식 2015.05.15 23:48

    안녕하세요
    xml의 android:name="com.example.ham.childhapp"이부분에서 childapp부분이 빨강색으로 뜨는데 왜그러는걸까요?
    (package com.example.ham.childhapp;)
    그리고 따라서 실행시키니 액티비티 왼쪽아래 Google이라는 로고만 보이고 회색화면에 지도는 보이지 않는데 어느문제일까요?
    hhs9102@naver.com메일주소입니다.

  16.  댓글주소  수정/삭제  댓글쓰기 배문호 2015.05.19 02:51

    MainActivity에서 FragmentActivity로 바꾸고 ctrl + shift + o 눌렀는데
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }
    여기에서 activity_main가 빨간줄 뜨고...
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }
    여기에서 R.menu.main, menu 이거중 main이 빨간줄...
    public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
    return true;
    }
    return super.onOptionsItemSelected(item);
    }
    여기에서 action_settings가 빨간줄 뜨네요...
    어떻게 해야될까요;;;

  17.  댓글주소  수정/삭제  댓글쓰기 2015.07.21 23:54

    비밀댓글입니다

  18.  댓글주소  수정/삭제  댓글쓰기 잇힛 2015.08.12 17:54

    저대로 따라했는데
    E/dalvikvm(17347): Could not find class 'android.app.AppOpsManager', referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zza
    08-12 17:47:44.255: W/dalvikvm(17347): VFY: unable to resolve check-cast 26 (Landroid/app/AppOpsManager;) in Lcom/google/android/gms/common/GooglePlayServicesUtil;
    08-12 17:47:44.255: D/dalvikvm(17347): VFY: replacing opcode 0x1f at 0x000e
    08-12 17:47:44.255: I/dalvikvm(17347): Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zzh
    08-12 17:47:44.255: W/dalvikvm(17347): VFY: unable to resolve virtual method 479: Landroid/content/pm/PackageManager;.getPackageInstaller ()Landroid/content/pm/PackageInstaller;
    08-12 17:47:44.255: D/dalvikvm(17347): VFY: replacing opcode 0x6e at 0x000b
    08-12 17:47:44.265: W/GooglePlayServicesUtil(17347): Google Play services out of date. Requires 7571000 but found 3159130
    08-12 17:47:44.265: W/GooglePlayServicesUtil(17347): Google Play services out of date. Requires 7571000 but found 3159130
    08-12 17:47:44.275: W/GooglePlayServicesUtil(17347): Google Play services out of date. Requires 7571000 but found 3159130
    08-12 17:47:44.275: W/GooglePlayServicesUtil(17347): Google Play services out of date. Requires 7571000 but found 3159130
    08-12 17:47:44.275: W/GooglePlayServicesUtil(17347): Google Play services out of date. Requires 7571000 but found 3159130

  19.  댓글주소  수정/삭제  댓글쓰기 잇힛 2015.08.12 17:54

    위와 같은 로그뜨면서 맵이 안뛰워지네요..

  20.  댓글주소  수정/삭제  댓글쓰기 2016.04.06 00:21

    비밀댓글입니다

    •  댓글주소  수정/삭제 덩치 2016.04.06 15:22 신고

      appcompat_v7 라이브러리가 없는 경우인것같은데요, 임시방편으로 values-v21과 같이 에러나는 파일을 모두 삭제해주시면 됩니다.
      근본적인 해결 방법은 appcompat_v7 라이브러리를 추가해주세요

  21.  댓글주소  수정/삭제  댓글쓰기 이히히 2016.04.06 00:23

    위에처럼 따라했는데 import까지 똑같이 따라했는데 안되네요....C:\Users\osoung\Documents\android\google-play-services_lib\res\values-v21\appinvite_styles.xml:5: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/Theme.Material.Light.DialogWhenLarge.NoActionBar'. 이런 오류가 뜨고 res에 values-v21에 x표시가 뜨네요...이유가 알고싶습니다...