Android 台灣中文網

標題: 開發APP並使用Google Map的相關問題 [打印本頁]

作者: deep_dream    時間: 2011-10-20 18:42
標題: 開發APP並使用Google Map的相關問題
本帖最後由 deep_dream 於 2011-10-20 18:55 編輯

基本上,小弟我算了已經做到完成一半了…但是後面一直卡住,書上沒寫到,Google也Google了很久~
所以就想說來請教一下站上是否有對這方面有所研究的前輩,給我一點建議或經驗上的傳承~

在Layout上面很簡單,除了2個TextView之外,就只有一個MapView而已~

測試環境:
自己的手機,我因為是要實測Google Map & GPS,所以就不用模擬器了…
Samsung S5830
Android 版本:2.3.7
Mod版本:Cyano Ace - RC 2.1

WIFI正常、3G正常、GPS正常。

測試時只開GPS,3G!

前面工作:
已經有做完整個使用Google Map API的動作~Google Map可以正常在我的手機上面顯示,不過只能顯示ZoomLevel 16,這個我目前還沒有頭緒~

[default.properties]
# Project target.
target=Google Inc.:Google APIs:7

[main.xml]
已加入Google Map API
<com.google.android.maps.MapView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="Key隱藏"
/>

[AndroidManifest.xml]
已加入相關權限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
已加入Library
<uses-library android:name="com.google.android.maps"></uses-library>


[GetGPSInfoActivity.java] 主程式,名稱其實不重要~
基本上,除了LocationListener我有另外實作之外,其它的都是直接使用現有的Class。
  1. import省略…
  2. public class GetGPSInfoActivity extends MapActivity {
  3.         private int zoomLevel = 16;

  4.         private GeoPoint nowGeoPoint;
  5.         private Location location;
  6.         private LocationManager locationManager;
  7.         private MyLocationListener myLocationListener;       
  8.        
  9.         private MapView mapView;
  10.         private MapController mapController;
  11.         private MyLocationOverlay myLocationOverlay;
  12.         private TextView gpsText1;
  13.         private TextView gpsText2;

  14.         @Override
  15.         public void onCreate(Bundle savedInstanceState) {
  16.                 super.onCreate(savedInstanceState);
  17.                 setContentView(R.layout.main);

  18.                 gpsText1 = (TextView) findViewById(R.id.gpsText1);
  19.                 gpsText2 = (TextView) findViewById(R.id.gpsText2);
  20.                
  21.                 mapView = (MapView) findViewById(R.id.mapView);
  22.                 mapView.setBuiltInZoomControls(true);
  23.                 mapView.displayZoomControls(true);
  24.                 mapController = mapView.getController();
  25.                 mapController.setZoom(zoomLevel);

  26.                 startListener();
  27.                 startOverlay();
  28.                 startZoom();       
  29.         }

  30.         3個Function省略

  31.         private class MyLocationListener implements LocationListener {
  32.         //這邊實作LocationListener並Overwrite onLocationChanged()
  33.         }

  34. }
複製代碼
3大部分
startListener();
這邊會使用LOCATION_SERVICE並判斷NETWORK或GPS是否打開,並開啟一個Listener。

startOverlay();
從MapView拿到Overlays並在地圖上標記。

startZoom();
從MapView拿到內建的ZoomControls,並Overwrite ZoomIn ZoomOut事件。
(一開始找不到如何抓取內建的ZoomControl的事件卡超久…後來改用外部的停掉內建的,不過最後又改用內建的並解決了。)

  1. //兩個事件
  2. zoomControls.setOnZoomInClickListener(new OnClickListener() {
  3.         public void onClick(View v) {
  4.                 mapController.zoomIn();
  5.                 mapView.invalidate(); <---這行沒用…
  6.                 Toast.makeText(GetGPSInfoActivity.this, "ZoomIn Event!", Toast.LENGTH_SHORT).show(); <---用來檢查事件有無被呼叫,這是有成功的。
  7.         }
  8. });
  9. zoomControls.setOnZoomOutClickListener(new OnClickListener() {
  10.         public void onClick(View v) {
  11.                 mapController.zoomOut();
  12.                 mapView.invalidate(); <---這行沒用…
  13.                 Toast.makeText(GetGPSInfoActivity.this, "ZoomOut Event!", Toast.LENGTH_SHORT).show(); <---用來檢查事件有無被呼叫,這是有成功的。
  14.         }
  15. });
複製代碼
實測的圖片:
進入程式之後的畫面
screenshot-1319107015188.png
登錄/註冊後可看大圖