반응형


Google Maps Android API를 사용하는 기본적인  방법과 사용시 발생할 수 있는 문제점에 대해 다룹니다.




1. 간단한 안드로이드 구글맵 예제 동작시키기


2. Google Maps Android API 예제 코드 설명


3. 관련 포스팅


    3.1. Android Google Map에 현재 위치 표시하기( FusedLocationProviderClient 사용)

    3.2. Android Google Map에 현재 위치 표시하기( GoogleApiClient, FusedLocationApi 사용)

    3.2. Places API Web Service를 사용하여 Google Map에 현재 위치 주변의 음식점 표시하기

    43.3. GenyMotion 가상머신에 Google Apps설치하여 Google Maps Android API 테스트 하기




테스트 환경은 다음과 같습니다.


Android Studio 4.0.1

Android 10.0+ (R)  API 30




2015. 2.10

. . . . . . . . .

2019. 5. 6   로그캣에서 에러 확인하는 법과 에뮬레이터에서 실행시 문제점  추가 

2019. 7. 19  androidx 관련 내용 추가 

2019. 8. 15  SupportMapFragment로 변경 

2020. 9. 12  테스트 (  Android Studio 4.0.1, Android 10.0+ (R)  API 30 )

                    CameraUpdateFactory.zoomTo가 오동작하는 현상이 발견되었습니다. 

                    줌을 하는 함수인데 사용하면 지도가 엉뚱한 곳으로 이동합니다.


1. 간단한 안드로이드 구글맵 예제 동작시키기

먼저 구글맵 예제를 실행시켜 보고,  후반부에 예제 코드를 설명합니다. 



