顯示具有 Google Maps API 標籤的文章。 顯示所有文章
顯示具有 Google Maps API 標籤的文章。 顯示所有文章

2013年7月9日 星期二

Android應用程式:Unable to resolve superclass of L...

最近更新SDK,結果發現之前測試的Map v2專案執行時都產生Unable to resolve superclass of L...問題而異常終止,解決方式如下:

1. 開啟專案屬性視窗
2. 點選Java Build Path節點
3. 勾選Order and Export頁籤下的"Android Private Libraries"項目,

2013年5月10日 星期五

Android程式設計 - Google Maps API v2在地圖上繪圖

程式中可在Google Map上繪製連續線、圓形及多邊形,且繪製的幾何圖形會自動隨地圖縮放調整比例。
GoogleMap.addPolyline()方法用來在地圖上描繪連續線段。
GoogleMap.addPolygon()方法用來在地圖上描繪多邊形。
GoogleMap.addCircle()方法用來在地圖上描繪圓形。
例如:

  m_map = ((SupportMapFragment)
      getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  LatLng p1 = new LatLng(23.95616, 120.68509);
  LatLng p2 = new LatLng(23.95666, 120.68585);
  LatLng p3 = new LatLng(23.95836, 120.68732);
     m_map.addPolyline(new PolylineOptions().
       add(p1, p2, p3).
       width(5).
       color(Color.LTGRAY).
       geodesic(true));
     m_map.addCircle(new CircleOptions().
       center(p1).
       radius(10).
       strokeWidth(5).
       strokeColor(Color.RED));
     m_map.addCircle(new CircleOptions().
       center(p2).
       radius(10).
       strokeWidth(5).
       strokeColor(Color.RED));
     m_map.addCircle(new CircleOptions().
       center(p3).
       radius(10).
       strokeWidth(5).
       strokeColor(Color.RED));



2013年5月9日 星期四

Android程式設計 - Google Maps API v2自訂地標訊息視窗

預設的地標訊息title及snippet都只能顯示單行文字,當文字訊息過長時,後面的部份就只顯示「…」而看不到完整的文字內容。
要自訂地標訊息視窗樣式,首先必須為地標訊息視窗設計所需的版面配置,例如使用一個圖示與二個文字方塊做為地標訊息視窗版面。



接著為GoogleMap設計一個Adapter類別,在該類別的getInfoContents()方法中,將所要顯示的地標title及snippet內容設定到自訂的地標訊息視窗版面元件中。
class MyInfoWindowAdapter implements InfoWindowAdapter {
  @Override
  public View getInfoContents(Marker marker) {
     // 依指定layout檔,建立地標訊息視窗View物件
     View infoWindow = getLayoutInflater().inflate(R.layout.my_infowindow, null);
     // 顯示地標title
     TextView title = ((TextView)infoWindow.findViewById(R.id.txtTitle));
     title.setText(marker.getTitle());
     // 顯示地標snippet
    TextView snippet = ((TextView)infoWindow.findViewById(R.id.txtSnippet));
     snippet.setText(marker.getSnippet());
     return infoWindow;      
  }
  ...
}
最後設定GoogleMap使用自訂的MyInfoWindowAdapter物件做為地標訊息視窗轉接器。
    m_map.setInfoWindowAdapter(new MyInfoWindowAdapter());


2013年5月7日 星期二

Android程式設計 - Google Maps API v2 可拖曳地圖地標

若要允許使用者移動地圖上的地標,則地標之draggable屬性必須設定為true,並實作GoogleMap之OnMarkerDrag事件監聽器。

OnMarkerDrag事件監聽器有三個回呼方法,onMarkerDragStart()、onMarkerDrag()及onMarkerDragEnd(),如果沒有特別需求,就維持原程式框架即可。

使用者只要按住地標一段時間,地標就會浮起,之後就可開始拖曳調整地標位置。

  m_map = ((SupportMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  MarkerOptions marker2 = new MarkerOptions().
     position(new LatLng(23.95616, 120.68509)).
     title("椰林大道荷花香").
     snippet("休閒散心的景觀步道,兩側高大的大王椰子樹,樹下緊傍著荷花相伴").
     draggable(true).
     icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker2));
  m_map.addMarker(marker2);
  m_map.setOnMarkerDragListener(new OnMarkerDragListener(){
     @Override
     public void onMarkerDrag(Marker arg0) {}
     @Override
     public void onMarkerDragEnd(Marker arg0) {}
     @Override
     public void onMarkerDragStart(Marker arg0) {}
     });

Android程式設計 - Google Maps API v2 地圖地標

地圖標記方便我們在地圖的特定位置加上記號,讓重要地標在地圖上一目了然。
程式中可使用GoogleMap.addMarker()方法在地圖上加上地標,當使用者點擊地標時即會顯示地標中的訊息。
l Marker GoogleMap.addMarker(MarkerOptions options)
依據MarkerOptions物件內容,在地圖加上地標。
options            MarkerOptions物件,用來描述地標內容。
地標內容是以MarkerOptions物件來描述,包括以下屬性:
position    LatLng物件,放置地標的地圖座標,此為必要項。
title           地標名稱,當使用者點擊地標時,會開啟訊息視窗顯示標題。
snippet     地標之附加說明文字,會顯示在標題文字下方。
draggable 是否允許使用者拖曳地標,預設值為false。
visible      是否顯示地標,預設值為true。
anchor   地標圖示與position座標值位置之對齊方式,預設是將地標圖示下緣中央貼齊position座標值。
icon         BitmapDescriptor物件,用來描述做為地標圖案之圖示。
例如下列程式碼在地圖中加入1個地標:
  m_map = ((SupportMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.map)).getMap();  
  MarkerOptions marker1 = new MarkerOptions().
     position(new LatLng(23.95666, 120.68585)).
     title("中興新村牌樓").
     snippet("雙十造型牌樓,是中興新村的門戶景觀,也是進入中興新村的指標").
     icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker));
  m_map.addMarker(marker1);     



