반응형


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



Google Maps Android API를 사용하는 방법과  FusedLocationProviderClient 를 이용하여 현재 위치를 구글맵에 표시하는 내용을 다음 두 포스팅에서 다루었습니다.

중복된 내용은 빠져있기 때문에 본 포스팅에 있는 내용을 진행하기 전에 미리 검토해보세요..

 

Google Maps Android API 사용 방법 및 예제

http://webnautes.tistory.com/647 


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

https://webnautes.tistory.com/1249 




 2016.12. 4

 2017.11.27  주변 장소의 주소가 한글로 나오도록 수정

 2018. 6. 13 

 2019. 7. 19  FusedLocationProviderClient 사용하도록 수정

 2019. 8. 15  androidx,SupportMapFragment 사용하도록 수정

 2020. 6. 21 문제 발생시 추가

 2020. 9. 13 테스트 및 수정 (  Android Studio 4.0.1, Android 10.0+ (R)  API 30 )





1. Places API Web Service 키 얻기


2. Google Map에 현재 위치 주변의 음식점 표시하기


3. 실행 결과


4. 구현시 참고





1. Places API Web Service 키 얻기

현재 위치 주변에 있는 장소를 종류별로 검색하는 기능을 Google Places API for Android에서는 아직 제공하지 않기 때문에 Places API Web Service를 사용합니다.



1. 1. Google Developers Console 사이트 (https://console.developers.google.com/apis/dashboard )에 접속합니다. 




2. API에 마우스 커서를 가져가면 보이는 메뉴에서 라이브러리를 선택합니다. 





3. place api를 검색하여 Places API를 선택합니다.





4. 사용을 클릭합니다.





5. 왼쪽 위 아이콘을 클릭한 후, 메뉴에서 API 및 서비스 > 사용자 인증 정보를 클릭합니다.





6. 사용자 인증 정보 만들기를 클릭하고 메뉴에서 API 키를 선택합니다. 





7. 생성된 API 키를 복사해두고  닫기를 클릭합니다.





2. Google Map에 현재 위치 주변의 음식점 표시하기

Places API Web Service에서 제공하는 REST API를 사용하여 현재 위치 주변의 음식점에 대한 정보를 요청하여 획득된 JSON을 파싱하는 작업을 해주면  되지만 여기에서는 간단하게 구현이 가능한 Android-Google-Places-API 라이브러리(https://github.com/nomanr/Android-Google-Places-API)를 사용했습니다.



다음 포스팅에 있는 코드를 기반으로 수정하는 방법을 설명합니다.


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

https://webnautes.tistory.com/1249 



레이아웃 파일( activity_main.xml )에 버튼을 추가하고 android:layout_weight 속성으로 화면에 보이는 지도와 버튼의 높이를 조정합니다. 


<?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"
    android:id="@+id/layout_main"
    android:orientation="vertical"
   tools:context=".MainActivity" >

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

    <Button
        android:text="장소검색"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.2"
        android:id="@+id/button"/>

</LinearLayout>



app 모듈을 위한 build.gradle 파일에서  minSdkVersion15 이상으로 사용해야 합니다. 


android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.tistory.webnautes.googlemaptest"
        minSdkVersion 21
        targetSdkVersion 29
       versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }



Android-Google-Places-API 라이브러리를 추가해줍니다.  글 작성시점에서  최신 버전은 1.1.3입니다.

변경된 사항을 반영해주기 위해 상단 우측에 보이는  Sync Now를 클릭합니다.


dependencies {

    implementation 'noman.placesapi:placesAPI:1.1.3'

}




메니패스트 파일(AndroidManifest.xml)에서 <application> 태그의 allowBackup 속성을 false로 수정하면 해결됩니다.


    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">





MainActivity에서 PlacesListener 인터페이스를 구현해줘야 합니다.

PlacesListener를 추가해줍니다.


public class MainActivity extends AppCompatActivity
        implements
        OnMapReadyCallback,
        ActivityCompat.OnRequestPermissionsResultCallback,
        PlacesListener{




다음 세 줄을 추가해줍니다.


import noman.googleplaces.Place;
import noman.googleplaces.PlacesException;
import noman.googleplaces.PlacesListener;




추가한 인터페이스에서 요구하는 다음 4개의 메소드를 추가해줍니다.

@Override
public void onPlacesFailure(PlacesException e) {

}

@Override
public void onPlacesStart() {

}

@Override
public void onPlacesSuccess(List<Place> places) {

}

@Override
public void onPlacesFinished() {

}



필요한 변수를 추가해줍니다.


List<Marker> previous_marker = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);





onPlacesSuccess 메소드의 파라미터 타입에 final을 추가해주고 다음 코드를 입력합니다.


@Override
public void onPlacesSuccess(final List<Place> places) {

      runOnUiThread(new Runnable() {
            @Override
            public void run() {
                for (noman.googleplaces.Place place : places) {

                    LatLng latLng
                            = new LatLng(place.getLatitude()
                            , place.getLongitude());

                    String markerSnippet = getCurrentAddress(latLng);

                    MarkerOptions markerOptions = new MarkerOptions();
                    markerOptions.position(latLng);
                    markerOptions.title(place.getName());
                    markerOptions.snippet(markerSnippet);
                    Marker item = mMap.addMarker(markerOptions);
                    previous_marker.add(item);

                }

                //중복 마커 제거
                HashSet<Marker> hashSet = new HashSet<Marker>();
                hashSet.addAll(previous_marker);
                previous_marker.clear();
                previous_marker.addAll(hashSet);

            }
        });

}



showPlaceInformation() 메소드를 추가해줍니다. 

 "Places API Web Service 키" 부분에 따로 복사해둔 키를 입력하셔야 합니다.


public void showPlaceInformation(LatLng location)
{
mMap.clear();//지도 클리어

if (previous_marker != null)
previous_marker.clear();//지역정보 마커 클리어

new NRPlaces.Builder()
.listener(MainActivity.this)
.key("Places API Web Service 키")
.latlng(location.latitude, location.longitude)//현재 위치
.radius(500) //500 미터 내에서 검색
.type(PlaceType.RESTAURANT) //음식점
.build()
.execute();
}





onCreate 메소드에  ArrayList 초기화와 버튼 클릭시 showPlaceInformation() 메소드를 호출하는 코드를 추가합니다.



setContentView(R.layout.activity_main);


previous_marker = new ArrayList<Marker>();

Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPlaceInformation(currentPosition);
}
});