1. Google Developers Console 사이트 (https://console.developers.google.com/apis/dashboard )에 접속하여 프로젝트 만들기를 클릭합니다.


자주 구성이 바뀌는 편이어서 포스팅에서 진행한 캡쳐 화면과 차이가 있을 수 있습니다.





2. 적당한 프로젝트 이름을 적고 만들기를 클릭합니다.





3.  잠시 기다리면 새로운 프로젝트 생성이 완료 됩니다. 


Google Maps Android API를 사용하려면 추가 설정이 필요합니다.  ENABLE APIS AND SERVICES( API 및 사용 서비스 사용 설정 )을 클릭합니다.





4. google maps android를 검색하여 Maps SDK for Android를 선택합니다. 





5. 사용을 클릭합니다.





6. API가 활성화 되었습니다. 



왼쪽 위에 보이는 탐색 메뉴를 클릭합니다.





메뉴에서 API 및 서비스 > 사용자 인증 정보를 선택합니다.





사용자 인증 정보 만들기를 클릭합니다.





7. 사용자 인증 정보 만들기를 클릭하여 보이는 메뉴에서 API 키를 클릭합니다. 





8.   키 제한을 클릭합니다. 





9.  앞에서 생성된 API 키에 사용 제한을 둘 수 있는 웹페이지가 보입니다.

애플리케이션 제한사항, API 제한사항을 설정할 수 있습니다.





10. Android 앱을 선택하고 항목  추가를 클릭합니다.





11. Google Maps Android API를 사용할 안드로이드 프로젝트의 패키지 이름과 Android Studio가 설치된 컴퓨터에서 생성된 SHA-1 인증서 지문이 필요합니다.


 



12.  SHA-1 인증서 지문을 얻기 위한 과정부터 진행합니다.  윈도우키 + R을 누른 후 cmd를 입력하고 엔터를 눌러서 명령 프롬프트 창을 엽니다. 





윈도우에서는  다음 명령으로 SHA-1 인증서 지문을 획득할 수 있습니다.


"C:\Program Files\Android\Android Studio\jre\bin\keytool" -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android



참고로 우분투 리눅스에서는 다음 명령을 사용합니다.


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



출시할 때에는 다음 명령을 사용하세요. 테스트 해보지는 않았습니다. 

your_keystore_name은 .keystore 확장자를 포함하여 키 저장소의 정규화된 경로와 이름으로 바꿉니다. your_alias_name은 인증서 생성 시 할당한 별칭으로 바꿉니다.


keytool -list -v -keystore your_keystore_name -alias your_alias_name




SHA1 옆에 있는 문자열을 복사해 놓으면 됩니다. 





문제 없으면 14번을 진행하고, 그렇지 않으면 13번을 확인해보세요..




13.  안드로이드 스튜디오에서 앱을 빌드하여 안드로이드 디바이스에 설치한 적이 없어서 다음과 같은 에러가 발생합니다.


keytool 오류: java.lang.Exception: 저장소 파일이 존재하지 않음: C:\Users\webnautes\.android\debug.keystore



간단한 안드로이드 프로젝트를 생성하여 빌드 후, 안드로이드 디바이스에 설치하면 debug.keystore 파일이 사용자 디렉토리의 하위 디렉토리인 .android 디렉토리 안에 생성됩니다.


다시 12번을 진행해보면  SHA1 fingerprint 획득할 수 있습니다.




14.  Google Maps Android API를 사용할 안드로이드 프로젝트를 준비해놓았다면 패키지 이름을 따로 복사해놓고 15번을 진행합니다.  


그렇지 않다면 안드로이드 스튜디오를 실행하여 새로운 프로젝트를 생성합니다.  



아래 화면에서 Start a new Android Studio project를 선택하거나 메뉴에서 File > New > New Project를 선택합니다.




Create New Project 창의 Choose your project에서 Empty Activity를 선택합니다.





Configure your project의 Name 항목에 프로젝트 이름을 적어줍니다.

Language 항목이 Java인지 확인하세요.

본 포스트에서는 Minimum SDK로 API 21를 사용했습니다. 





안드로이드 프로젝트 생성이 완료되어 아래 화면처럼 보일때  MainActivity.java 파일에서 패키지 이름을 복사해둡니다.





15. Google Developers Console 사이트에  복사해두었던 패키지 이름SHA-1 인증서 지문을 붙여넣기하고 완료를 클릭합니다.  





16. API 제한사항에서  키 제한을 선택하고 콤보박스에서 Maps SDK for Android를 체크합니다.  이제 저장을 클릭합니다.





17. 구글 맵 안드로이드 API를 사용하기 위한  API 키가 준비되었습니다. 따로  복사해둡니다.





18. 매네페스트 파일 AndroidManifest.xml<application> 태그 하위요소로 <meta-data> 태그를 사용하여 17번에서 복사해둔 API키를 입력해줍니다.

아래 코드에서 API키를 대체하면 됩니다.



    <application

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="@string/app_name"

        android:roundIcon="@mipmap/ic_launcher_round"

        android:supportsRtl="true"

        android:theme="@style/AppTheme">


         <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="API키" />

        

        <activity android:name=".MainActivity">




19. 등록 받은 키 확인이 필요하다면 Google Developers Console 사이트 (https://console.developers.google.com/apis/dashboard )에서 왼쪽 상단에 있는 프로젝트명을 Google Maps Android API를 위한 것으로 바꾸어 선택합니다.

생성한 프로젝트가 하나라면 자동으로 선택됩니다.





왼쪽에 보이는 메뉴에서 사용자 인증 정보를 클릭합니다.





 API 키를 확인할 수 있습니다.



     


20.  Google Maps Android API를 사용하려면 Google Play services 라이브러리 패키지를 설치해줘야 합니다.


안드로이드 스튜디오로 돌아와서 메뉴에서 Tools > SDK Manager를 선택합니다. 

SDK Tools 탭을 클릭하고 Google Play services 항목을 체크하고 OK를 클릭하여 설치를 진행합니다.

 




21.  모듈 app build.gradleGoogle Play Services 라이브러리를 프로젝트에서 사용한다고 추가해줘야 합니다.



dependencies {

    implementation fileTree(dir: "libs", include: ["*.jar"])

    implementation 'androidx.appcompat:appcompat:1.1.0'

    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

    implementation 'com.google.android.gms:play-services-maps:17.0.0'

    implementation 'com.google.android.gms:play-services-location:17.0.0'

    testImplementation 'junit:junit:4.12'

    androidTestImplementation 'androidx.test.ext:junit:1.1.1'

    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'


}



추가해 준 후 , Sync Now를 클릭합니다. 



노란색으로 표시된 패키지 이름에 마우스 커서를 가져가면 최근 버전을 알려줍니다.

최근버전으로 교체합니다. 하지 않아도 상관없습니다.




최근 버전으로 교체하면 다음처럼 노란색 블럭이 모두 사라집니다.

Sync Now를 클릭해야 반영됩니다. 




 

24. 레이아웃 파일 activity_main.xml 을 다음 내용으로 바꾸어 줍니다.  <fragment> 태그를 지도가 표시될 위치에 적어줍니다.



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/map"
        tools:context=".MapsActivity"
        android:name="com.google.android.gms.maps.SupportMapFragment" />


</LinearLayout>



 

25. 자바 코드 파일 MainActivity.java 를 다음 내용으로 대체합니다. 

첫번째 줄 package 로 시작하는 것은 남겨 두세요. 



import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;



public class MainActivity extends AppCompatActivity
        implements OnMapReadyCallback {

    private GoogleMap mMap;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap googleMap) {

        mMap = googleMap;

        LatLng SEOUL = new LatLng(37.56, 126.97);

        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(SEOUL);
        markerOptions.title("서울");
        markerOptions.snippet("한국의 수도");
        mMap.addMarker(markerOptions);

        // 기존에 사용하던 다음 2줄은 문제가 있습니다. 

        // CameraUpdateFactory.zoomTo가 오동작하네요.
        //mMap.moveCamera(CameraUpdateFactory.newLatLng(SEOUL));
        //mMap.animateCamera(CameraUpdateFactory.zoomTo(10));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SEOUL, 10));


    }

}




26. 실행 결과 화면입니다. 서울 중앙에 빨간색 마커가 보이고 클릭하면 마커에 추가해두었던 설명이 보입니다.

  




2. Google Maps Android API 예제 코드 설명

1. MapFragment는 앱에 지도를 표시하기 위해 사용되는 컴포넌트로 관련 처리를 자동으로 해줍니다. 앱에서 사용하기 위해서는 레이아웃의 액티비티에 <fragment> 태그를 사용하여 추가시켜 주어야 합니다.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/map"
        tools:context=".MapsActivity"
        android:name="com.google.android.gms.maps.SupportMapFragment" />


</LinearLayout>




2. MainActivity 클래스에서  OnMapReadyCallback 인터페이스를 구현한다고 선언해놓고


public class MainActivity extends AppCompatActivity
        implements OnMapReadyCallback {




OnMapReadyCallback 인터페이스의 onMapReady 메소드를 구현해줘야 합니다.  

맵이 사용할 준비가 되었을 때(NULL이 아닌 GoogleMap 객체를 파라미터로 제공해 줄 수 있을 때)  호출되어지는 메소드입니다.  



    @Override
    public void onMapReady(final GoogleMap map) {

      . . . . . . . . . . . . . . . . . . . .

    }




MarkerOptions으로 마커가 표시될 위치(position), 마커에 표시될 타이틀(title), 마커 클릭시 보여주는 간단한 설명(snippet)를 설정하고 addMarker 메소드로 GoogleMap 객체에 추가해주면 지도에 표시됩니다.


        LatLng SEOUL = new LatLng(37.56, 126.97);

        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(SEOUL);
        markerOptions.title("서울");
        markerOptions.snippet("한국의 수도");
        mMap.addMarker(markerOptions);




moveCamera 메소드를 사용하여 카메라를 지정한 경도, 위도로 이동합니다. 

CameraUpdateFactory.zoomTo 메소드를 사용하여 지정한 단계로 카메라 줌을 조정합니다.  1 단계로 지정하면 세계지도 수준으로 보이고 숫자가 커질수록 상세지도가 보입니다. 


        mMap.moveCamera(CameraUpdateFactory.newLatLng(SEOUL));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(10));



글 업데이트한 시점에서는(2020. 9. 12)  CameraUpdateFactory.zoomTo 함수가 오동작을 하여 사용하는 순간 엉뚱한 위치로 이동하는 현상이 있습니다.

다음처럼 코드를 변경하여 해결했습니다.


            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SEOUL, 10));




