Итак, продолжаем нашу серию экспериментов над новым API Google Maps.
В уроке #1 мы получали Google Api Key, в уроке #2 мы отображали карту. Следующим этапом мы научимся показывать нашу текущую позицию. Сейчас информации крайне мало, возможно в будущем код будет отрефакторен.
Наш главный layout сейчас имеет вид
и нисколько в данном уроке не изменится.
1. Имплементим к нашей Activity интерфейс LocationSource и LocationListener
Первый нужен для отображения текущей позиции, второй для получения этой самой позиции
Объявляем следующие члены класса:
private OnLocationChangedListener mListener;
private LocationManager lManager;
private GoogleMap mMap;
В onCreate добавляем вызов private метода setUpMapIfNeeded(), в котором:
а) получаем mMap с нашего лэйаута
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView)).getMap();
б) Включаем слушатель текущего положения:
mMap.setMyLocationEnabled(true);
Далее инициализируем LocationManager для получения текущего местоположения:
lManager = (LocationManager) getSystemService(LOCATION_SERVICE);
lManager.requestLocationUpdates( lManager.getBestProvider(new Criteria(), true), 1, 1000, this);
Весь код метода onCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lManager = (LocationManager) getSystemService(LOCATION_SERVICE);
lManager.requestLocationUpdates( lManager.getBestProvider(new Criteria(), true), 1, 1000, this);
setUpMapIfNeeded();
}
Т.к. мы имплементили LocationSource, нам будут добавлены два метода, activate() и deactivate(), где следует инициализировать и уничтожать mListener, слушающий текущее местоположение и отображающий его на mMap:
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
}
@Override
public void deactivate() {
mListener = null;
}
Аналогично с LocationListener добавляются несколько методов, нас сейчас будет интересовать только onLocationChanged(), в аргументы которого передается текущее местоположение. Этот параметр нам нужно просто передать mListener, остальное сделает за нас GoogleMap:
}
}
Ну и не забываем убивать и восстанавливать LocationManager в onResume / onPause. Этим мы уберегаем себя от жалоб пользователей на повышенный расход батареи от нашего приложения ;)
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
if( lManager != null ){
lManager.requestLocationUpdates(lManager.getBestProvider(new Criteria(), true), 1, 1000, this);
}
}
@Override
protected void onPause() {
if( lManager != null ){
lManager.removeUpdates(this);
}
super.onPause();
}
Получившийся код нашей Activity:
В уроке #1 мы получали Google Api Key, в уроке #2 мы отображали карту. Следующим этапом мы научимся показывать нашу текущую позицию. Сейчас информации крайне мало, возможно в будущем код будет отрефакторен.
Наш главный layout сейчас имеет вид
и нисколько в данном уроке не изменится.
1. Имплементим к нашей Activity интерфейс LocationSource и LocationListener
Первый нужен для отображения текущей позиции, второй для получения этой самой позиции
Объявляем следующие члены класса:
private OnLocationChangedListener mListener;
private LocationManager lManager;
private GoogleMap mMap;
В onCreate добавляем вызов private метода setUpMapIfNeeded(), в котором:
а) получаем mMap с нашего лэйаута
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView)).getMap();
б) Включаем слушатель текущего положения:
mMap.setMyLocationEnabled(true);
Далее инициализируем LocationManager для получения текущего местоположения:
lManager = (LocationManager) getSystemService(LOCATION_SERVICE);
lManager.requestLocationUpdates( lManager.getBestProvider(new Criteria(), true), 1, 1000, this);
Весь код метода onCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lManager = (LocationManager) getSystemService(LOCATION_SERVICE);
lManager.requestLocationUpdates( lManager.getBestProvider(new Criteria(), true), 1, 1000, this);
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
if (mMap == null) {
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView)).getMap();
if (mMap == null) {
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView)).getMap();
mMap.setMyLocationEnabled(true);
}
}
}
}
Т.к. мы имплементили LocationSource, нам будут добавлены два метода, activate() и deactivate(), где следует инициализировать и уничтожать mListener, слушающий текущее местоположение и отображающий его на mMap:
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
}
@Override
public void deactivate() {
mListener = null;
}
Аналогично с LocationListener добавляются несколько методов, нас сейчас будет интересовать только onLocationChanged(), в аргументы которого передается текущее местоположение. Этот параметр нам нужно просто передать mListener, остальное сделает за нас GoogleMap:
@Override
public void onLocationChanged(Location location) {
if( mListener != null ){
mListener.onLocationChanged( location );public void onLocationChanged(Location location) {
if( mListener != null ){
}
}
Ну и не забываем убивать и восстанавливать LocationManager в onResume / onPause. Этим мы уберегаем себя от жалоб пользователей на повышенный расход батареи от нашего приложения ;)
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
if( lManager != null ){
lManager.requestLocationUpdates(lManager.getBestProvider(new Criteria(), true), 1, 1000, this);
}
}
@Override
protected void onPause() {
if( lManager != null ){
lManager.removeUpdates(this);
}
super.onPause();
}
Получившийся код нашей Activity:
package com.example.mapexample; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; import com.google.android.gms.maps.LocationSource; 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; import com.google.android.gms.maps.model.PolylineOptions; import java.sql.Time; import java.util.ArrayList; import android.graphics.Color; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; public class MainActivity extends FragmentActivity implements LocationSource, LocationListener, OnRouteCalcCompleted, OnMapLongClickListener{ private final static String TAG = "MainActivity"; private OnLocationChangedListener mListener; private LocationManager lManager; private GoogleMap mMap; private static double mLatitude; private static double mLongitude; private RouteHandler routeHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lManager = (LocationManager) getSystemService(LOCATION_SERVICE); lManager.requestLocationUpdates( lManager.getBestProvider(new Criteria(), true), 1, 1000, this); setUpMapIfNeeded(); } @Override protected void onResume() { super.onResume(); setUpMapIfNeeded(); if( lManager != null ){ mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView)).getMap(); mMap.setMyLocationEnabled(true); } } private void setUpMapIfNeeded() { if (mMap == null) { mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView)).getMap(); } } protected void onPause() { if( lManager != null ){ lManager.removeUpdates(this); } super.onPause(); } @Override public void onLocationChanged(Location location) { if( mListener != null ){ mListener.onLocationChanged( location ); } } @Override public void activate(OnLocationChangedListener listener) { mListener = listener; } @Override public void deactivate() { mListener = null; } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }
Комментариев нет:
Отправить комментарий