3. 실행 결과

실행하면 현재 위치가 지도에 표시됩니다.


주변 영역이 많이 보이도록 지도의 줌을 적당하게 조정한 후,  장소 검색 버튼을 누르면 현재 위치 주변의 음식점 위치들이 지도에 표시됩니다.


결과를 가져오는데 좀 시간이 걸립니다. 





음식점 위치를 표시하는 마커 하나를 선택하면 음식점 이름과 주소가 나타납니다.

장소 검색버튼을 다시 누르면 기존 마커들을 다지우고 새로 음식점 마커들을 표시합니다.




4. 구현시 참고

https://developers.google.com/places/web-service/supported_types?hl=ko 에 있는 Places API Web Service에서 지원되는 장소 유형을  Android-Google-Places-API 라이브러리에서 다음처럼 정의해놓고 있습니다. 

package noman.googleplaces;

/**
* Created by Noman on 8/25/2016.
* https://developers.google.com/places/supported_types
*/
public interface PlaceType {
    public String ACCOUNTING = "accounting";
    public String AIRPORT = "airport";
    public String AMUSEMENT_PARK = "amusement_park";
    public String AQUARIUM = "aquarium";
    public String ART_GALLERY = "art_gallery";
    public String ATM = "atm";
    public String BAKERY = "bakery";
    public String BANK = "bank";
    public String BAR = "bar";
    public String BEAUTY_SALON = "beauty_salon";
    public String BICYCLE_STORE = "bicycle_store";
    public String BOOK_STORE = "book_store";
    public String BOWLING_ALLEY = "bowling_alley";
    public String BUS_STATION = "bus_station";
    public String CAFE = "cafe";
    public String CAMPGROUND = "campground";
    public String CAR_DEALER = "car_dealer";
    public String CAR_RENTAL = "car_rental";
    public String CAR_REPAIR = "car_repair";
    public String CAR_WASH = "car_wash";
    public String CASINO = "casino";
    public String CEMETERY = "cemetery";
    public String CHURCH = "church";
    public String CITY_HALL = "city_hall";
    public String CLOTHING_STORE = "clothing_store";
    public String CONVENIENCE_STORE = "convenience_store";
    public String COURTHOUSE = "courthouse";
    public String DENTIST = "dentist";
    public String DEPARTMENT_STORE = "department_store";
    public String DOCTOR = "doctor";
    public String ELECTRICIAN = "electrician";
    public String ELECTRONICS_STORE = "electronics_store";
    public String EMBASSY = "embassy";
    public String FINANCE = "finance";
    public String FIRE_STATION = "fire_station";
    public String FLORIST = "florist";
    public String FUNERAL_HOME = "funeral_home";
    public String FURNITURE_STORE = "furniture_store";
    public String GAS_STATION = "gas_station";
    public String GYM = "gym";
    public String HAIR_CARE = "hair_care";
    public String HARDWARE_STORE = "hardware_store";
    public String HINDU_TEMPLE = "hindu_temple";
    public String HOME_GOODS_STORE = "home_goods_store";
    public String HOSPITAL = "hospital";
    public String INSURANCE_AGENCY = "insurance_agency";
    public String JEWELRY_STORE = "jewelry_store";
    public String LAUNDRY = "laundry";
    public String LAWYER = "lawyer";
    public String LIBRARY = "library";
    public String LIQUOR_STORE = "liquor_store";
    public String LOCAL_GOVERNMENT_OFFICE = "local_government_office";
    public String LOCKSMITH = "locksmith";
    public String LODGING = "lodging";
    public String MEAL_DELIVERY = "meal_delivery";
    public String MEAL_TAKEAWAY = "meal_takeaway";
    public String MOSQUE = "mosque";
    public String MOVIE_RENTAL = "movie_rental";
    public String MOVIE_THEATER = "movie_theater";
    public String MOVING_COMPANY = "moving_company";
    public String MUSEUM = "museum";
    public String NIGHT_CLUB = "night_club";
    public String PAINTER = "painter";
    public String PARK = "park";
    public String PARKING = "parking";
    public String PET_STORE = "pet_store";
    public String PHARMACY = "pharmacy";
    public String PHYSIOTHERAPIST = "physiotherapist";
    public String PLUMBER = "plumber";
    public String POLICE = "police";
    public String POST_OFFICE = "post_office";
    public String REAL_ESTATE_AGENCY = "real_estate_agency";
    public String RESTAURANT = "restaurant";
    public String ROOFING_CONTRACTOR = "roofing_contractor";
    public String RV_PARK = "rv_park";
    public String SCHOOL = "school";
    public String SHOE_STORE = "shoe_store";
    public String SHOPPING_MALL = "shopping_mall";
    public String SPA = "spa";
    public String STADIUM = "stadium";
    public String STORAGE = "storage";
    public String STORE = "store";
    public String SUBWAY_STATION = "subway_station";
    public String SYNAGOGUE = "synagogue";
    public String TAXI_STAND = "taxi_stand";
    public String TRAIN_STATION = "train_station";
    public String TRANSIT_STATION = "transit_station";
    public String TRAVEL_AGENCY = "travel_agency";
    public String UNIVERSITY = "university";
    public String VETERINARY_CARE = "veterinary_care";
    public String ZOO = "zoo";

}



