среда, 5 декабря 2012 г.

Android Google Maps API v2. Урок 3. Получение и отображение текущей позиции

Итак, продолжаем нашу серию экспериментов над новым 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();
    }


    private void setUpMapIfNeeded() {
        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 );
        }
    }

Ну и не забываем убивать и восстанавливать 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
  
 }

}

Комментариев нет: