返回列表 發帖

Google地圖程式正確版本及注意事項

本帖最後由 ray 於 2012-11-10 18:33 編輯


關於我們上課遇到的問題說明整理如下:
1.執行看得見地圖,但是無法縮放移動,是因為layout的xml裡面mapview的設定我忘了加入:android:clickable="true"這個屬性
2.執行看的見定位後的地圖,但是把onLocationChanged中的程式註解後看不見初始的地圖,是因為我們第一次執行時他成功並將地圖資料下載在快取中
後來因為layout的xml裡面mapview的apiKey被誤判為錯誤的,所以不再能取得地圖資料,解法:將xml刪掉重建然後clean讓R.java重新產生即可!
3.模擬器無法執行的問題看起來是android 4.1(API 16)的模擬器本身的問題,這一點我無法從網路或朋友處得到確定的資料,但是看來目前最穩定的版本
還是android 2.2(API 8)

我後來下載了android 2.2(API 8)的SDK並重寫了我們上課教過的程式,目前不管是在模擬器或手機皆能正確執行了,程式跟我們上課講的除了變數的定義有
很小的差異外,其餘應該是一模一樣了,不過本來提出成updateMap方法的部分我後來覺得還是有些差異,所以就用回原來不提出的方法了!
除此之外我也把上課時對程式逐行的解說寫了大略的註解,各位可以下載回去複習!!