showPlaceInformation() 메소드에서 PlaceType.RESTAURANT를 필요시 위에 나온 원하는 타입으로 바꾸시면 됩니다. 

public void showPlaceInformation(LatLng location)
{
mGoogleMap.clear();//지도 클리어

if (previous_marker != null)
previous_marker.clear();//지역정보 마커 클리어

new NRPlaces.Builder()
.listener(MainActivity.this)
.key("Places API Web Service 키")
.latlng(location.latitude, location.longitude)//현재 위치
.radius(500) //500 미터 내에서 검색
.type(PlaceType.RESTAURANT) //음식점

                  .language("ko", "KR")
.build()
.execute();
}



.type(PlaceType.RESTAURANT)를 지우면 주변에 있는 모든 타입의 장소가 검색됩니다.



5. 문제 발생시

로그캣에서 Place API 관련 주소를 찾을 수 있습니다. 

해당 주소를 복사하여  웹브라우저에 붙여넣기 해보세요.



다음과 같은 에러가 발생한다면..

{

   "error_message" : "You must enable Billing on the Google Cloud Project at https://console.cloud.google.com/project/_/billing/enable Learn more at https://developers.google.com/maps/gmp-get-started",

   "html_attributions" : [],

   "results" : [],

   "status" : "REQUEST_DENIED"

}