3. 이제 onCreate 메소드에서 getMapAsync() 메소드를 호출하여 GoogleMap 객체가 준비될 때 실행될 콜백을 등록합니다. 


그러기 위해서는 레이아웃에 추가했던 프래그먼트(com.google.android.gms.maps.SupportMapFragment)의 핸들을 가져와야 합니다. 

FragmentManager.findFragmentById 메소드를 사용하여 지정한 ID를 갖는 프래그먼트의 핸들을 가져옵니다. 


getMapAsync() 메소드가 메인 쓰레드에서 호출되어야 메인스레드에서 onMapReady 콜백이 실행됩니다.


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }




3. 관련 포스팅

3.1. Android Google Map에 현재 위치 표시하기( FusedLocationProviderClient 사용)


FusedLocationProviderClient를 사용하여 구글맵에 현재 위치를 표시하는 예제입니다.

https://webnautes.tistory.com/1249 


FusedLocationProviderClient는 Deprecated된 FusedLocationApi를 대체하게 되며 Google Play services 11.6.0 이상에서 사용하는 것을 권장하고 있습니다.




3.2. Android Google Map에 현재 위치 표시하기( GoogleApiClient, FusedLocationApi 사용)


GoogleApiClient와 FusedLocationApi를 사용하여 구글맵에 현재 위치를 표시하는 예제입니다.