有空的同學(特別是自己帶NB的),可以先利用SDK Manager將android 2.2(API 8)全部下載下來再import我上傳的專案來測試,應該沒問題了!
其餘的同學也不用擔心,下週上課我還是會詳細說明這個程式的~不過如果上課時就覺得很吃力的同學還是強烈建議即便無法執行也先下載回去複習一下~
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

  1. package com.google.mygooglemap;

  2. import java.util.List;

  3. import android.content.Intent;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Paint;
  7. import android.graphics.Point;
  8. import android.graphics.RectF;
  9. import android.location.Address;
  10. import android.location.Geocoder;
  11. import android.location.Location;
  12. import android.location.LocationListener;
  13. import android.location.LocationManager;
  14. import android.os.Bundle;
  15. import android.view.Menu;
  16. import android.view.MenuInflater;
  17. import android.view.MenuItem;
  18. import android.widget.Toast;

  19. import com.google.android.maps.GeoPoint;
  20. import com.google.android.maps.MapActivity;
  21. import com.google.android.maps.MapController;
  22. import com.google.android.maps.MapView;
  23. import com.google.android.maps.Overlay;
  24. import com.google.android.maps.Projection;

  25. public class MyGoogleMapActivity extends MapActivity implements LocationListener
  26. {
  27.         static final int INITIAL_ZOOM_LEVEL = 20;
  28.         static final int INITIAL_LATITUDE = 25040255; //起始緯度
  29.         static final int INITIAL_LONGITUDE = 121512377; //起始經度
  30.         static final int QRCODE_REQUEST = 1; //QRcode功能的request識別碼
  31.        
  32.         private MapView mapView;
  33.         private MapController mapControl;
  34.         private LocationManager mLocationManager;
  35.        
  36.     @Override
  37.     public void onCreate(Bundle savedInstanceState)
  38.     {
  39.         super.onCreate(savedInstanceState);
  40.         setContentView(R.layout.main);
  41.         mapView = (MapView)findViewById(R.id.mapview);
  42.         mapView.setBuiltInZoomControls(true);   //設定開啟內建的放大縮小控制
  43.         
  44.         //地圖上可以使用overlay來貼圖或寫字,在此我們將自己建立的Overlay類別貼上
  45.         GeoPoint center = new GeoPoint(INITIAL_LATITUDE,INITIAL_LONGITUDE); //建立地圖中心點的座標
  46.         MyPointOverlay myPointOverlay = new MyPointOverlay(center); //以地圖中心點的座標來建議我們的Overlay物件
  47.         mapView.getOverlays().add(myPointOverlay); //將我們的Overlay物件加入mapView
  48.         
  49.         mapControl = mapView.getController();   //取得mapView的控制器G
  50.         mapControl.setZoom(INITIAL_ZOOM_LEVEL); //設定地圖大小
  51.         mapControl.setCenter(center);           //設定地圖中心點
  52.         
  53.         mLocationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
  54.         //取得系統服務中的位置服務管理
  55.         mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
  56.         //設定由GPS來提供位置更新
  57.         mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this);
  58.         //設定由network來提供位置更新
  59.     }
  60.   
  61.     public void onLocationChanged(Location location)
  62.         {
  63.             GeoPoint center = new GeoPoint((int)(location.getLatitude()*1E6),
  64.                                                                        (int)(location.getLongitude()*1E6));
  65.         MyPointOverlay myPointOverlay = new MyPointOverlay(center);
  66.         mapView.getOverlays().clear();
  67.         mapView.getOverlays().add(myPointOverlay);
  68.         //將地圖的中心點以動畫的方式移動到center的位置     
  69.         mapControl.animateTo(center);
  70.         }

  71.         public void onProviderDisabled(String provider)
  72.         {}

  73.         public void onProviderEnabled(String provider)
  74.         {}

  75.         public void onStatusChanged(String provider, int status,Bundle extras)
  76.         {}

  77.         @Override
  78.         protected boolean isRouteDisplayed()
  79.         {
  80.                 return false;
  81.         }
  82.        
  83.         @Override
  84.         public boolean onCreateOptionsMenu(Menu menu) //按下選單鈕的回呼函式
  85.         {
  86.                 super.onCreateOptionsMenu(menu);
  87.                 MenuInflater inflater = getMenuInflater(); //建立一個選單氣泡
  88.                 inflater.inflate(R.menu.menu, menu); //打開選單氣泡
  89.                 return true;
  90.         }
  91.        
  92.         @Override
  93.         public boolean onOptionsItemSelected(MenuItem item) //按下選單選項的回呼函式
  94.         {
  95.                 switch(item.getItemId())
  96.                 {
  97.                         case R.id.capture:
  98.                                 try
  99.                                 {
  100.                                         Intent intent = new Intent("com.google.zxing.client.android.SCAN");        //開啟條碼掃描器
  101.                                         intent.putExtra("SCAN_MODE", "QR_CODE_MODE");        //設定QR Code參數
  102.                                         startActivityForResult(intent, QRCODE_REQUEST);       
  103.                                         return true;
  104.                                 }
  105.                                 catch(Exception e)
  106.                                 {
  107.                                         Toast.makeText(this, "呼叫條碼掃描器失敗,請先確定是否正確安裝!", Toast.LENGTH_LONG).show();
  108.                                 }
  109.                                 break;
  110.                 }
  111.                 return false;
  112.         }
  113.        
  114.         @Override
  115.         protected void onActivityResult(int requestCode, int resultCode, Intent data) //呼叫Activity後的回呼函式
  116.         {
  117.                 super.onActivityResult(requestCode, resultCode, data);

  118.                 if (requestCode == QRCODE_REQUEST) //判斷是哪一個Activity回呼的
  119.                 {        //startActivityForResult回傳值
  120.                         if (resultCode == RESULT_OK)
  121.                         {
  122.                                 String contents = data.getStringExtra("SCAN_RESULT");        //取得QR Code內容
  123.                                 //Toast.makeText(this, contents, Toast.LENGTH_SHORT).show();
  124.                                 Geocoder geocoder = new Geocoder(this);
  125.                                 try
  126.                                 {
  127.                                         List<Address> addr = geocoder.getFromLocationName(contents,1);
  128.                                         Address address = addr.get(0);
  129.                                         GeoPoint center = new GeoPoint((int)(address.getLatitude()*1E6),
  130.                                                         (int)(address.getLongitude()*1E6));
  131.                                         MyPointOverlay myPointOverlay = new MyPointOverlay(center);
  132.                                         mapView.getOverlays().clear();
  133.                                         mapView.getOverlays().add(myPointOverlay);
  134.                                         //將地圖的中心點以動畫的方式移動到center的位置     
  135.                                         mapControl.animateTo(center);
  136.                                 }
  137.                                 catch(Exception e)
  138.                                 {
  139.                                         Toast.makeText(this, "地址:『"+contents+"』查詢失敗", Toast.LENGTH_LONG).show();
  140.                                 }
  141.                         }
  142.                 }
  143.         }
  144. }

  145. class MyPointOverlay extends Overlay
  146. {
  147.         private GeoPoint mGeoPoint;
  148.         private int mRadius = 7;  //設定大圓的半徑
  149.         private int sRadius = 5;  //設定小圓的半徑
  150.        
  151.         public MyPointOverlay(GeoPoint gp)
  152.         {
  153.                 mGeoPoint = gp;
  154.         }
  155.                
  156.         @Override
  157.         public boolean draw(Canvas canvas, MapView mapView, boolean shadow,long when)
  158.         {
  159.                 //if (shadow == false)
  160.                 //{
  161.                         Paint paint = new Paint(); //新增畫筆
  162.                         paint.setAntiAlias(true); //設定畫筆鋸齒消除
  163.                         paint.setColor(Color.RED); //將畫筆的顏色設為紅色
  164.                        
  165.                         Point pointDraw = new Point(); //建立一個畫布座標點
  166.                         Projection projection = mapView.getProjection(); //取得地圖的元件的畫布投影器
  167.                         projection.toPixels(mGeoPoint, pointDraw); //將地圖上的經緯度座標轉換到畫布上的座標
  168.                        
  169.                         RectF ovalPoint = new RectF(pointDraw.x - mRadius, //建立畫圓的矩形範圍(Float)
  170.                                                                                 pointDraw.y - mRadius,
  171.                                                                                 pointDraw.x + mRadius,
  172.                                                                                 pointDraw.y + mRadius);
  173.                         canvas.drawOval(ovalPoint, paint); //在畫布上畫圓
  174.                        
  175.                         paint.setColor(Color.BLUE);
  176.                         ovalPoint = new RectF(pointDraw.x - sRadius,
  177.                                                                   pointDraw.y - sRadius,
  178.                                                                   pointDraw.x + sRadius,
  179.                                                                   pointDraw.y + sRadius);
  180.                         canvas.drawOval(ovalPoint, paint);
  181.                 //}
  182.                 return super.draw(canvas, mapView, shadow, when);
  183.         }
  184. }