구글 클라우드 플랫폼에서 다음처럼 결재 수단을 선택하여 

신용 카드 또는 체크 카드를 등록해야 정상적으로 주변 장소 정보를 받을 수 있습니다. 


반응형

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

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

유튜브 구독하기


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

  1. 이전 댓글 더보기
  2. hackvv 2020.07.29 15:44

    안녕하세요 개발자님
    여기서 여쭤봐도 될련지는 모르겠지만.... REQUEST_DENIED 오류로 인해서
    결제수단이 등록되어있지 않은것을 확인 후에, 절차대로 결제수단을 등록했는데요
    막 생성한 결제 계정 상태는 아직도 Closed 이구요
    <결제 계정이 정지되었으며 계정 확인 대기 중입니다.> 는 경고문구를 띄우네요.
    Summit 을 하고나면 좀 시간이 걸리고 나서 계정이 열리는 것인지... 아님 제가 다른 액션을 해야하는건지요.. ㅠ
    너무 복잡하네요...... 혹시 도움이 될만한 참고 자료같은게 있는지 여쭤봅니다... 감사합니다

  3. heroplll 2020.08.05 18:32

    개발자님! 자료 보고 열심히 따라하고있는데요, 혹시 마커가 표시되면서 현재위치와 가장 가까운 거리에 있는 마커에 대한 정보를 앱내로 받아오고 싶은데요
    참고할만한 자료가 있을까요? 여기저기 찾아보다가 nearby place api? 라는게 있다고 해서 찾아보니 있지도 않더라규요...
    답글 해주시면 정말 고맙겠습니다 !! 항상 감사해요우

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.05 18:37 신고

      추가해놓은 마커랑 현재 위치를 비교하는 거라면 마커 좌표와 현재 위치 좌표를 계산해서 짧은걸 찾으면 될듯합니다

    • BlogIcon heroplll 2020.08.05 21:53

      네 방향성은 대충 알겠는데요, 그 place api 를 통해서 카페위치를 나타내는 마커가 먼저 뜨잖아요?? 근데 그 마커들의 좌표는 어떻게 받아와야 하는건지를 모르겠습니다. 로그랑 여기저기 뒤져봐도 안보여서요 ㅠㅠ 어떤 식으로 마커정보를 얻는지요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.05 22:35 신고

      onPlacesSuccess에서 맵에 마커를 추가합니다

  4. ehdwnstls12 2020.08.24 17:45

    이번 예제를 다 따라하였습니다. 그리고 저는 저의 현재위치에서 이동을하게되면 이동경로를 그려주고 싶습니다.
    참고할만한 좋은 자료가 있을까요?

    • BlogIcon ehdwnstls12 2020.08.24 18:15

      저는 이 예제를 마지막 까지 따라하였고 결제 주변 장소 표시를 눌렀을때 결제관련 에러가떠서 솔루션대로 카드를 등록하고 프로젝트 제꺼가 결제등록된 프로젝트인거 까지 확인 하였는데 '지오코더 서비스 사용불가' 예외처리 토스트 메세지가 뜹니다. 뭐가 문제일까요 또한 기기에따라 런할때 비트맵 오류가 있습니다.
      마지막으로 저는 저의 현재위치에서 이동을하게되면 이동경로를 그려주고 싶습니다.
      참고할만한 좋은 자료가 있을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.24 21:15 신고

      현재 위치에 대한 정보를 가져올 수 없어 지오코더 서비스 사용불가라고 뜨는 것입니다. 메시지 출력해주는 위치를 찾아 주석처리해주세요.

      비트맵 오류는 어떤건지 모르겠네요..

      경로는 링크를 참고하여 구현하면 될듯합니다.
      https://developers.google.com/maps/documentation/android-sdk/polygon-tutorial?hl=ko

  5. ehdwnstls12 2020.08.24 23:58

    개발자님 저의 앞전에 현재위치는 되는데 주변위치 버튼누르면 안된다던 질문 한 사람 입니다. 저와비슷한 오류를 겪은 사람의 댓글을보고 다시 처음부터 블로그글을보면 천천히 보다보니 저의 실수 가 있었습니다. Place API 키를 따로 받아서 적용시켜야 하는데 제가 앞전과 같은 키받는 방식 을 설명하는줄 알고 이부분을 하지않고 같은 키값을 두번 적용 하였습니다. 따라서 다시 프로젝트를 만들고 결제가 등록된 프로젝트인걸 확인하였고 Place API 용으로 애플리케이션 등록 이부분에서 프로젝트 선택한후 다음 필요한 사용자 인증정보 항목에 map SDK API 밖에 뜨지않습니다. 어떻게 해야할까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.25 20:41 신고

      프로젝트를 새로 생성한 후. 포스트 1-1에 있는 링크를 클릭해야 Place API를 추가할 수 있습니다.

  6. qza 2020.09.12 18:47

    안녕하세요.
    블로그 보고 따라하다가 안되는게 있어 댓글 남깁니다.
    위에 나온대로,
    places api를 사용하고,
    사용자인증정보를 가면 maps sdk for android밖에 안나오는데
    혹시 무슨 문제가 있는것일까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.12 18:57 신고

      프로젝트를 새로 생상한 후.. 포스트 1-1에 있는 링크를 클릭해야 Place API를 추가할 수 있습니다.

  7. .. 2020.09.12 19:36

    위에 질문 올린사람입니다.

    프로젝트 생성을 하라는 소리가
    구글 api쪽에서 기존에 sdk 사용하던파일말고
    새로만들어야하나요?
    포스트1-1링크는 혹시 제가보고있는게맞는지 헷갈려서그러는데, 사이트좀 주실수있을까요?
    번거롭게해드려서 죄송합니다

  8. .. 2020.09.12 19:38

    현재 이 포스트에 1-1의 링크를 말하는건가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.12 19:51 신고

      네.. 프로젝트 생성해 둔 후.
      1-1에 있는 링크를 클릭하면 Place API가 보입니다.

  9. .. 2020.09.12 20:07

    구글 api에서 새로운 프로젝트 만든후,
    바로 링크 접속을 하였더니 기타 api밖에 뜨지 않습니다 ㅠㅠ
    이미 places api는 사용을 하여 누르면 관리밖에 뜨지 않습니다..

    결제 수단도 카드 등록이 되어있습니다.
    혹시 무슨 문제가 있는 것 일까요 ?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.12 20:29 신고

      사용 방법이 변경된듯합니다.
      다시 확인을 해서 업데이트하겠습니다.

  10. .. 2020.09.12 21:09

    네 정말 감사합니다.
    다시 프로젝트 생성 후 해보았는데도 안되고 있습니다.
    자세하게 표시해주면 정말 감사하겠습니다.

  11. .. 2020.09.13 14:06

    네 수정 감사합니다.
    같은 프로젝트에서 API키만 새로 생성하는건가요?
    키제한 따로 안걸어도 되나요 ?

  12. qrwertr 2020.09.13 14:52

    안녕하세요 좋은 정보 정말 감사드립니다. 다름이 아니라 전부다 따라해서 실행까지는 되는데 그 이후에 현재위치만 마커로 표시되고 장소검색을 눌러도 음식점들이 마커로 전혀 뜨질 않습니다. 또한 현재위치에 있던 마커가 없어집니다. 어떻게 해결해야 할까요??

  13. oquwornn 2020.09.14 21:08

    안녕하세요 질문이 있어서 글 올립니다. 실행하고 검색해보면 자꾸 현재위치로 올려고 하는데 위에서 글을 찾아보니 setCurrentLocation(location, markerTitle, markerSnippet); << 이부분을 원할 때만 하게 만들라고 하셨는데 어떻게 해야할지 잘 모르겠어서 질문 드립니다. 감사합니다 .

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.09.14 22:46 신고

      지도를 터치시 setCurrentLocation 호출을 막고.. 현재 위치 버튼을 누르면 다시 호출하도록 하면 될듯합니다.
      setCurrentLocation 호출하는 부분에 플래그 변수를 두어 처음에는 true라서 호출되고. 지도 터치시에는 플래그 변수가 false가 되어 실행안되고.. 내위치 버튼 누르면 true가 되어 호출되게 하면됩니다.

  14. qpwpdpwpd 2020.09.21 20:37

    잘 보고갑니다.
    빨간 마커 색상 대신 다른 색상으로 변경은 불가한가요?

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

      아래처럼 바꾼다고 하네요

      static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
      Marker melbourne = mMap.addMarker(new MarkerOptions()
                                .position(MELBOURNE)
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));


      HUE_AZURE 정의를 가보면 다른색도 있을겁니다.

  15. qpwpdpwpd 2020.09.22 11:28

    덕분에 수정했습니다.
    감사합니다.

  16. 개바르자가될테다 2020.10.06 01:58

    안녕하세요 개발자님!! 제가지금
    .type(PlaceType.RESTAURANT) 타입 설정하는데 애먹고있는데요
    타입을 여러개 설정할 수 있는 방법은 없는걸까요??

    new NRPlaces.Builder() 하나의 빌더에 하나의 타입만 설정 가능한건지 여쭙습니다!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.10.06 07:05 신고

      하나만 가능할듯 합니다.

    • BlogIcon 개바르자가될테다 2020.10.08 18:43

      new NRPlaces.Builder() 로 빌더를 여러개 생성 해주는 방식으로 해결했습니다. 하나의 빌더를 생성하면서 검색, 마커설정이 되는데 여러개의 빌더를 생성하면서 검색을 반복하는 형태로 문제를 해결했네요.. 최적의 해결법인지는 모르겠지만.. 여튼 감사합니다 !

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.10.08 19:06 신고

      아 그런방법이 있었네요. 잘하셨네요

  17. 2020.10.11 12:56

    비밀댓글입니다

  18. Favicon of https://as1212.tistory.com BlogIcon sangjaemm 2020.11.15 22:39 신고

    Android Google Map에 현재 위치 표시하기( FusedLocationProviderClient 사용) 에서 만든 프로젝트 그러니까 google maps android api test프로젝트에 places api추가하는게 맞나요? 추가했는데 현재위치만 빨간마크로 표시되네요 ..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.15 22:48 신고

      네 맞습니다. 혹시 로그캣에 인증 오류가 난건 아닌지 확인해보세요. URL이 보일텐데 웹브라우저에서 접속시 에러없이 장소목록이 보여야합니다.

    • Favicon of https://as1212.tistory.com BlogIcon sangjaemm 2020.11.18 19:44 신고

      https://console.developers.google.com 에 해당 프로젝트에 들어가보니까 places api 오류율이 100%라고 되어있는데 인증에 문제가 있는건가요? 참고로 에뮬레이터입니다

    • Favicon of https://as1212.tistory.com BlogIcon sangjaemm 2020.11.18 20:00 신고

      글고 URL은 어디있나요..

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

      안드로이드 스튜다오의 logcat에서 찾을수 있습니다. 에뮬레이터에는 gps가 없어서 동작하지 않을듯합니다

  19. Favicon of https://jcw3898.tistory.com BlogIcon 코딩좀잘해보자 2020.11.20 00:49 신고

    String markerSnippet = getCurrentAddress(latLng); 에서
    getCurrentAddress 부분만 빨간표시로 뜨고 다른 곳은 에러가 없는데
    함수를 따로 만들어야하나요? 작성하신 그대로 따라했는데.. 알려주시면 정말 감사하겠습니다!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.20 23:15 신고

      본 포스트의 코드는 다음 포스트에 이어서 작성해야 하는 코드입니다.

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

      https://webnautes.tistory.com/1249

  20. Favicon of https://eager031.tistory.com BlogIcon Eckert 2020.11.24 19:44 신고

    안녕하세요 블로그글보며 열심히 공부중인 학생입니다.

    현재 마커를 클릭하거나 화면을 움직이면 움직인 화면이 고정되지 않고 내 중심 화면으로 다시 되돌아오는데 어떤 부분이 문제인가요?

    댓글 중간에 있는 것을 참조하며 바꾸었는데.. 에러가 뜹니다.

    public void setCurrentLocation(Location location, String markerTitle, String markerSnippet) {


    boolean user = false;


    if (currentMarker != null) currentMarker.remove();


    LatLng currentLatLng = new LatLng(location.getLatitude(), location.getLongitude());

    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(currentLatLng);
    markerOptions.title(markerTitle);
    markerOptions.snippet(markerSnippet);
    markerOptions.draggable(true);

    mMap.setOnMyLocationButtonClickListener(new GoogleMap.OnMyLocationButtonClickListener(){
    @Override
    public boolean onMyLocationButtonClick()
    {
    user = false;

    return false;
    }
    });


    currentMarker = mMap.addMarker(markerOptions);
    if( user == false ){
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(currentLatLng);
    mMap.moveCamera(cameraUpdate);
    }


    }
    댓글 참조하여 변경한 코드입니다. 중간 user = false; 부분 중 user 부분이 계속 에러가 뜨는데 방향을 어찌 잡아야 할까요?

    • Favicon of https://eager031.tistory.com BlogIcon Eckert 2020.11.24 19:59 신고

      전 글에 setCurrentLocation 부분을 주석처리하면 된다고 하셨는데, 혹시 어떤 부분인지 알 수 있을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.24 20:00 신고

      다음 코드를 동작 못하게 막으면 이동하지 않습니다. 사용자가 지도 터치하면 동작못하게 막았다가 현재 위치 버튼을 누르면 다시 동작하도록 하면됩니다.

      방법은 하신대로 불린 변수를 하나 선언하면 될듯합니다.

      //현재 위치에 마커 생성하고 이동
      setCurrentLocation(location, markerTitle, markerSnippet);

    • Favicon of https://eager031.tistory.com BlogIcon Eckert 2020.11.24 20:07 신고

      불린 변수를 하나 선언하신다는 말씀이 이해가 되지 않습니다.. 혹시 어떤걸 어느 부분에 추가하면 될까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.24 20:18 신고

      작성하신 다음 코드를 사용하면 됩니다.
      전역변수로 선언하세요.

      boolean user = false;

  21. Favicon of https://eager031.tistory.com BlogIcon Eckert 2020.11.25 16:57 신고

    감사합니다,,다른 방법인 mMap.moveCamera(cameraUpdate) 요쪽을 주석처리해보니 마커 클릭시에도 카메라 내위치 고정은 안되더군요.

    다만 어플 초기 실행시 현재 내 GPS 위치가 아닌 초기설정 위치로 실행이 되는데, 이는 위 구문을 주석처리해서 발생하는 현상인가요?

    또한 화면 을 터치로 이동후에 해당 화면 기준에서 장소검색을 다시 실행하고 싶은데, 참고할만한 글이나 코드가 있을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.25 17:04 신고

      setCurrentLocation을 주석처리하면 위치 이동시 화면이 따라 움직이지 않지 않나요?
      이 함수를 이용해 현재 위치와 카메라를 조정합니다. 언급하신 함수도 이 내부에 있지않나요?

      초기 위치로 서울을 보여주도록 하고 있습니다. 그러지 않으면 미국이나 바다 한가운데가 잠시 보이기 때문입니다.

    • Favicon of https://eager031.tistory.com BlogIcon Eckert 2020.11.25 17:33 신고

      말씀하신 주석처리 부분이
      //현재 위치에 마커 생성하고 이동
      setCurrentLocation (location, markerTitle, markerSnippet); 이 부분인가요? 주석처리하게되면 화면이 마커를 중심으로 따라 움직이긴 하는데 어플 초기 실행시 초기 위치로 화면이 잡혀서 고민중입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.11.25 17:49 신고

      화면 터치시 이 함수를 작동안하게 해보면 현재위치따라 화면이 이동하지 않게됩니다

    • Favicon of https://eager031.tistory.com BlogIcon Eckert 2020.11.25 20:34 신고

      감사합니다!!

+ Recent posts