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


LocationManager를 사용하기 위한 퍼미션 ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION 


모바일의 Gps 또는 Network 정보로 위치좌표를 받아오는 방법에 대해 알아보겠다.


LocationManager mLM = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


이렇게 로케이션 매니저를 선언 한 뒤, 위치값 갱신을 호출 해 보자.


위치 제공자는 총 2가지 종류가 있다.


1. GPS_PROVIDER

2. NETWORK_PROVIDER


실내에서는 GPS_PROVIDER를 호출해도 응답이 없다. 응답을 기다리는 형태로 코딩을 했다면


별다른 처리를 하지 않으면 실내에서는 무한정 대기한다.


따라서 타이머를 설정하여 GPS_PROVIDER를 호출 한 뒤 일정 시간이 지나도 응답이 없을 경우


NETWORK_PROVIDER를 호출 하거나,


또는 둘 다 한꺼번에 호출하여 들어오는 값을 사용하는 방식으로 코딩을 하는것이 일반적이겠다.


private void registerLocationUpdates() {

        mLM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,

1000, 1, mLocationListener);

mLM.requestLocationUpdates(LocationManager.GPS_PROVIDER,

1000, 1, mLocationListener);

//1000은 1초마다, 1은 1미터마다 해당 값을 갱신한다는 뜻으로, 딜레이마다 호출하기도 하지만

//위치값을 판별하여 일정 미터단위 움직임이 발생 했을 때에도 리스너를 호출 할 수 있다.

}



private final LocationListener mLocationListener = new LocationListener() {

public void onLocationChanged(Location location) {

//여기서 위치값이 갱신되면 이벤트가 발생한다.

//값은 Location 형태로 리턴되며 좌표 출력 방법은 다음과 같다.


    if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {

//Gps 위치제공자에 의한 위치변화. 오차범위가 좁다.

double longitude = location.getLongitude();    //경도

double latitude = location.getLatitude();         //위도

float accuracy = location.getAccuracy();        //신뢰도

    }

    else {

//Network 위치제공자에 의한 위치변화

//Network 위치는 Gps에 비해 정확도가 많이 떨어진다.

    }

   }

public void onProviderDisabled(String provider) {

}


public void onProviderEnabled(String provider) {

}


public void onStatusChanged(String provider, int status, Bundle extras) {

}

}


위와같이 사용하면 된다. 그리고 더이상 위치값을 호출하지 않아도 되는 경우에는

mLM.removeUpdates(mLocationListener);자원해제를 반드시 해 준다. 누락하면 딜레이마다 계속 호출한다.





댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 학생 2014.12.07 05:02

    굿굿굿굿 베리굿
    깔끔하고 핵심만 딱딱 집어낸 글 굿이에요!

  2.  댓글주소  수정/삭제  댓글쓰기 초보개발자 2017.10.01 20:38

    와 필요한부분만있어서 이해하기 좋네요 ㅎㅎ

  3.  댓글주소  수정/삭제  댓글쓰기 gunnoooow 2019.03.29 14:26 신고

    업무해결에 도움이 되었습니다 형님 ㅋㅋ

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


GoogleMap gmap =  ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();


gmap.setOnCameraChangeListener(new OnCameraChangeListener() {

@Override

public void onCameraChange(CameraPosition arg0) {

LatLng location_center = arg0.target;

}

});



이외에도 

double latitude = arg0.target.latitude;

double longitude = arg0.target.latitude;

또는

double latitude = location.latitude;

double longitude = location.longitude;


등으로 추출


이벤트 발생 시기는 맵이 처음 로딩됬을때와, 지도를 움직이다가 정지상태로 들어가게되면

(손가락으로 드래그하다가 멈췄을 때)


리스터가 동작하여 멈췄을때 맵의 중앙 좌표를 가져온다.

댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 dh 2014.12.01 20:37

    혹시 구글맵을 tab 내부에 구현해 보셨는지요...
    요며칠 고생하는데 잘안되네요 ㅎㅎ..

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


GoogleMap gmap = ((SupportMapFragment) getSupportFragmentManager()

.findFragmentById(R.id.map)).getMap();


gmap.setOnMapLongClickListener(new OnMapLongClickListener() {

@Override

public void onMapLongClick(LatLng latLng) {

MarkerOptions markerOptions = new MarkerOptions();

markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_3g));

markerOptions.position(latLng); //마커위치설정


gmap.animateCamera(CameraUpdateFactory.newLatLng(latLng));   // 마커생성위치로 이동

gmap.addMarker(markerOptions); //마커 생성

}

});



onCreat에 넣어주심됩니다.


요즘한창 v2공부하고있으니 궁금하신점 질문주시면 성심껏 알려드립니다


댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 2014.04.30 05:39

    비밀댓글입니다

  2.  댓글주소  수정/삭제  댓글쓰기 덩치 2014.04.30 09:08 신고

    코드상으로는 문제가 안보이는데요 에러가 어디에서 나는지는 본인이 가장 잘 알 수 있습니다.
    실행을 하면 에러가 발생하는지, 소스코드상에서 에러가 나는지도 본인이 아실테고 증상을 정확하게 알려주셔야 도움드릴수 있을듯하네요

    실행 후 에러가 발생하여 어플이 죽는경우 원인을 알아내는 방법은
    http://biig.tistory.com/37 여기 나와 있습니다.

  3.  댓글주소  수정/삭제  댓글쓰기 알이즈웰 2014.05.03 00:43

    gmap = ((SupportMapFragment) getSupportFragmentManager()

    .findFragmentById(R.id.map)).getMap();

    이 코드에서 계속 null값이 발생하는데 왜 그런것인가요ㅠㅠ?

  4.  댓글주소  수정/삭제  댓글쓰기 으으 2014.06.08 15:04

    marker_3g에서 계속 에러 나네요 ㅠㅠ 어떻게 해야되죠

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

      marker_3g는 이미지파일 이름입니다. value폴더 > 이미지 폴더에 해당 이름을 가진 마커 이미지를 넣어주시면 됩니다. 디폴트이미지(안드로이드 초록색 로보트 이미지)를 사용하셔도 됩니다.
      구글맵 디폴트이미지도 쓸 수 있는데 지금 당장 생각이 안나네요

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

      아마 해당 라인을 적지 않아도 작동은 하리라생각됩니다.

  5.  댓글주소  수정/삭제  댓글쓰기 darkload 2014.06.11 19:34

    마커를 찍는 것 까지 성공 햇는데요 gmap.clear 처럼 지도를 초기화 시키는 거 말고 특정 마커만 지우는 방법 혹시 아세요?

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

      InfoWindowAdapter에 대해 검색해보시면 답을 구하실 수 있을것같습니다.
      getInfoWindow를 오버라이드 하시면 marker.remove() 메소드로 선택된 마커를 삭제 할 수 있습니다.

  6.  댓글주소  수정/삭제  댓글쓰기 sera1548 2014.07.09 12:02

    GoogleMap gmap = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    이부분에서 계속 에러가 있다는데 왜그런건지알수있을까요?

  7.  댓글주소  수정/삭제  댓글쓰기 초보자 2014.07.17 21:55

    마커 생기게까지 했습니다. 좋은정보 감사합니다..
    제가 초보자라서 그러는데..
    터치했을때 마크나오면 그 마크를 찍으면 타이틀이 나오자나요??
    그 타이틀에 위도경도를 찍고싶은데 어떻게 해야될까요?..
    검색 하니까 GeoPoint 에 관한게 나오던데.. 어떤식으로 해야할지도 모르곘습니다...
    도와주세요.

    •  댓글주소  수정/삭제 덩치 2014.07.18 09:29 신고

      마커 옵션을 이용하여 마커를 심을 때 정보 몇가지를 포함할수 있었던걸로 기억합니다. 마커 옵션에 위치를 입력하시고 인포윈도우를 띄울 때 저장한 옵션을 호출하면 되지 않을까 합니다

  8.  댓글주소  수정/삭제  댓글쓰기 초보자 2014.07.20 00:53

    답변 감사합니다.
    답변주신 내용중에 위치를 입력하시라고 했는데
    지도상에 터치했을때 그부분의 위경도는 알아올수는 없을까요??

  9.  댓글주소  수정/삭제  댓글쓰기 2014.09.29 14:29

    마커를 여러개 생성하여서 마커위에 말풍선을 띄우려고 하는데 마커 1,2,3이 있을때 마커 2번만 수정 및 삭제하고 싶을 시에 이 마커가 2번인지 알수 있는 방법이 있나요?

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

      마커를 찍을 때 마커 아이디를설정 해 줄 수 있습니다.
      또는 마커의 위,경도를 이용해 판단하는 방법도 있겠네요

  10.  댓글주소  수정/삭제  댓글쓰기 2014.10.06 18:44

    제가 마커위에 마커 setitle과 setSnippet을 사용하여서 showInfoWindow()로 띄웠는데 마커를 배열로 사용하여서 mk[0], mk[1], mk[2]를 만들었는데 맨 마지막에 생성된 마커위에만 타이틀과 글이 보입니다. 전체 마커의 타이틀과 글을 다 띄울수 있을까요?

    mk[i1].setTitle(times[i1]);
    mk[i1].setSnippet((i1)+"번 : " + memo[i1]);
    for(int k=0;k<=i1;k++)
    mk[k].showInfoWindow();
    i1++;

  11.  댓글주소  수정/삭제  댓글쓰기 2014.10.07 14:08

    그러면 title과 snippet을 여러개 띄울 방법이 있을까요?

    •  댓글주소  수정/삭제 덩치 2014.10.07 16:38 신고

      비트맵 이미지로 띄우는 방식을 이용해야하지 않을까요 ?
      GoogleMap.addCircle 처럼 원을 그려주는것도 있고 이를 응용하여 네모난 이미지를 그려주는 방법도 있지 않을까 생각됩니다.

  12.  댓글주소  수정/삭제  댓글쓰기 2014.10.08 00:06

    비트맵 이미지를 이용하여 마커 대신 텍스트를 띄웠는데 2줄을 적으려고 하는데 어떻게 해야되는지 모르겠네요. 스트링에 \n하면 될줄 알았는데 안되네요

  13.  댓글주소  수정/삭제  댓글쓰기 LCI 2015.01.06 10:46

    저 다른게 아니고 marker 뿐만 아니고 지도상에서 경로를 그리는 소스도 구현해보셨나요 ??? ㅎ

  14.  댓글주소  수정/삭제  댓글쓰기 쎄미 2015.02.11 12:02 신고

    고맙습니다~

  15.  댓글주소  수정/삭제  댓글쓰기 aa 2015.04.22 18:37

    소스 상 오류는 없는데 실행하면 지도만 뜨네요..

  16.  댓글주소  수정/삭제  댓글쓰기 연듀 2015.04.30 08:11

    너무 감사합니다!! 지금 코드짜다가 해결하지 못한 부분을 시원하게 풀어주셨어요 ㅠㅠ 너무 감사해서 댓글남깁니다.

  17.  댓글주소  수정/삭제  댓글쓰기 개초보.. 2015.05.14 21:53

    안녕하세요 완전 개초보 입니다...ㅠㅠ
    지금 구글맵 띄우는것까지 성공했는데요
    mainactivity.java가 아래처럼되어있는데 위의 코드를 어디에 넣어야하나요??
    ㅠㅠㅠㅠㅠㅠ


    package com.example.googlemaptest;

    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.view.Menu;
    import android.view.MenuItem;


    public class MainActivity extends FragmentActivity {

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



    }

    @Override
    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;
    }

    @Override
    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);
    }
    }

  18.  댓글주소  수정/삭제  댓글쓰기 멍멍 2015.05.16 21:37

    마커 생성하고, 그 위치의 마커를 클릭하면 위도, 경도가 뜨게까지 성공했는데요!
    혹시 이 위도, 경도 좌표를 블루투스를 이용해서 아두이노로 전송하는 게 가능할까요??
    아시는 것 있으시면 조언좀 부탁드리겠습니다...!

  19.  댓글주소  수정/삭제  댓글쓰기 hor9 2016.05.26 20:32

    저가 현재위치 뜨게하면서 맵을 클릭하면 마커가 뜨게하고싶은데 어떻게해야하나여? 소스에러는

    public class MainActivity extends Activity {
    private GoogleMap map;
    static final LatLng SEOUL = new LatLng( 37.56, 126.97);

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

    map = ((SupportMapFragment) getSupportFragmentManager()
    .findFragmentById(R.id.map)).getMap();

    map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
    @Override
    public void onMapLongClick(LatLng latLng) {
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));
    markerOptions.position(latLng); //마커위치설정


    map.animateCamera(CameraUpdateFactory.newLatLng(latLng)); // 마커생성위치로 이동
    map.addMarker(markerOptions); //마커 생성
    }
    });
    getSupportFragmentManager() <-이게 빨갛고
    Error:(27, 37) error: cannot find symbol method getSupportFragmentManager()/
    이렇게뜨네요 알트엔터해도 아래
    public FragmentManager getSupportFragmentManager() {
    return supportFragmentManager;
    }
    이렇게뜨고 어떻게 넣어야할지도 ㅠㅠ 모르겟어요 ㅠ

  20.  댓글주소  수정/삭제  댓글쓰기 박경묵 2017.06.11 18:54

    저 혹시 아직도 사이트를 운영하고 계시는지는 모르겠지만,
    뭐하나 궁금해서 질문을 남겨봅니다.
    만약에 3개의 위치를 찍고, 그 3개의 위치의 중심점을 polyline으로 해서 3개의 점 중심거리를 만들고 싶은데 애를 먹어서 그런데 혹시 그쪽에 대해서 잘 알고 계신가요?