wiki:GoogleMapsActivity
Last modified 8 years ago Last modified on 2010-04-19 13:37:52

GoogleMapsActivity käytettäväksi komponenttimuodon kanssa

package fi.jyu.mit.android.gps.oletTassa;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import java.util.Iterator;
import java.util.List;

import android.content.Context;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;

/**
 * Olet Tässä! (komponenttiversio) 
 * 
 * Paikannusohjelma, jolla näet hetkellisen sijaintisi Googlekartalla.
 * Paikannu suoritetaan GPS:n ja tukiasemien avulla.
 * 
 * 
 * @author Jussi Perttola, Matti Välimäki
 * @version 1.12
 */
//public class GoogleMapsActivity extends MapActivity implements OnCheckedChangeListener {
public class GoogleMapsActivity extends MapActivity implements OnCheckedChangeListener {
    
    interface GoogleMapsLocationListener {
        void onLocationChanged(Location loc);
    }
    
	GeneralLocationListener gpsLocationListener;
	GeneralLocationListener towerLocationListener;
	LocationManager gpsLocationManager;
	LocationManager towerLocationManager;
	MapView mapView;
	TextView tvCoord;
	MapController mapControl;
	GeoPoint point;
	Context context;
	Toast toast;
	boolean towerEnabled;
	boolean gpsEnabled;
	boolean isStarted;
	boolean isUsingGps;
	boolean showInNotificationBar;
	boolean notificationVisible;
	double currentLatitude;
	double currentLongitude;
	long latestTimeStamp;
	
	private GoogleMapsLocationListener locationListener = null; 
	
	/**
	 * Päivitystiheys minimiaikana (sekunnit) ja -matkana (metrit) 
	 */
	final int minimumSeconds = 1;
	final int minimumDistance = 0; 
	
	/** 
	 * Syntymävaiheen hommat
	 * Alustetaan arvoja ja pannaan homma käyntiin.
	 * @param savedInstanceState oletustila
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		context = getApplicationContext();


		mapView = (MapView) findViewById(R.id.mapView);
		mapView.setBuiltInZoomControls(true);
		
		mapControl = mapView.getController();
	    mapControl.setZoom(15); 
		
		StartGpsManager();
	}
	/**
	 * Luodaan valikko
	 * @param menu valikko
	 * @return aina true
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.optionsmenu, menu);
		return true;
	}
	
	
	public void setLocationListener(GoogleMapsLocationListener listener) {
	    locationListener = listener;
	}
	
	/**
	 * Reagoi valikon nappien paineluun
	 * @param item painettu nappi
	 * @returns false
	 */
	public boolean onOptionsItemSelected(MenuItem item) {

		if (item.getTitle().equals("Start/Stop")) {
			if (isStarted){
				StopGpsManager();
				toast = Toast.makeText(context, "GPS-paikannus pois päältä", Toast.LENGTH_LONG);
				toast.show();				
			}
			else{
				StartGpsManager();
				toast = Toast.makeText(context, "GPS-paikannus päällä", Toast.LENGTH_LONG);
				toast.show();
			}
			return false;

		} 
		if(item.getTitle().equals("Exit")){
			StopGpsManager();			
			System.exit(0);			
			return false;
		}
		return false;
	}

	/**
	 * Käynnistää varsinaisen paikannuksen
	 * Sijaintitieto haetaan GPS:n ja tukiasemien avulla.
	 */
	public void StartGpsManager() {
		isStarted = true;
		gpsLocationListener = new GeneralLocationListener();
		towerLocationListener = new GeneralLocationListener();
		gpsLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		towerLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

		CheckTowerAndGpsStatus();

		if (gpsEnabled) {
			// gps-satelliittipaikannus
			gpsLocationManager.requestLocationUpdates(
					LocationManager.GPS_PROVIDER, minimumSeconds * 1000,
					minimumDistance, gpsLocationListener);
			gpsLocationManager.addGpsStatusListener(gpsLocationListener);
			isUsingGps = true;
			
		} else if (towerEnabled) {
			isUsingGps = false;
			// tukiasemapaikannus
			towerLocationManager.requestLocationUpdates(
					LocationManager.NETWORK_PROVIDER, minimumSeconds * 1000,
					minimumDistance, towerLocationListener);

		} else {
			isUsingGps = false;
			toast = Toast.makeText(context, "Ei GPS-signaalia", Toast.LENGTH_LONG);
			toast.show();
			return;
		}
	}
	
	/**
	 * Tarkistaa, onko tukiasemat ja GPS saatavilla.
	 */
	private void CheckTowerAndGpsStatus() {
		towerEnabled = towerLocationManager
				.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
		gpsEnabled = gpsLocationManager
				.isProviderEnabled(LocationManager.GPS_PROVIDER);
	}
	
	/**
	 * Lopettaa paikantamisen
	 */
	public void StopGpsManager() {
		isStarted = false; 
		if (towerLocationListener != null) {
			towerLocationManager.removeUpdates(towerLocationListener);
		}

		if (gpsLocationListener != null) {
			gpsLocationManager.removeUpdates(gpsLocationListener);
			gpsLocationManager.removeGpsStatusListener(gpsLocationListener);
		}
	}

	/**
	 * Aloittaa paikantamisen uudelleen
	 */
	public void RestartGpsManagers() {
		StopGpsManager();
		StartGpsManager();
	}

	/**
	 * Yritetään aloittaa paikantaminen uudelleen, jos GPS ei vastaa
	 */
	public void ResetManagersIfRequired() {
		CheckTowerAndGpsStatus();

		if (gpsEnabled) {
			if (!isUsingGps) {
				RestartGpsManagers();
			}
		}
	}

	/**
	 * Vastaanottaa sijaintitietoja aktiivisesti ja lähettää ne eteenpäin
	 * kartalle ja tulostettavaksi.
	 * 
	 * @author Jussi Perttola, Matti Välimäki
	 * @version 1.1
	 */
	public class GeneralLocationListener implements LocationListener,
			GpsStatus.Listener {

		
		
		/**
		 * GPS-sijaintitiedon muutoshallinta
		 * @param loc sijainti
		 */
		public void onLocationChanged(Location loc) {
			try {
				if (loc != null) {
				//    if ( locationListener != null ) locationListener.onLocationChanged(loc);
				   
					currentLatitude  =  loc.getLatitude();
					currentLongitude =  loc.getLongitude();		
					
					TextView locationText = (TextView) findViewById(R.id.location);
					locationText.setText(Location.convert(currentLatitude, Location.FORMAT_SECONDS) 
							+ ", " + Location.convert(currentLongitude, Location.FORMAT_SECONDS));
					
					point = new GeoPoint(
				            (int) (currentLatitude * 1E6), 
				            (int) (currentLongitude * 1E6));
				 
				    mapControl.animateTo(point);
				    // lisätään merkki kartalle
			        MapOverlay mapOverlay = new MapOverlay();
			        List<Overlay> listOfOverlays = mapView.getOverlays();
			        listOfOverlays.clear();
			        listOfOverlays.add(mapOverlay);        
			        mapView.invalidate();
			        
				}

			} catch (Exception ex) {
				toast = Toast.makeText(context, ex.getMessage(), Toast.LENGTH_LONG);
				toast.show();
			}
		}
		
		/**
		 * Jos yhteys palveluntarjoajaan katkaistaan, käynnistetään uudelleen.
		 */
		public void onProviderDisabled(String provider) {
			RestartGpsManagers();
		}

		/**
		 * Jos yhteys palveluntarjoajaan muodostetaan, käynnistetään uudelleen.
		 */
		public void onProviderEnabled(String provider) {
			RestartGpsManagers();
		}

		/**
		 * Pakollinen täyteluokka.
		 */
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
		}

		/**
		 * GPS:n tilamuutoksen tapahtumakäsittelijä.
		 */
		public void onGpsStatusChanged(int event) {

			switch (event) {
			case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
				GpsStatus status = gpsLocationManager.getGpsStatus(null);
				Iterator<GpsSatellite> it = status.getSatellites().iterator();
				int count = 0;
				while (it.hasNext()) {
					count++;
					GpsSatellite oSat = (GpsSatellite) it.next();
					Log.i("Main",
							"LocationActivity - onGpsStatusChange: Satellites:"
									+ oSat.getSnr());
				} break;

			case GpsStatus.GPS_EVENT_STARTED:
				toast = Toast.makeText(context, "GPS käynnissä, yritetään paikantaa",
						Toast.LENGTH_LONG);
				toast.show();
				break;
			}
		}
	}
	/**
	 * Piirtää kuvan kartan päälle
	 * 
	 * @author Jussi Perttola, Matti Välimäki
	 * @version 1.1
	 */
    class MapOverlay extends com.google.android.maps.Overlay
    {
        @Override
        public boolean draw(Canvas canvas, MapView mapView, 
        boolean shadow, long when) 
        {
            super.draw(canvas, mapView, shadow);                   
 
            /**
             * Muuttaa sijainnin pikseleiksi näytöllä
             */
            Point screenPts = new Point();
            mapView.getProjection().toPixels(point, screenPts);
 
            /**
             * Piirtää varsinaisen kuvan ruudulle
             * Kuvaa siirretään sen korkeuden verran  ylöspäin, että kuvan vasen alanurkka on osoitettavan
             * pisteen kohdalla. 
             * 
             * Koodissa käytetään itsetehtyä kuvaa molli.png
             * Kuva pitää sijoittaa kansioon OletTassa -> res -> drawable
             * josta sitä voi koodissa kutsua nimellä ilman tiedostopäätettä
             * 
             */
            Bitmap bmp = BitmapFactory.decodeResource(
                getResources(), R.drawable.molli); 
            canvas.drawBitmap(bmp, screenPts.x, screenPts.y-bmp.getHeight(), null);         
            return true;
        }
    } 
	
	/**
	 * Pakollinen täyteluokka.
	 */
	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
	/**
	 * Pakollinen täyteluokka.
	 */
	public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
		// TODO Auto-generated method stub
	} 
}