2013年5月3日 星期五

Android程式設計 - Google Maps API v2 地圖定位

使用My location圖層是最簡便的定位方式,其概念像是在地圖上覆蓋透明圖層,當我們啟用my-location圖層後,定位點內容自然會疊覆到地圖上。
程式中可使用GoogleMap.setMyLocationEnabled()方法來開啟或關閉My location圖層。例如:
  GoogleMap m_map = ((SupportMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  m_map.setMyLocationEnabled(true);


2013年5月2日 星期四

Android程式設計 - Google Maps API v2 變更地圖檢視模式


GoogleMap物件支援一般地圖(就是大家常用的道路地圖)、衛星地圖、及地形圖,預設是顯示道路地圖,程式中可使用setMapType ()來設定顯示模式。
l void GoogleMap.setMapType (int type)
依指定之LatLng座標物件及地圖縮放值,建立CameraUpdate物件。
type                 地圖顯示模式代碼,有效設定值如下:
                        GoogleMap.MAP_TYPE_NORMAL       道路地圖。
                        GoogleMap.MAP_TYPE_SATELLITE    衛星空照圖。
                        GoogleMap.MAP_TYPE_TERRAIN       地形圖。
                        GoogleMap.MAP_TYPE_HYBRID         道路地圖混合空照圖。
例如下列程式碼設定顯示地形圖:
  GoogleMap map = ((SupportMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);




Android程式設計 - Google Maps API v2 調整地圖中心點

地圖座標是使用LatLng物件來表示,LatLng建構子第一個參數表示緯度值,第二個參數表示經度值。例如:

  LatLng nkut = new LatLng(23.97918, 120.69686);

程式中可直接使用GoogleMap物件之moveCamera(CameraUpdate update)方法或animateCamera(CameraUpdate update)方法來移動地圖鏡頭到指定座標點,差別在於animateCamera()會有地圖移動效果。
在上述方法中,update為地圖鏡頭動作物件,必須使用CameraUpdateFactory類別建構CameraUpdate物件。最簡單的方式是使用CameraUpdateFactory.newLatLng (LatLng latLng),例如:


  GoogleMap map = ((SupportMapFragment)
    getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  LatLng nkut = new LatLng(23.97918, 120.69686);
  map.moveCamera(CameraUpdateFactory.newLatLng(nkut)); 

CameraUpdateFactory.newLatLngZoom()方法除了指定地圖中心LatLng座標,還同時設定地圖縮放等級。例如:

  GoogleMap map = ((SupportMapFragment)
    getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
  LatLng nkut = new LatLng(23.97918, 120.696867);
  map.moveCamera(CameraUpdateFactory.newLatLngZoom(nkut,15.0f));

2012年12月25日 星期二

Android程式設計 - Google Maps API v2應用程式基本架構

1. 開啟Android SDK Manager,確認已安裝Google Play services。

2. 將google-play-services_lib專案匯入到工作區。在專案開發過程google-play-services_lib專案必須維持開啟狀態。

3. 建立Android專案。

4. 將google-play-services_lib加到Google Maps API v2應用程式專案。

5. 使用debug.keystore的SHA1碼及專案套件名稱(workshop.mapapiv2)到https://code.google.com/apis/console/官網申請Google Maps API v2 key。

6. 開啟專案之AndroidManifest.xml檔,在元素之結束標籤(
)前加入以下宣告。其中apiv2_key需置換為Google Maps API v2 key。
   <meta-data
     android:name="com.google.android.maps.v2.API_KEY"
     android:value="apiv2_key" />

7. 在AndroidManifest.xml檔元素之前加入以下宣告,其中your_package_name需置換為自己的App專案套件名稱。
  <permission
     android:name="your_package_name.permission.MAPS_RECEIVE"
     android:protectionLevel="signature" />
  <uses-permission
     android:name="your_package_name.permission.MAPS_RECEIVE" />
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <uses-permission android:name=
     "com.google.android.providers.gsf.permission.READ_GSERVICES"/>

8. 在AndroidManifest.xml檔元素之前加入以下宣告。
  <uses-feature
     android:glEsVersion="0x00020000" android:required="true"/>

9. 開啟專案版面配置檔(activity_main.xml),移除預設的<TextView>,加入以下元件。如果Minimum Required SDK是指定為API 12之後版本,之class屬性值可使用”com.google.android.gms.maps. MapFragment”。
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/map"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment"/>

10. 編輯專案程式檔(MainActivity.java)。將MainActivity改為繼承自FragmentActivity。注意!如果Minimum Required SDK是指定為API 12之後版本,且版面配置檔之class屬性值是使用”com.google.android.gms.maps. MapFragment”時,則MainActivity要直接繼承Activity。
  public class MainActivity extends FragmentActivity{
    @Override
     protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
     }
  }