Итак, продолжаем нашу серию экспериментов над новым 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
}
}
Комментариев нет:
Отправить комментарий