반응형
|
안드로이드(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) XML 을 이용해 옵션메뉴를 구성하는 방법 (3) | 2014.11.09 |
|---|---|
| 안드로이드(Android) 위치값을 입력하여 구글 지도 이동하기 (5) | 2014.11.08 |
| 안드로이드(Android) 체크옵션을 사용하여 일반맵에서 위성맵으로 변경하기 (0) | 2014.11.08 |
| 안드로이드(Android) Seekbar 를 이용하여 지도 배율조절과 마커이동 (0) | 2014.11.07 |
| 안드로이드(Android) IBitmapDescriptorFactory is not initialized 에러 해결 (0) | 2014.11.06 |
| 안드로이드(Android) Android library projects cannot be launched 에러발생시 처치 (0) | 2014.11.06 |
| 안드로이드(Android) RadioGroup 과 RadioButton 이용한 예제 (0) | 2014.11.05 |
| 안드로이드(Android) SDK 업데이트 후 Please update ADT to the latest version 에러 (0) | 2014.11.05 |

