先再幫自己工商服務一下...
https://play.google.com/store/apps/details?id=com.lancelot.privatelocationdatabase
接著前兩篇的內容。
可以載入地圖之後,下一個要做的事,就是抓到我們的位置,還有,把地圖移到我們所在的位置上。
我們需要的是 LocationManager, LocationListener, 還有 MapController。
LocationManager 的作用是定位我們現在的位置,然後再將定位的結果傳喚給 LocationListener。不過呢,LocationListener 是一個抽象類別,需要我們自己去繼承實做,主要要實做 onLocationChanged 這個函式。
所以,我們先建立一個 GeoUpdateListener 類別。
   public class GeoUpdateListener implements LocationListener {
        MapController m_MapController;      
    GeoPoint m_geoCurrentLoc;       
    MainActivity m_Activity;       
    
    public GeoUpdateListener(MainActivity activity, MapController map_controller)       
    {       
        m_MapController = map_controller;       
        m_Activity = activity;       
    }       
    public void onLocationChanged(Location location) {       
        // TODO Auto-generated method stub       
        int lat = (int) (location.getLatitude() * 1E6);       
        int lng = (int) (location.getLongitude() * 1E6);       
        m_geoCurrentLoc = new GeoPoint(lat, lng);       
        m_MapController.animateTo(m_geoCurrentLoc);       
    }
        public void onProviderDisabled(String provider) {      
        // TODO Auto-generated method stub
        }
        public void onProviderEnabled(String provider) {      
        // TODO Auto-generated method stub
        }
        public void onStatusChanged(String provider, int status, Bundle extras) {      
        // TODO Auto-generated method stub
        }
    }      
   onLocationChanged 的程式碼很簡單,就是把取得來的位置,經緯度轉換成 MapController 能用的整數格式,生成 GeoPoint 物件後,交給 MapController,MapController 就會把地圖移動到我們指定的位置上。
接著改 Main Activity。
加入幾個 Private 變數。
   private MapController m_MapController;      
private MapView m_MapView;       
private LocationManager m_LocationManager;       
private GeoUpdateListener m_GeoUpdateListener;
   在 Main Activity 的 onCreate函式裡,加入 Location Manager, Geo Update Listener, 取得 Map View, Map Controller。
           m_MapView = (MapView)findViewById(R.id.mapview);      
        m_MapView.setBuiltInZoomControls(true);       
        //m_MapView.setSatellite(true);       
        
        m_MapController = m_MapView.getController();       
        m_MapController.setZoom(14); // Zoom 1 is world view       
        
        m_GeoUpdateListener = new GeoUpdateListener(this, m_MapController);       
        
        m_LocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);       
        m_LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000,       
                0, m_GeoUpdateListener);       
        // also need 3G GPS       
        m_LocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000,       
                0, m_GeoUpdateListener);       
   那,從 Code看。
Location Manager 要從 System Service 中取得。
位置的提供者,有兩種,從 GPS 來,以及從手機基地台定位而來。我們可以兩種都用。所以在 requestLocationUpdates 函式裡,會有兩種參數 GPS_PROVIDER & NETWORK_PROVIDER。
同時,我們也告訴Location Manager,位置更新的時候,請呼喚 GeoUpdateListener。
程式就改到這邊。
還有一個地方要更動一下。在 AndroidManifest.xml 裡,要加入兩個 Permission。
   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>      
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
   現在我們可以做測試了。
不過這次,我們想用模擬器來玩。
因為,這個 App 的 Build Target 是 Google API,所以,我們必須要建立一個 Google API 的 模擬器。
開啟模擬器之後,跑起 App。
但是這樣的東西好像沒有定位的功能呢,怎麼辦?
把 Eclipse IDE 上的 DDMS 打開,有個 Emulator Control 的分頁,可以找到 Location Control 的功能。
我們試試看,把 Longitude 改成 –122.08, Latitude 改成 37.42,
地圖就改到別的地方啦!!
 
沒有留言:
張貼留言