2008年2月28日 星期四

MapActivity in Android 4 - GPS

You can use GPS in Android. Here is a demo for driving around Google by using GPS.

MapActivity亦可使用GPS定位Google map,不過目前透過內部模擬在Google附近開車的GPS資料進行模擬。

1. mapdemo.java:再將上一篇的程式碼主要加上籃色部份,透過LocationManager使用GPS定位,選單增加GPS項目,P為定位、G為到選單。



package com.test.demo;

import java.util.List;
import com.google.android.maps.MapActivity;
import android.app.Activity;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Point;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;

public class mapdemo extends MapActivity{
/** Called when the activity is first created. */
public static final int change = 3000;
private MapView mapView;
private MapController mapConrtoller;
private Spinner s1;
private LocationManager locMan;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

s1 = (Spinner) findViewById(R.id.spinner1);
Spinner s1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter adapter = ArrayAdapter.createFromResource(
this, R.array.city, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(adapter);
//It seems a bug for LocationManager,we can't get location in first time.
getLocation();
mapView =(MapView) findViewById(R.id.my_map);
mapConrtoller = mapView.getController();
mapConrtoller.zoomTo(17);
updateView();
}

private void getLocation(){
Location loc;
LocationProvider locPro;
List proList;
locMan = (LocationManager)this.getSystemService(Activity.LOCATION_SERVICE);
proList = locMan.getProviders();
locPro = proList.get(0);
loc = locMan.getCurrentLocation("gps");

Double lat = 0.0;
Double lon = 0.0;
lat = (Double)loc.getLatitude()*1E6;
lon = (Double)loc.getLongitude()*1E6;
Point point = new Point(lat.intValue(),lon.intValue());
if(lat.intValue()!=0 && lon.intValue()!=0){
mapConrtoller.animateTo(point);
}
}

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_I) {
mapView.requestFocus();
// zoom in
mapView.getController().zoomTo(mapView.getZoomLevel() + 1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_P) {
// position
Double lat=0.0;
Double lng=0.0;
if(s1.getSelectedItemIndex()==0){
lat = 25.08421662*1E6;
lng = 121.5588632*1E6;
}else if(s1.getSelectedItemIndex()==1){
lat = 25.156109*1E6;
lng = 121.695457*1E6;
}else if(s1.getSelectedItemIndex()==2){
lat = 25.02723286*1E6;
lng = 121.4777282*1E6;
}else if(s1.getSelectedItemIndex()==3){
lat = 24.766944444*1E6;
lng = 121.758333333*1E6;
}else if(s1.getSelectedItemIndex()==4){
lat = 24.7952904064701*1E6;
lng = 121.005980402031*1E6;
}else if(s1.getSelectedItemIndex()==5){
lat = 25.01049145*1E6;
lng = 121.2988981*1E6;
}else if(s1.getSelectedItemIndex()==6){
lat = 24.6929396881103*1E6;
lng = 120.916988073054*1E6;
}else if(s1.getSelectedItemIndex()==7){
lat = 24.165632*1E6;
lng = 120.640234*1E6;
}else if(s1.getSelectedItemIndex()==8){
lat = 24.085467449249*1E6;
lng = 120.53489812506*1E6;
}else if(s1.getSelectedItemIndex()==9){
lat = 23.831933886322*1E6;
lng = 120.71674349869*1E6;
}else if(s1.getSelectedItemIndex()==10){
lat = 23.4670607206971*1E6;
lng = 120.424347942069*1E6;
}else if(s1.getSelectedItemIndex()==11){
lat = 23.68080782*1E6;
lng = 120.4857101*1E6;
}else if(s1.getSelectedItemIndex()==12){
lat = 23.015307619667*1E6;
lng = 120.19802892001*1E6;
}else if(s1.getSelectedItemIndex()==13){
lat = 22.6516357159836*1E6;
lng = 120.305947184541*1E6;
} else if(s1.getSelectedItemIndex()==14){
lat = 22.568397*1E6;
lng = 120.539828*1E6;
} else if(s1.getSelectedItemIndex()==15){
lat = 22.736944444*1E6;
lng = 121.122777778*1E6;
}else if(s1.getSelectedItemIndex()==16){
lat = 23.973333333*1E6;
lng = 121.588055556*1E6;
}else if(s1.getSelectedItemIndex()==16){
lat = 23.973333333*1E6;
lng = 121.588055556*1E6;
}else if(s1.getSelectedItemIndex()==17){
getLocation();
}
Point point = new Point(lat.intValue(), lng.intValue());
mapConrtoller.centerMapTo(point, false);
mapView.requestFocus();
return true;
}else if (keyCode == KeyEvent.KEYCODE_G) {
// zoom out
s1.requestFocus();
return true;
}else if (keyCode == KeyEvent.KEYCODE_O) {
mapView.requestFocus();
// zoom out
mapView.getController().zoomTo(mapView.getZoomLevel() - 1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_S) {
mapView.requestFocus();
// Satellite,衛星地图
if(!mapView.isSatellite()){
mapView.toggleSatellite();
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_M) {
mapView.requestFocus();
// traffic,路况
if(mapView.isSatellite()){
mapView.toggleSatellite();
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {

mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lat=lat+change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lat=lat-change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;

} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lng=lng-change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
mapView.requestFocus();
Double lat = mapView.getMapCenter().getLatitudeE6()/1.0;
Double lng = mapView.getMapCenter().getLongitudeE6()/1.0;
lng=lng+change;
Point point = new Point(lat.intValue(),lng.intValue());
mapConrtoller.animateTo(point);
return true;
}
return false;
}

private void updateView(){

Double lat = 25.025708*1E6;
Double lng = 121.526403*1E6;
Point point = new Point(lat.intValue(), lng.intValue());
mapConrtoller.centerMapTo(point, false);
}

}


2. arrays.xml:加上GPS項目。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="city">
<item>台北市</item>
<item>基隆市</item>
<item>台北縣</item>
<item>宜蘭縣</item>
<item>新竹市</item>
<item>桃園市</item>
<item>苗栗縣</item>
<item>台中市</item>
<item>彰化縣</item>
<item>南投縣</item>
<item>嘉義市</item>
<item>雲林縣</item>
<item>臺南市</item>
<item>高雄市</item>
<item>屏東縣</item>
<item>臺東縣</item>
<item>花蓮縣</item>
<item>GPS</item>
</array>
</resources>

沒有留言: