안드로이드(Android) 현재 GPS 정보를 알아와 구글맵에 마커 표시하기

 

환경 : Eclipse Mars, Android 4.2.2

 

이번에는 현재 자신의 위치값을 가져와서 구글맵 으로 이동하고, 그 위치에 아이콘을 마크업 합니다. GPS 를 가져오는 클래스는 [안드로이드(Android) GPS 정보 알아오기] 이전 기사를 참조하시기 바랍니다.

 

 

 

GpsInfo 클래스의 전체 내용입니다. GPS 현재 위치를 알아오기 위해 만든 클래스 입니다. 이 클래스를 만드시고 아래에서 참고 하시면 됩니다.

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;

public class GpsInfo extends Service implements LocationListener {

	private final Context mContext;

	// 현재 GPS 사용유무
	boolean isGPSEnabled = false;

	// 네트워크 사용유무
	boolean isNetworkEnabled = false;

	// GPS 상태값
	boolean isGetLocation = false;

	Location location;
	double lat; // 위도
	double lon; // 경도

	// GPS 정보 업데이트 거리 10미터
	private static final long MIN_DISTANCE_UPDATES = 10;

	// GPS 정보 업데이트 시간 1/1000
	private static final long MIN_TIME_UPDATES = 1000 * 60 * 1;

	protected LocationManager locationManager;

	public GpsInfo(Context context) {
		this.mContext = context;
		getLocation();
	}

	public Location getLocation() {
		try {
			locationManager = (LocationManager) mContext
					.getSystemService(LOCATION_SERVICE);

			isGPSEnabled = locationManager
					.isProviderEnabled(LocationManager.GPS_PROVIDER);

			isNetworkEnabled = locationManager
					.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

			if (!isGPSEnabled && !isNetworkEnabled) {
			} else {
				this.isGetLocation = true;
				if (isNetworkEnabled) {
					locationManager.requestLocationUpdates(
							LocationManager.NETWORK_PROVIDER,
							MIN_TIME_UPDATES,
							MIN_DISTANCE_UPDATES, this);

					if (locationManager != null) {
						location = locationManager
								.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
						if (location != null) {
							// 위도 경도 저장
							lat = location.getLatitude();
							lon = location.getLongitude();
						}
					}
				}

				if (isGPSEnabled) {
					if (location == null) {
						locationManager
								.requestLocationUpdates(
										LocationManager.GPS_PROVIDER,
										MIN_TIME_UPDATES,
										MIN_DISTANCE_UPDATES,
										this);
						if (locationManager != null) {
							location = locationManager
									.getLastKnownLocation(LocationManager.GPS_PROVIDER);
							if (location != null) {
								lat = location.getLatitude();
								lon = location.getLongitude();
							}
						}
					}
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return location;
	}

	/**
	 * GPS 종료
	 * */
	public void stopUsingGPS() {
		if (locationManager != null) {
			locationManager.removeUpdates(GpsInfo.this);
		}
	}

	/**
	 * 위도값
	 * */
	public double getLatitude() {
		if (location != null) {
			lat = location.getLatitude();
		}
		return lat;
	}

	/**
	 * 경도값
	 * */
	public double getLongitude() {
		if (location != null) {
			lon = location.getLongitude();
		}
		return lon;
	}

	public boolean isGetLocation() {
		return this.isGetLocation;
	}

	/**
	 * GPS 정보를 가져오지 못했을때 설정값으로 갈지 물어보는 alert 창
	 * */
	public void showSettingsAlert() {
		AlertDialog.Builder alertDialog = new AlertDialog.Builder(
				mContext);

		alertDialog.setTitle("GPS 사용유무셋팅");
		alertDialog
				.setMessage("GPS 셋팅이 되지 않았을수도 있습니다.\n 설정창으로 가시겠습니까?");

		alertDialog.setPositiveButton("Settings",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog,
							int which) {
						Intent intent = new Intent(
								Settings.ACTION_LOCATION_SOURCE_SETTINGS);
						mContext.startActivity(intent);
					}
				});
		alertDialog.setNegativeButton("Cancel",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog,
							int which) {
						dialog.cancel();
					}
				});

		alertDialog.show();
	}

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	public void onLocationChanged(Location location) {
		// TODO Auto-generated method stub

	}

	public void onStatusChanged(String provider, int status,
			Bundle extras) {
		// TODO Auto-generated method stub

	}

	public void onProviderEnabled(String provider) {
		// TODO Auto-generated method stub

	}

	public void onProviderDisabled(String provider) {
		// TODO Auto-generated method stub

	}
}

 

