펌 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);자원해제를 반드시 해 준다. 누락하면 딜레이마다 계속 호출한다.





펌 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;


등으로 추출


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

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


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

펌 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공부하고있으니 궁금하신점 질문주시면 성심껏 알려드립니다