複製代碼

TOP

  1. package com.google.mygooglemap;

  2. import java.util.List;

  3. import android.content.Intent;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Paint;
  7. import android.graphics.Point;
  8. import android.graphics.RectF;
  9. import android.location.Address;
  10. import android.location.Geocoder;
  11. import android.location.Location;
  12. import android.location.LocationListener;
  13. import android.location.LocationManager;
  14. import android.os.Bundle;
  15. import android.view.Menu;
  16. import android.view.MenuInflater;
  17. import android.view.MenuItem;
  18. import android.widget.Toast;

  19. import com.google.android.maps.GeoPoint;
  20. import com.google.android.maps.MapActivity;
  21. import com.google.android.maps.MapController;
  22. import com.google.android.maps.MapView;
  23. import com.google.android.maps.Overlay;
  24. import com.google.android.maps.Projection;

  25. public class MyGoogleMapActivity extends MapActivity implements LocationListener
  26. {
  27.         static final int INITIAL_ZOOM_LEVEL = 20;
  28.         static final int INITIAL_LATITUDE = 25040255; //起始緯度
  29.         static final int INITIAL_LONGITUDE = 121512377; //起始經度
  30.         static final int QRCODE_REQUEST = 1; //QRcode功能的request識別碼
  31.        
  32.         private MapView mapView;
  33.         private MapController mapControl;
  34.         private LocationManager mLocationManager;
  35.        
  36.     @Override
  37.     public void onCreate(Bundle savedInstanceState)
  38.     {
  39.         super.onCreate(savedInstanceState);
  40.         setContentView(R.layout.main);
  41.         mapView = (MapView)findViewById(R.id.mapview);
  42.         mapView.setBuiltInZoomControls(true);   //設定開啟內建的放大縮小控制
  43.         
  44.         //地圖上可以使用overlay來貼圖或寫字,在此我們將自己建立的Overlay類別貼上
  45.         GeoPoint center = new GeoPoint(INITIAL_LATITUDE,INITIAL_LONGITUDE); //建立地圖中心點的座標
  46.         MyPointOverlay myPointOverlay = new MyPointOverlay(center); //以地圖中心點的座標來建議我們的Overlay物件
  47.         mapView.getOverlays().add(myPointOverlay); //將我們的Overlay物件加入mapView
  48.         
  49.         mapControl = mapView.getController();   //取得mapView的控制器G
  50.         mapControl.setZoom(INITIAL_ZOOM_LEVEL); //設定地圖大小
  51.         mapControl.setCenter(center);           //設定地圖中心點
  52.         
  53.         mLocationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
  54.         //取得系統服務中的位置服務管理
  55.         mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
  56.         //設定由GPS來提供位置更新
  57.         mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this);
  58.         //設定由network來提供位置更新
  59.     }
  60.   
  61.     public void onLocationChanged(Location location)
  62.         {
  63.             GeoPoint center = new GeoPoint((int)(location.getLatitude()*1E6),
  64.                                                                        (int)(location.getLongitude()*1E6));
  65.         MyPointOverlay myPointOverlay = new MyPointOverlay(center);
  66.         mapView.getOverlays().clear();
  67.         mapView.getOverlays().add(myPointOverlay);
  68.         //將地圖的中心點以動畫的方式移動到center的位置     
  69.         mapControl.animateTo(center);
  70.         }

  71.         public void onProviderDisabled(String provider)
  72.         {}

  73.         public void onProviderEnabled(String provider)
  74.         {}

  75.         public void onStatusChanged(String provider, int status,Bundle extras)
  76.         {}

  77.         @Override
  78.         protected boolean isRouteDisplayed()
  79.         {
  80.                 return false;
  81.         }
  82.        
  83.         @Override
  84.         public boolean onCreateOptionsMenu(Menu menu) //按下選單鈕的回呼函式
  85.         {
  86.                 super.onCreateOptionsMenu(menu);
  87.                 MenuInflater inflater = getMenuInflater(); //建立一個選單氣泡
  88.                 inflater.inflate(R.menu.menu, menu); //打開選單氣泡
  89.                 return true;
  90.         }
  91.        
  92.         @Override
  93.         public boolean onOptionsItemSelected(MenuItem item) //按下選單選項的回呼函式
  94.         {
  95.                 switch(item.getItemId())
  96.                 {
  97.                         case R.id.capture:
  98.                                 try
  99.                                 {
  100.                                         Intent intent = new Intent("com.google.zxing.client.android.SCAN");        //開啟條碼掃描器
  101.                                         intent.putExtra("SCAN_MODE", "QR_CODE_MODE");        //設定QR Code參數
  102.                                         startActivityForResult(intent, QRCODE_REQUEST);       
  103.                                         return true;
  104.                                 }
  105.                                 catch(Exception e)
  106.                                 {
  107.                                         Toast.makeText(this, "呼叫條碼掃描器失敗,請先確定是否正確安裝!", Toast.LENGTH_LONG).show();
  108.                                 }
  109.                                 break;
  110.                 }
  111.                 return false;
  112.         }
  113.        
  114.         @Override
  115.         protected void onActivityResult(int requestCode, int resultCode, Intent data) //呼叫Activity後的回呼函式
  116.         {
  117.                 super.onActivityResult(requestCode, resultCode, data);

  118.                 if (requestCode == QRCODE_REQUEST) //判斷是哪一個Activity回呼的
  119.                 {        //startActivityForResult回傳值
  120.                         if (resultCode == RESULT_OK)
  121.                         {
  122.                                 String contents = data.getStringExtra("SCAN_RESULT");        //取得QR Code內容
  123.                                 //Toast.makeText(this, contents, Toast.LENGTH_SHORT).show();
  124.                                 Geocoder geocoder = new Geocoder(this);
  125.                                 try
  126.                                 {
  127.                                         List<Address> addr = geocoder.getFromLocationName(contents,1);
  128.                                         Address address = addr.get(0);
  129.                                         GeoPoint center = new GeoPoint((int)(address.getLatitude()*1E6),
  130.                                                         (int)(address.getLongitude()*1E6));
  131.                                         MyPointOverlay myPointOverlay = new MyPointOverlay(center);
  132.                                         mapView.getOverlays().clear();
  133.                                         mapView.getOverlays().add(myPointOverlay);
  134.                                         //將地圖的中心點以動畫的方式移動到center的位置     
  135.                                         mapControl.animateTo(center);
  136.                                 }
  137.                                 catch(Exception e)
  138.                                 {
  139.                                         Toast.makeText(this, "地址:『"+contents+"』查詢失敗", Toast.LENGTH_LONG).show();
  140.                                 }
  141.                         }
  142.                 }
  143.         }
  144. }

  145. class MyPointOverlay extends Overlay
  146. {
  147.         private GeoPoint mGeoPoint;
  148.         private int mRadius = 7;  //設定大圓的半徑
  149.         private int sRadius = 5;  //設定小圓的半徑
  150.        
  151.         public MyPointOverlay(GeoPoint gp)
  152.         {
  153.                 mGeoPoint = gp;
  154.         }
  155.                
  156.         @Override
  157.         public boolean draw(Canvas canvas, MapView mapView, boolean shadow,long when)
  158.         {
  159.                 //if (shadow == false)
  160.                 //{
  161.                         Paint paint = new Paint(); //新增畫筆
  162.                         paint.setAntiAlias(true); //設定畫筆鋸齒消除
  163.                         paint.setColor(Color.RED); //將畫筆的顏色設為紅色
  164.                        
  165.                         Point pointDraw = new Point(); //建立一個畫布座標點
  166.                         Projection projection = mapView.getProjection(); //取得地圖的元件的畫布投影器
  167.                         projection.toPixels(mGeoPoint, pointDraw); //將地圖上的經緯度座標轉換到畫布上的座標
  168.                        
  169.                         RectF ovalPoint = new RectF(pointDraw.x - mRadius, //建立畫圓的矩形範圍(Float)
  170.                                                                                 pointDraw.y - mRadius,
  171.                                                                                 pointDraw.x + mRadius,
  172.                                                                                 pointDraw.y + mRadius);
  173.                         canvas.drawOval(ovalPoint, paint); //在畫布上畫圓
  174.                        
  175.                         paint.setColor(Color.BLUE);
  176.                         ovalPoint = new RectF(pointDraw.x - sRadius,
  177.                                                                   pointDraw.y - sRadius,
  178.                                                                   pointDraw.x + sRadius,
  179.                                                                   pointDraw.y + sRadius);
  180.                         canvas.drawOval(ovalPoint, paint);
  181.                 //}
  182.                 return super.draw(canvas, mapView, shadow, when);
  183.         }
  184. }
複製代碼

TOP

返回列表