먼저 GpsInfo 클래스를 사용하여 현재 위치 정보를 가져옵니다. 가져와서 isGetLocation() 함수로 제대로 가져왔는지 판단합니다.

 

GpsInfo gps = new GpsInfo(CurrentMapActivity.this);
// GPS 사용유무 가져오기
if (gps.isGetLocation()) {

}

 

GpsInfo 에서 위도 경도를 가져와서 LatLng 객체를 생성합니다. 그리고 moveCamera() 로 현재 위치로 이동합니다. animateCamera() 는 줌값을 줘서 확대합니다.

double latitude = gps.getLatitude();
double longitude = gps.getLongitude();

// Creating a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);

// Showing the current location in Google Map
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

// Map 을 zoom 합니다. 
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(13));

 

마커 생성을 위해 MarkerOptions 객체를 생성합니다. MarkerOptions 속성값에 title 는 마커위에 생성되는 제목이고 간단 내용은 snippet 에 셋팅합니다. 모두 셋팅한후 GoogleMap addMarker 함수로 마커를 표시 합니다.

 

// 마커 설정.
MarkerOptions optFirst = new MarkerOptions();
optFirst.position(latLng);// 위도 • 경도
optFirst.title("Current Position");// 제목 미리보기
optFirst.snippet("Snippet");
optFirst.icon(BitmapDescriptorFactory.fromResource(
                  R.drawable.ic_launcher));
mGoogleMap.addMarker(optFirst).showInfoWindow();

 

아래는 메인화면을 생성한 레이아웃 xml 입니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/map"
        android:name="com.example.GoogleMapVersion2.Fragment"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </fragment>

</RelativeLayout>

 

메인 activity 의 전체 소스입니다.

 

import android.graphics.Point;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class CurrentMapActivity extends FragmentActivity implements
		OnMapClickListener {

	private GoogleMap mGoogleMap;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// BitmapDescriptorFactory 생성하기 위한 소스 
		MapsInitializer.initialize(getApplicationContext());
		
		init();
	}

	/** Map 클릭시 터치 이벤트 */
	public void onMapClick(LatLng point) {

		// 현재 위도와 경도에서 화면 포인트를 알려준다
		Point screenPt = mGoogleMap.getProjection().toScreenLocation(point);

		// 현재 화면에 찍힌 포인트로 부터 위도와 경도를 알려준다.
		LatLng latLng = mGoogleMap.getProjection().fromScreenLocation(screenPt);

		Log.d("맵좌표", "좌표: 위도(" + String.valueOf(point.latitude) + "), 경도("
				+ String.valueOf(point.longitude) + ")");
		Log.d("화면좌표", "화면좌표: X(" + String.valueOf(screenPt.x) + "), Y("
				+ String.valueOf(screenPt.y) + ")");
	}
	
	/**
	 * 초기화
	 * @author 
	 */
	private void init() {
		
		GooglePlayServicesUtil.isGooglePlayServicesAvailable(CurrentMapActivity.this);
		mGoogleMap = ((SupportMapFragment) getSupportFragmentManager()
				.findFragmentById(R.id.map)).getMap();
		
		// 맵의 이동 
		//mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 15));
		
		GpsInfo gps = new GpsInfo(CurrentMapActivity.this);
		// GPS 사용유무 가져오기
		if (gps.isGetLocation()) {
			double latitude = gps.getLatitude();
			double longitude = gps.getLongitude();
			
			// Creating a LatLng object for the current location
	        LatLng latLng = new LatLng(latitude, longitude);

	        // Showing the current location in Google Map
	        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
	        
	        // Map 을 zoom 합니다. 
	        mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(13));
	        
	        // 마커 설정.
			MarkerOptions optFirst = new MarkerOptions();
			optFirst.position(latLng);// 위도 • 경도
			optFirst.title("Current Position");// 제목 미리보기
			optFirst.snippet("Snippet");
			optFirst.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));
			mGoogleMap.addMarker(optFirst).showInfoWindow();
		}
	}
}

 

 

안드로이드(Android) 현재 GPS 정보를 알아와 구글맵에 마커 표시하기

Posted by 녹두장군

댓글을 달아 주세요

  1. 2014.12.22 17:38  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://mainia.tistory.com 녹두장군 2014.12.23 10:04 신고  댓글주소  수정/삭제

      죄송합니다. 제가 그 부분을 깜박했네요. Gpsinfo 클래스는
      제가 만든게 있는데 소스를 넣지 않았군요. 오늘 중으로 내용에
      추가 하도록 하겠습니다. 그리고 아래 주소 아티클 참고 하셔서
      직접 만드셔도 됩니다.

      http://mainia.tistory.com/1153

  2. 2015.01.07 02:01  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. Favicon of https://mainia.tistory.com 녹두장군 2015.01.07 10:17 신고  댓글주소  수정/삭제  댓글쓰기

    전자공학과라면 GPS 모듈 칩셋으로 보드와 펌웨어 개발이 끝난건가요?
    아키텍쳐가 어떻게 구성되어 있는지 알고 싶군요.
    GPS 모듈 에서 웹서버 정보를 보낸후 스마트 폰으로 받을 것인지?
    아니면 장비와 바로 통신을 하실것인지?
    막연한 내용이라 구체적인 답변을 하기가 힘드네요^^
    도움이 될지는 모르겠지만 메일로 정리해서 보내주시면
    감사하겠습니다.

  4. 2015.01.07 15:38  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  5. 2015.01.14 16:40  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  6. 지나가던 학생 2015.05.27 18:45  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 많은 도움이 되었습니다. :)

  7. 참고하는학생 2015.07.22 17:25  댓글주소  수정/삭제  댓글쓰기

    마커는 제대로 나오는데 현재 제위치가있는 지도는 안나오고 파란화면만 뜨는데 이유가 뭐죠 ..? ㅜㅠㅜ

  8. 참고하는학생 2015.07.27 13:14  댓글주소  수정/삭제  댓글쓰기

    실제 제 갤럭시 스마트폰에서 테스트합니다 ㅜ .. 파란화면이 태평양을 찍고있는듯 하군요 ㅜ,,

    • Favicon of https://mainia.tistory.com 녹두장군 2015.07.27 18:39 신고  댓글주소  수정/삭제

      일단 현재 위치 구글에서 따온 좌표값을 변수에 넣고 테스트 해보세요. 제 스마트폰에서 테스트한 것이라 에러 코드도 없고 딱 잘라서 말하기 힘든데 대부분 엉뚱한데 찍히는 것은 좌표값이 제대로 안넘어가서 일수 있으니 디버깅으로 체크 한번 해보세요

  9. 도움감사합니다!! 2015.08.08 22:13  댓글주소  수정/삭제  댓글쓰기

    저도 위에 분 처럼 같은 현상이네요 ㅠㅠㅠ
    따로 테스트 해봤는데 gpsinfo() 클래스는 문제없이 좌표 잘 받아오구요.
    위도 경도의 좌표를 받아서
    지도에 표현해는 과정에서 뭔가가 잘못된거 같은데 잘모르겠네요ㅠㅠㅠ

  10. 이클립스 초보 2015.09.10 15:48  댓글주소  수정/삭제  댓글쓰기

    mContext 에서 the blank final field may not have been initialized 이 오류가 뜨는데 이건 어떻게 해결해야 하나요??

  11. Favicon of https://rinno.tistory.com 리노리 2015.11.02 19:50 신고  댓글주소  수정/삭제  댓글쓰기

    자신의 위치가 아닌 Gps수신기를 이용해 정보를 가져온다면
    GpsInfo가 아닌 Gps수신기를 통한 좌표를 받는값을 넣어주면 그 위치가 나오는거도 가능한가요?

  12. 박지 2016.11.02 15:50  댓글주소  수정/삭제  댓글쓰기

    안드로이드 스튜디오를 사용한건가요?

  13. 해결사세형 2017.07.21 02:05  댓글주소  수정/삭제  댓글쓰기

    혹시라도 지금 구글링해서 검색하고 있는 분들을 위해서 댓글 남겨 봅니다.
    저도 위도경도가 받아지지않아서 고민했고, GpsInfo 클래스에 빨간줄이 떠서 문제가 됬었는데,
    타깃SDK버전 문제였습니다. 25로 높게 되어있어서 위험권한으로 되어있었네요. 23이하로 낮추시면 해결하실수 있으실거에요 !
    Project의 Android - Gradle Script - build.gradle(Module:app)들어가셔서
    targerSDkVersion을 22로 낮추시면 빨간줄 해결됩니다. 그뒤로 실행하 시면 위치정보 받아오실 수 있으실 거에요 ㅎㅎ

  14. 다으니 2017.11.26 16:38  댓글주소  수정/삭제  댓글쓰기

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

    이 부분 에서 getmap가 에러가 뜨네요 ,,,왜 그러는 거죠 ?>