https://webnautes.tistory.com/1011 




3.3. Places API Web Service를 사용하여 Google Map에 현재 위치 주변의 음식점 표시하기


Places API Web Service를 이용하여 현재 위치 주변의 음식점 정보를 안드로이드의 구글맵에 표시하는 내용을 다룹니다.

https://webnautes.tistory.com/1080 




3.4. GenyMotion 가상머신에 Google Apps설치하여 Google Maps Android API 태스트 하기


Genymotion에서 Google Map API을 가지고 작성한 Android 앱을 테스트하는 방법을 소개합니다.

https://webnautes.tistory.com/1064 



반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 이전 댓글 더보기
  2. erty 2019.12.05 15:31

    안녕하세요 안드로이드 화면을 반으로 갈라서 위에는 지도, 밑에는 추가정보를 입력하고 싶은데 어떻게 해야하나요??? "~~~를 써야된다" 이 정도 조언만 해주시면 제가 나머지는 할수 있을것 같습니다ㅠㅠ 아예 모르니 검색 키워드도 어떻게 해야할지 모르겠네요ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.06 09:28 신고

      가장 사용하기 쉬운 LinearLayout를 공부하면 될듯합니다.

  3. jmh 2019.12.21 17:35

    안녕하세요 덕분에 원하는 앱을 만들 수 있었습니다.
    애뮬레이터에서는 맵이 아주 잘 뜨는데
    apk추출을 해서 실행을 하면 왼쪽밑에 작게 Google만 보이고 맵이 실행되지 않았습니다.
    또한 어느 폰에서는 패키지가 손상되 깔리지 않았고 깔려도 위에 같이 실행이 되지않았습니다ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.21 18:24 신고

      apk 추출하는 과정이 문제가 있는듯합니다. 안드로이드 스튜디오를 사용하여 설치및 실행을 해보세요.

  4. 2020.03.14 15:14

    비밀댓글입니다

  5. Rumino 2020.03.19 11:59

    안녕하세요! 덕분에 Google Maps API 에 대해 성공적으로 이해하였습니다.
    혹시 저 상태에서 지도위에 Shape File(.shp , .shx)을 그릴 수 있는 방법이 있습니까?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.19 12:19 신고

      검색해보니 다음 글이 보이네요

      https://gis.stackexchange.com/questions/68027/how-to-read-coordinates-from-shapefiles-and-overlay-on-google-maps

  6. 몰라몰라 2020.03.27 17:57

    Java에 MainActivity에서 package R does not exist 라고 뜨는데 이게 뭘가요 ???ㅜㅠㅠㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.27 18:59 신고

      여러가지 원인이 있을거라서 어떤 문제라고 얘기하기 힘드네요.

      구글에서 "package R does not exist"로 검색하여 나오는 해결방법을 하나씩 적용해보세요.

  7. Favicon of https://chsg03150.tistory.com BlogIcon SomethingLearner 2020.04.06 14:10 신고

    <Project name> 앱을
    중지했습니다.

    라고 하면서 종료버튼만 뜨고 실행이 안됩니다...

    MainActivity나 다른데서는 오류 하나도 안뜨고 실행버튼도 정상작동되고
    안드로이드 스튜디오에서도 정상실행된다고 뜨는데
    가상 안드로이드에서는 화면이뜨지않고 바로 종료되네요...ㅠㅠ

    해결하는방법좀 알려주세요..ㅠㅠ

    완전 초보자라서 그대로했는데 실행이안되서 당황스러워요..ㅠㅠ
    아래는 로그켓 화면입니다
    2020-04-06 14:27:38.698 26463-26463/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.maptest, PID: 26463
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.maptest/com.example.maptest.MainActivity}: android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class fragment
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
    Caused by: android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class fragment
    Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
    Caused by: java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml
    at com.google.maps.api.android.lib6.drd.p.b(:com.google.android.gms.dynamite_mapsdynamite@200914051@20.09.14 (040408-0):6)
    at com.google.maps.api.android.lib6.auth.f.a(:com.google.android.gms.dynamite_mapsdynamite@200914051@20.09.14 (040408-0):1)
    at com.google.android.gms.maps.internal.CreatorImpl.a(:com.google.android.gms.dynamite_mapsdynamite@200914051@20.09.14 (040408-0):20)
    at com.google.android.gms.maps.internal.CreatorImpl.newMapFragmentDelegate(:com.google.android.gms.dynamite_mapsdynamite@200914051@20.09.14 (040408-0):2)
    at com.google.android.gms.maps.internal.g.a(:com.google.android.gms.dynamite_mapsdynamite@200914051@20.09.14 (040408-0):22)
    at ch.onTransact(:com.google.android.gms.dynamite_mapsdynamite@200914051@20.09.14 (040408-0):4)
    at android.os.Binder.transact(Binder.java:612)
    at com.google.android.gms.internal.maps.zza.zza(Unknown Source:10)
    at com.google.android.gms.maps.internal.zzf.zzc(Unknown Source:5)
    at com.google.android.gms.maps.SupportMapFragment$zzb.zzd(Unknown Source:12)
    at com.google.android.gms.maps.SupportMapFragment$zzb.createDelegate(Unknown Source:6)
    at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaa(Unknown Source:18)
    at com.google.android.gms.dynamic.DeferredLifecycleHelper.onInflate(Unknown Source:20)
    at com.google.android.gms.maps.SupportMapFragment.onInflate(Unknown Source:21)
    at androidx.fragment.app.Fragment.onInflate(Fragment.java:1488)
    at androidx.fragment.app.FragmentManagerImpl.onCreateView(FragmentManagerImpl.java:3204)
    at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:134)
    at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357)
    at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:336)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
    at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
    at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
    at com.example.maptest.MainActivity.onCreate(MainActivity.java:23)
    at android.app.Activity.performCreate(Activity.java:7183)
    2020-04-06 14:27:38.698 26463-26463/? E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.06 21:22 신고

      웹에서 받은 키로 메니페스트의 API key를 대체했나요?

    • eognsdl96 2020.04.28 22:53

      Could not find com.google.android.gms:play-services-map:17.0.0.
      Required by:
      project :app
      Search in build.gradle files
      어떻게 해결하나요..ㅠㅠ

  8. 2020.04.07 10:44

    비밀댓글입니다

  9. gkdud 2020.04.11 23:28

    안녕하세요! 글을 너무 자세하게 써주셔서 덕분에 잘 따라했는데 가상기기가 뜨고서 구글 맵아이콘을 누르면 아무런 반응이 없어요ㅠㅠ 왜그런건지 알 수 있을까요..?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.11 23:32 신고

      구글맵 아이콘을 눌렀다는게 무슨의미인가요? 앱을 실행했는데 지도가 보이지 않는다는 건가요?

    • BlogIcon gkdud 2020.04.12 00:45

      넵ㅠㅠ 근데 알고보니 제가 플레이스토어가 지원되지않는걸로 해서 지원되는걸로 다시 했는데 이번에는 흰 배경에 google 로고만 보여요ㅠㅠ 위에 댓글들 살펴보면서 키문제인가 싶어서 키도 새로 생성해봤는데도 똑같습니다ㅠㅠ 로그캣에는 아무것도 안떠요!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.12 00:49 신고

      로그캣에 3-3에 보이는 메시지가 있나 확인해보세요. 인증 오류가 맞는 듯합니다.

  10. parkwj 2020.04.12 12:39

    혹시 지도 확대하면 세세하게 길까지 보이게 하려고 하는데 확대하면 그 지역까지만 뜨네요 ㅠㅠ 예를들면 딱 서울이라는 글씨 까지만요.. 이부분은 어떻게 해야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.12 12:41 신고

      다음 코드의 10을 조정하여 할 수 있습니다.

      CameraUpdateFactory.zoomTo(10)

    • parkwj 2020.04.12 13:12

      음 그게 아니라 세부적인 위치가 안떠요 ㅠㅠ 딱 서울 위치만 뜨고 그이상 확대하면 세세한 위치가 안뜨더라구요 ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.12 13:51 신고

      구글지도에서 지원하지 않는거면 어쩔수없습니다. 카카오 지도를 사용해보세요. 사용법이 제 블로그에 있습니다.

  11. 감사합니다 2020.04.20 13:06

    많은 도움이 되었어요 ㅎㅎ 좋은글 감사합니다.

  12. 지도가안떠요ㅠ 2020.04.27 16:01

    왼쪽 아래에 google마크가 뜨긴하는데 지도가 뜨질않습니다. 로그캣에 api를 검색해보니
    04-27 15:53:19.920 7698-7733/? E/SQLiteLog: (21) API call with NULL database connection pointer
    04-27 15:53:19.920 7698-7733/? E/SQLiteLog: (21) API call with NULL database connection pointer
    04-27 15:53:19.920 7698-7733/? E/SQLiteLog: (21) API call with NULL database connection pointer
    04-27 15:53:19.920 7698-7733/? E/SQLiteLog: (21) API call with NULL database connection pointer
    04-27 15:53:23.185 3117-4263/? D/PowerManagerService: [api] handleWakeLockDeath : release WakeLock : PARTIAL_WAKE_LOCK 'com.google.android.finsky.instantapps.hint.AppPreloadHygieneService:launch' (uid=10120, pid=4746, ws=null) (elapsedTime=44608)
    04-27 15:53:30.730 8688-8798/? I/PlayCommon: [1034] ampb.c(134): Connecting to server for timestamp: https://play.googleapis.com/play/log/timestamp
    04-27 15:53:30.755 8688-8798/? E/PlayCommon: [1034] ampb.c(135): Failed to connect to server for server timestamp: java.net.UnknownHostException: Unable to resolve host "play.googleapis.com": No address associated with hostname
    04-27 15:53:30.790 8688-8798/? I/PlayCommon: [1034] ampb.c(160): Connecting to server: https://play.googleapis.com/play/log?format=raw&proto_v2=true
    04-27 15:53:31.590 8688-8862/? I/PlayCommon: [1049] ampb.c(134): Connecting to server for timestamp: https://play.googleapis.com/play/log/timestamp
    04-27 15:53:31.595 8688-8862/? E/PlayCommon: [1049] ampb.c(135): Failed to connect to server for server timestamp: java.net.UnknownHostException: Unable to resolve host "play.googleapis.com": No address associated with hostname
    04-27 15:53:31.600 8688-8862/? I/PlayCommon: [1049] ampb.c(160): Connecting to server: https://play.googleapis.com/play/log?format=raw&proto_v2=true
    04-27 15:53:41.570 3117-3242/? W/ActivityManager: Unable to start service Intent { act=com.google.android.gms.drive.ApiService.RESET_AFTER_BOOT flg=0x4 cmp=com.google.android.gms/.drive.api.ApiService (has extras) } U=0: not found
    04-27 15:53:47.230 3117-4264/? D/PowerManagerService: [api] handleWakeLockDeath : release WakeLock : PARTIAL_WAKE_LOCK 'wake:com.skt.skaf.OA00026910/.push.alarm.AlarmIntentService' (uid=10182, pid=8326, ws=null) (elapsedTime=21106)
    04-27 15:54:53.740 3117-3117/? D/RCPManagerService: PackageReceiver onReceive() bundle Bundle[{com.google.android.geo.API_KEY=AIzaSyCInh6BnE8jo0a3zh_eU3n_JyDVmxOfBXk, com.google.android.gms.version=12451000}]
    04-27 15:54:55.700 11365-11365/com.example.realcafemoa I/Google Maps Android API: Google Play services client version: 12451000
    04-27 15:54:55.710 11365-11365/com.example.realcafemoa I/Google Maps Android API: Google Play services package version: 201216009
    04-27 15:54:57.700 3117-3134/? D/PowerManagerService: [api] handleWakeLockDeath : release WakeLock : PARTIAL_WAKE_LOCK 'wake:com.kakao.talk/.fcm.InstanceIdService' (uid=10226, pid=8521, ws=null) (elapsedTime=47314)
    04-27 15:54:59.415 11697-11753/? I/PlayCommon: [1184] ampb.c(134): Connecting to server for timestamp: https://play.googleapis.com/play/log/timestamp
    04-27 15:54:59.420 11697-11753/? E/PlayCommon: [1184] ampb.c(135): Failed to connect to server for server timestamp: java.net.UnknownHostException: Unable to resolve host "play.googleapis.com": No address associated with hostname
    04-27 15:54:59.480 11697-11753/? I/PlayCommon: [1184] ampb.c(160): Connecting to server: https://play.googleapis.com/play/log?format=raw&proto_v2=true
    04-27 15:55:00.215 11697-11815/? I/PlayCommon: [1211] ampb.c(134): Connecting to server for timestamp: https://play.googleapis.com/play/log/timestamp
    04-27 15:55:00.220 11697-11815/? E/PlayCommon: [1211] ampb.c(135): Failed to connect to server for server timestamp: java.net.UnknownHostException: Unable to resolve host "play.googleapis.com": No address associated with hostname
    04-27 15:55:00.220 11697-11815/? I/PlayCommon: [1211] ampb.c(160): Connecting to server: https://play.googleapis.com/play/log?format=raw&proto_v2=true
    04-27 15:59:00.995 3117-3209/? D/PowerManagerService: [api] updateSettingsLocked : mDreamsEnabledSetting: false mDreamsActivateOnSleepSetting: false mDreamsActivateOnDockSetting: true mScreenOffTimeoutSetting: 600000 mStayOnWhilePluggedInSetting: 3 mScreenBrightnessSetting: 211 mScreenAutoBrightnessAdjustmentSetting: 1.0 mScreenBrightnessModeSetting: 0 mSmartStayEnabledSetting: false mTouchKeyOffTimeoutSetting: 1500 mKeyboardOffTimeoutSetting: 2000 mPowerSaveModeSettingBroadcasted true mLimitedPerformanceBroadcasted true useSystemPowerSaveMode false mTouchKeyForceDisableOverrideFromSystemPowerSaveMode: false mATTautoPowerSavingModeSetting: false mATTautoPowerSavingModeSuspend: false mEmergencyMode false
    04-27 15:59:01.900 12047-12171/? W/ResourcesManager: Asset path '/system/framework/org.simalliance.openmobileapi.jar' does not exist or contains no resources.
    04-27 15:59:04.445 12047-12171/? W/ResourcesManager: Asset path '/system/framework/org.simalliance.openmobileapi.jar' does not exist or contains no resources.
    04-27 15:59:59.655 11697-11753/? I/PlayCommon: [1184] ampb.c(134): Connecting to server for timestamp: https://play.googleapis.com/play/log/timestamp
    04-27 15:59:59.675 11697-11753/? E/PlayCommon: [1184] ampb.c(135): Failed to connect to server for server timestamp: java.net.UnknownHostException: Unable to resolve host "play.googleapis.com": No address associated with hostname
    04-27 15:59:59.760 11697-11753/? I/PlayCommon: [1184] ampb.c(160): Connecting to server: https://play.googleapis.com/play/log?format=raw&proto_v2=true
    04-27 16:00:00.385 11697-11815/? I/PlayCommon: [1211] ampb.c(134): Connecting to server for timestamp: https://play.googleapis.com/play/log/timestamp
    04-27 16:00:00.400 11697-11815/? E/PlayCommon: [1211] ampb.c(135): Failed to connect to server for server timestamp: java.net.UnknownHostException: Unable to resolve host "play.googleapis.com": No address associated with hostname
    04-27 16:00:00.400 11697-11815/? I/PlayCommon: [1211] ampb.c(160): Connecting to server: https://play.googleapis.com/play/log?format=raw&proto_v2=true

    라고 뜨는데 뭐가 잘못된건지 봐주실수 있으실까요ㅜ? 부탁드립니다.

    • 지도가안떠요ㅠ 2020.04.27 16:12

      다시 돌려보니 이렇게만 뜹니다ㅠㅠ

      04-27 16:08:39.855 12812-12812/? I/Google Maps Android API: Google Play services client version: 12451000
      04-27 16:08:39.860 12812-12812/? I/Google Maps Android API: Google Play services package version: 201216009

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.27 20:07 신고

      혹시 에뮬레이터에서 돌리는 거라면 구글 플레이에 로그인해야 정상 동작합니다.

  13. 2020.05.11 12:39

    비밀댓글입니다

  14. 0215boc 2020.06.22 22:44

    안녕하세요 코드를 따라 실행시키다가 로그캣에 다음과 같은 에러가 뜨면서 버튼을 눌러도 주변 지역정보가 뜨지 않습니다. 제 핸드폰으로 실행시켜봤습니다.

    2020-06-22 22:42:24.553 13204-13315/com.example.weathermap E/Places: https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=AIzaSyCMze-r5hdRzy-EE15-np6WSk8EaNJMfYQ&location=37.3422294,127.9370463&radius=500&language=ko
    2020-06-22 22:42:24.673 13204-13315/com.example.weathermap E/Places: noman.googleplaces.PlacesException: REQUEST_DENIED
    2020-06-22 22:42:24.673 13204-13204/com.example.weathermap E/Places: noman.googleplaces.PlacesException: REQUEST_DENIED

    혹시 어떤게 문제인걸까요..?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.22 22:57 신고

      올려주신 로그에 있는 주소를 웹브라우저에 붙여넣기하니 다음과 같은 에러가 나네요.

      인증키 생성이 잘못된듯합니다.

      { "error_message" : "This IP, site or mobile application is not authorized to use this API key. Request received from IP address 39.115.83.79, with empty referer", "html_attributions" : [], "results" : [], "status" : "REQUEST_DENIED" }

  15. who 2020.08.06 02:08

    정말 감사합니다 많은 도움이 됐어요!!!!!^^!!

  16. 지나가던예비야간근무자 2020.09.13 21:48

    포스팅 정말 잘 읽었습니다. 쉽게 따라해볼수 있도록 잘 쓰여져 있었고 큰 어려움없이 AVD에서 실행,정상적으로 출력했습니다. 감사합니다ㅎㅎㅎ

  17. 안녕하세요 2020.09.24 19:22

    처음에 CamerUpdateFactory.zoomTo 부분이 왜 오작동이 난것인지 알려주실 수 있으신가요 ? 너무 궁금합니다 ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.24 20:50 신고

      찾아봤는데 관련 글이 보이지 않습니다.

      일시적으로 이번 Google Maps 관련 라이브러리 버전에서 문제 생긴거 일 수 있습니다.

  18. 2020.10.10 03:20

    비밀댓글입니다

  19. 2020.10.10 03:20

    비밀댓글입니다

  20. 2020.10.10 03:27

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.10.10 08:44 신고

      어떤 에러가 나나요?

    • 2020.10.10 12:14

      비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.10.10 12:23 신고

      해본 부분이 아니라서 정확한 답변은 어렵습니다.
      아래 링크를 참고해보세요
      https://kgu0724.tistory.com/40

    • BlogIcon kwon 2020.10.10 12:38

      감사합니다 :)

  21. 2020.10.22 15:05

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.10.22 20:17 신고

      이런쪽으로 개발을 해보지 않아 정확하지 않은 답변일 수 있지만 다른 API를 추가로 사용해야 할 듯합니다.

      예를 들어 아래 링크는 한국관광공사의 TOUR API입니다.
      http://api.visitkorea.or.kr/main.do

+ Recent posts