2013年4月16日 星期二

Google Maps Android API v2-- Android 新版地圖開發方法


近日如果在Android開發Google Map應用程式時會發現到為何坊間的書籍資料裡面的方法已經無法使用,然後就......
其實,2012年12月3日Google聲明淘汰掉 Google Maps Android API Version 1版本,同時並推出 Google Maps Android API v2版。
首當其衝的就是申請Map API Key,使用v1版本方式開發Map程式申請API Key到今年3月18日止就不再受理,但如果已經申請到的v1 API Key則可以沿用下去。
其次影響到的就是在Android開發Map程式方法,新版開發的方式變得比較複雜許多,所以本篇整理一下如何使用Google Maps Android API v2在Android上開發Google 程式。

Google Maps Android API v2的官方網址為:https://developers.google.com/maps/documentation/android/ 。其中說明到:

1. API需要配合Google Play Services 。Google Play services APK是Android系統中的一個背景服務,該服務提供了授權流程用來獲得Google的各項服務。詳見Google Play Services
2. 地圖封裝在 MapFragment 類別中。
3. 由於地圖封裝在 MapFragment 類別中,你可以延伸標準的 Activity,而不是切換 MapActivity。
4.使用vector tiles技術可以使地圖顯示得更快,頻寬使用的更少。
5.Caching 比較少,所以看到的地圖空白區域會更少。
6.可以顯示3D及透視(室內)地圖。

另外需要注意的地方是在Introduction to the Google Maps Android API v2官網中有個Attribution Requirements項目,這部分要求在寫App程式中如果有使用到 Google Maps Android API你比需要寫一個Menu或是在"關於"內容中法律聲明。

實作環境:
Win7 SP1 / Win8專業版
Java 1.6.0_37
Eclipse 3.7.2
ADT 21.1.0
asus nexus 7 (android 4.2.2)

以下是實作步驟:
開發環境初始設定:

1. 打開SDK中的SDK Manager,找到Extras並安裝Android Support Library及 Google Play Services兩個項目。

2. 打開Eclipse匯入Google Play Services函式庫。
開啟 File --> Import --> Android --> Existing Android Code Into Workspace --> Next

接著用Browse選擇上一個步驟所安裝的Google Play Services函式庫路徑: "路徑\android-sdk-windows\extras\google\google_play_services\libproject\google-play-services_lib"
這時你會看到中間 Project裡面有個新的專案名稱為google-play-services_lib
如果你要將這個函式庫拷貝到Eclipse的Workspace的話就將 copy project into workspace打勾
接著按下Finish

3.這時你可能會看到在Eclipse Console 出現Unable to resolve target 'android-8',解決的方法是在該專案名稱前按下滑鼠右鍵-->Properties-->Android 在Project Build Target勾選你有安裝的項目。


這樣就完成匯入Google Play Services函式庫了。google-play-services_lib這個函式庫我們不用修改任何地方,只要將該專案Open,然後讓你的程式當成Library去呼叫使用。

申請 Map API Key:
1. 首先必須要申請一個Google帳號,然後到  Google APIs Console 網頁按下 Create project... 建立一個專案。(選擇返回舊版介面)

2.接著選擇畫面左邊的 Services 找到Google Maps Android API v2項目並將右邊的開關選項ON起來。

3. 接著打開Windows 的命令列,輸入: keytool -list -v -keystore "C:\Users\用戶名稱\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android 指令取得 Key
其中,debug.keystore所在位置查詢方法: 打開Eclipse --> Windows --> Preferences --> Android -->Build 在這個畫面中的 Default debug keystore項目中可以查到路徑。


4.上圖中,我們將SHA1:後面的一串字碼拷貝起來。然後到 Google APIs Console 網頁選擇左邊的API Access項目,接著選擇 Create new Android key...
接著會彈跳出一個 Configure Android Key for API Project的畫面,我們將剛剛複製的SHA1:後面的一串字碼貼在中間的框框內,然後輸入分號";"後面接著要開發的Android App專案名稱。


接著按下 Create 後Google APIs Console 頁面會多出個 Android專用的 API key。

此時,我們記下這組API key,讓接下來所要寫的程式使用它。

撰寫程式:
1. 開啟新專案:

其中需要注意的是 Package Name需跟前面申請的名稱一樣

2.將前面所述的google-play-services_lib加入到函式庫中,在專案剛建立的專案名稱按下滑鼠右鍵-->Properties-->Android 在 Library 按下 Add 選擇 google-play-services_lib 然後按下OK,接著確認Library框框中的勾勾是綠色的。



3.開啟AndroidManifest.xml 首先加入權限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<!-- The following two permissions are not required to use
     Google Maps Android API v2, but are recommended. -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>


接著如果使用OpenGL ES version 2來顯示在 中加入:

<uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>


然後在 </application>上面輸入API key:

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="輸入你所申請到的API Key" />
<meta-data
           android:name="com.google.android.gms.version“
           android:value="@integer/google_play_services_version" />



4. 開啟 res --> layout 中的 main.xml 定義一個名稱為map的MapFragment。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment" />

</RelativeLayout>


5. 開啟  MainActivity 程式內容如下:


package edu.nkut.hellomap;

import android.app.Activity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends Activity {
    static final LatLng NKUT = new LatLng(23.979548, 120.696745);
    private GoogleMap map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        Marker nkut = map.addMarker(new MarkerOptions().position(NKUT).title("南開科技大學").snippet("數位生活創意系"));

        // Move the camera instantly to NKUT with a zoom of 16.
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(NKUT, 16));
    }
}


執行結果:

執行結果必須在實際Android設備上執行,至目前為止模擬器上無法執行是正常的,主要是因為模擬器上並沒有Google Play商店、Google Play服務及地圖。

後記:
使用Google Maps Android API v2開發Android地圖應用程式確實比起v1版本多了些許步驟,加上使用了 MapFragment 類別看來還得要花點時間來適應新的寫法。
在 "路徑\android-sdk-windows\extras\google\google_play_services\samples\maps"中有官方所提供的範例可以參考,不過同樣確認的是不能再模擬器上面執行。





========= 04/30 補充說明 =========
如果使用SDK模擬器執行Google Maps Android API v2請參考友站(南開另一位老師經營):

Android程式設計 - 使用模擬器測試Google Maps API v2

執行結果:


========= 05/15 補充說明 =========
Android 4.X App開發教戰手冊修訂2版 作者:黃彬華 的教學。該YouTube有六個教學:
http://www.youtube.com/watch?v=nDnG3OiazXI&list=PLst_JE7uVIPUYE2EMG_8eboNgr4rX9WXg


========= 09/03 補充說明 =========
在新版的ADT 22.0.5中已經可以直接在Eclipse取得SHA1的Key,直接複製到Google APIs Console 網頁就可以申請Map Key了。
另外,下面網址中有很多不錯的Google Maps Android API v2應用,有興趣的同學可以參考一下:
http://goo.gl/OlHvt
==========================================


參考:
1.Google Maps Android API v2
https://developers.google.com/maps/documentation/android/

2. Google Play Services
http://developer.android.com/google/play-services/index.html

3.Introduction to the Google Maps Android API v2
https://developers.google.com/maps/documentation/android/intro

4.Google APIs Console
https://code.google.com/apis/console/?noredirect

5.keytool
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html

6.Getting Started
https://developers.google.com/maps/documentation/android/start#installing_the_google_maps_android_v2_api

7.Android程式設計 - 使用模擬器測試Google Maps API v2
http://nkeegamedev.blogspot.tw/2012/12/android-google-maps-api-v2.html

8.GPS and Google Map in Android Applications – Series
http://wptrafficanalyzer.in/blog/gps-and-google-map-in-android-applications-series/
==============延伸閱讀=====================
1. Google Maps Android API v2-- Android 新版地圖導航路徑開發方法
http://www.cheng-min-i-taiwan.blogspot.tw/2013/09/google-maps-android-api-v2-android.html#more

122 則留言:

  1. 老師您好~

    想請問一下

    MAP 在實機上無法顯示地圖

    回覆刪除
    回覆
    1. 通常我遇到這個情況是API Key輸入錯誤,或放錯地方,新版的Key要放在AndroidManifest.xml中,跟舊版放在MAP View中不同。

      刪除
  2. 老師您好 我想請問一下
    map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
    會出現
    Call requires API level 11 (current min is 8): android.app.Activity#getFragmentManager
    我是用android 4.0.3 API 15 作為開發 請問一下該怎麼解決 !?

    回覆刪除
    回覆
    1. 看來有可能是Project Build Target選到3.0版以前的版本,由於這個版本用到Fragment,需要API level 11以上,請在專案用滑鼠按右鍵-->內容-->Android,卻認一下Project Build Target把Android 4.0.3打勾,如果沒有選項則在SDK Manager中安裝試試看。

      刪除
    2. AndroidManifest.xml
      這邊最小版本要11

      刪除
  3. 老師您好
    我也和上面那位同學一樣的困擾
    我也確定版本為API level 11以上
    但是一樣出現底線 ((有錯誤的警示
    是否能幫我解惑呢
    謝謝您

    回覆刪除
    回覆
    1. 我做這篇的環境:
      Win7 SP1 pro
      Java JDK 1.6.0_35 (如果Eclipse使用3.7.2建議使用Java 1.6.x版比較不會有問題)
      Eclipse 3.7.2
      ADT 最新版
      ASUS nexus 7 (Android裝置建議用3.x版以上的版本)
      模擬器 4.0.3
      上述環境是沒有問題的,要不要參考我的環境試試看。

      刪除
  4. 另外,要匯入Google Play Services,文章中申請API Key上面有提到.....(再確認一下!)

    回覆刪除
  5. 谢谢老师。。不过怎么在我上面显示是繁体字呢,看起来别扭.....

    回覆刪除
  6. 呃呃,不好意思,,我愚昧了。南開大學是在臺灣,我這邊是大陸....

    回覆刪除
  7. 老師您好
    請問MainActivity是完整的程式碼嗎?

    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
    Marker nkut = map.addMarker(new MarkerOptions().position(NKUT).title("南開科技大學").snippet("數位生活創意系"));

    這個部分不太會處理

    回覆刪除
    回覆
    1. 是的,程式碼是一字不差完整的。

      刪除
  8. 您好,我想要在API 10與8,來開發google mpas,

    但您提供的程式,部分功能需要11以上,

    想請教您我該如何修正程式?

    謝謝。

    回覆刪除
    回覆
    1. 這部分我沒有實做過,不過您可以試試看使用android-support-v4.jar
      請參考下列網址:
      http://www.gururu.tw/Android-Compatibility-Package.html

      刪除
  9. 老師好
    我只要改地方地圖就會跑不出來
    請問是哪裡有問題??

    回覆刪除
    回覆
    1. 您是說下面這行的座標嗎?
      static final LatLng NKUT = new LatLng(23.979548, 120.696745);
      我試過座標修改可以顯示地圖,所以你確認一下:
      1. NKUT的參數如果有修正過的話,確認程式後面的NKUT參數一併修正。
      2.座標取得用Google MAP上的為主,如果座標來源是GPS取得要加減一些參數才會正確。

      刪除
  10. 老師你好 如果想要標記幾個點 要怎麼做到呢?

    回覆刪除
    回覆
    1. 你可以增加如同14,23行的程式碼即可。
      另外你可以參考吳老師網站關於Google Map部分:http://nkeegamedev.blogspot.tw/

      刪除
  11. 老師你好 我有用成功這個範例
    但是我的fragment 不是全螢幕的
    上下左右都會留點邊邊 我的Layout是 RelativeLayout
    請問怎麼讓他變全螢幕呢??

    回覆刪除
    回覆
    1. 老師 我的問題跟二樓一樣
      我是用API17的 所以應該沒問題
      但是 map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
      (這行的錯誤是 Call requires API level 11 (current min is 8): android.app.FragmentManager#findFragmentById

      不知道還要修改哪? ( 有匯入 Google Play Services

      刪除
    2. 試試看用滑鼠在專案名稱按下右鍵--> Android Tools --> Clear Lint Markers

      刪除
    3. 回上面問的"全螢幕"問題,我這邊試的結果如同文章結圖所示,文章內容有Layout你試試看。

      刪除
  12. 余老師您好:
    我試著使用您提供的範例, 但在import的部分就出現錯誤
    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.MapFragment;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.Marker;
    import com.google.android.gms.maps.model.MarkerOptions;
    以上這幾行都會出現要我"create class 'CameraUpdateFactory' in package 'com.google.android.gms.maps'的訊息
    請問我該如何解決呢?謝謝回覆.

    回覆刪除
    回覆
    1. 確認一下文章內容中"2....google-play-services_lib加入到函式庫中"步驟有沒有出錯。在專案中會有google-play-services_lib及HelloMap兩個專案開啟,如圖由上往下數的第7圖示。

      刪除
  13. 余老師您好:
    前一個問題在我執行Project Clean之後已解決,
    但出現了新的問題,
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(nkut, 16));
    這一行的newLatLngZoom有一個錯誤訊息:
    The method newLatLngZoom(LatLng, float) in the type CameraUpdateFactory is not applicable for the arguments (Marker, int)
    請問我該如何解決呢?謝謝回覆.

    回覆刪除
    回覆
    1. 你先確認一下nkut這個參數,有沒有跟程式中static final LatLng NKUT = new LatLng(23.979548, 120.696745);這行的" NKUT " 一樣?

      刪除
  14. 老師您好:
    如果要讓地圖 標示2個點
    MainActivity 程式內容
    需要如何修改 可以舉例一下嗎?

    回覆刪除
    回覆
    1. 吳老師這篇有寫了,就不重複寫再麻煩您移駕到他的部落格:
      http://nkeegamedev.blogspot.tw/2013/05/android-google-maps-api-v2_7.html

      刪除
  15. 老師你好 如果點了標記的那個點 會出現訊息框
    南開科技大學 數位生活創意系
    如果我想再點擊這個訊息框發生事件 請問要怎麼做
    意思是怎麼把這個訊息框當成onclick?

    回覆刪除
    回覆
    1. 試試看下列程式碼事件是不是你想要的功能:
      map.setOnMapClickListener(new OnMapClickListener()
      {
      @Override
      public void onMapClick(LatLng point)
      {
      //do something

      }

      });

      參考:http://goo.gl/sa2ao

      刪除
  16. 老師,我在中國大陸做開發,自己的demo運行打的Log有錯誤,先是
    “I/Google Maps Android API(29640): Failed to contact Google servers. Another attempt will be made when connectivity is established”,過一會會有如下
    “E/Google Maps Android API(29640):Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors) ”,老師可否有好的建議?

    回覆刪除
    回覆
    1. 應該是 .. Failed to contact Google servers .... 的問題,
      1.是用模擬器執行的嗎?
      2.如果是實機的話,我不知道目前中國大陸有沒有擋住Google服務,你試試看用VPN翻牆看看。

      刪除
    2. 不是模擬器執行,用了兩種真機,一種是非ROOT正常連接網路,一種是ROOT后用GAE代理,都出現相同問題,VPN我倒還沒度過,回頭我嘗試一下,還是十分感謝老師的回覆!

      刪除
    3. 老師,今天把問題解決了,應該是我的KEY有問題,重新申請了KEY之後地圖已經正常顯示了。

      刪除
  17. 老師我想請問您一下:
    我做完了您的步驟但是放在手機上
    執行的時候跑不出地圖,只有膚色框架及右下角的+-縮放箭而已
    請問我是哪裡出了問題呢

    回覆刪除
    回覆
    1. 通常我遇到這種情況都是Key不對,相同程式如果在"不同電腦上要重新申請Key"!!

      刪除
    2. key不對是只我放錯位置了還是申請的不對呢???
      我都在同意台電腦弄完程式之後再匯到手機裡面的!
      麻煩老師了0.0

      刪除
    3. 新版的Key要放在AndroidManifest.xml,你可以用Logcat查看錯誤訊息。

      刪除
    4. 老師! 真的很抱歉,因為我試了非常久,可是還是找不到問題點。









      我的key放這邊還是不對嗎@@?
      logcat裡面沒有其他訊息

      刪除
    5. 你貼的訊息沒有出現耶!?
      1.你要不要試試看重新申請Key
      2.Key放在AndroidManifest.xml中可以參考文章中圖19.20兩張內容.

      刪除
  18. 請問老師
    setContentView(R.layout.main);這行
    會發生main cannot be solved or not a field的錯誤訊息
    這要如何解決?

    回覆刪除
    回覆
    1. 試試看這篇文章的作法:
      http://goo.gl/2QRLdh

      另外用Eclipse開發程式,建議把無關緊要的專案一併close掉,可以減少關於import android.R 之類的問題出現。

      刪除
    2. 老師您好
      我並沒有把android.R import進來

      您貼的文章我看過了
      在R.java檔中片段如下:
      public static final class layout {
      public static final int activity_main=0x7f030000;
      }
      我在想會不會是我的activity_main就是您上文說的main呢?

      (我本來是有想自己在layout中加一個main,
      不過存檔會出現下面訊息問題:
      R.java was modified manually! Reverting to generated version!)

      第二個問題:
      我該如何確定我的key是否有問題?感覺不管對跟錯好像都可以執行。

      刪除
    3. 1.一般R.java會自動建立,要部你試試看把R.java刪掉,然後用project-->clean(下面的build...要打勾)重建R.java試試看。
      2.activity_main.xml or main.xml新舊版ADT所產生不同名稱又或者是寫程式的習慣,以程式onCreate中呼叫名稱為主,跟你遇到的問題應該沒有相關才對。
      3.Key驗證的部分,Google我還沒有看到Google有相關文章說明,你只要確認程式第一行的package name與你申請的一樣就沒問題了。
      4.如果你問題卡著解不掉,建議你把整個程式刪掉重新在建立專案試試看。

      刪除
  19. 請問一下老師 在執行時跳出一個視窗
    內容是: Android Library projects cannot be launched
    這是甚麼問題??

    回覆刪除
    回覆
    1. 1.你所寫的專案按滑鼠右鍵>內容>Android>右下方Library區塊>Is Library勾選取消試試看.
      2.確認匯入的google-play-services_lib專案滑鼠右鍵>內容>Android>右下方Library區塊>Is Library勾選打勾(如圖由上往下第6張)

      刪除
  20. 您好 測試Google Map v2 問題如下
    1.Android SDK Manager 全部都更新至圳新版本
    模擬器好像不支援顯示地圖,但測試會跑出
    google-play-services_lib] Could not find google-play-services_lib.apk! 錯誤訊息,用手機測試地圖會直接異常終止
    2.對專案 右鍵->property->Android->Add->Ooogle-play-service-lib 會變成綠色正常的勾勾,OK確認後
    再次查看property->Android ,綠色正常的勾勾就變成紅色叉叉錯誤
    問題有點多 煩請幫我解答 感謝您~

    回覆刪除
    回覆
    1. 1.模擬器在文章中有說明不能用!
      2.確認google-play-services_lib專案是開啟的。

      刪除
  21. 老師 這一段不太會操作
    4. 開啟 res --> layout 中的 main.xml 定義一個名稱為map的MapFragment。








    是在res檔案把這個輸入在哪 我不太會這段要怎弄 檔案要打在哪裡 感謝

    回覆刪除
  22. 老是我這行的程式錯誤 setContentView(R.layout.main);

    他說我專錯誤請修理再回復

    回覆刪除
    回覆
    1. 你是不是沒有main.xml,新的版本ADT名稱會換成activity_main.xml

      刪除
  23. 老師你好
    我想要再點擊 訊息框
    南開科技大學 數位生活創意系
    的那個訊息框加入自己的圖片 請問要怎麼做?

    回覆刪除
  24. 還有請問老師
    map.setOnMapClickListener(new OnMapClickListener()
    {
    @Override
    public void onMapClick(LatLng point)
    {
    //do something

    }

    });

    這個方式我要怎麼判斷他是點在哪一點??
    目前的判斷好像只會呈現經緯度?

    回覆刪除
  25. 老師 不好意思想請問一下要如何發佈apk檔出來?
    如果實機金鑰在別台實機上也可以使用嗎?

    回覆刪除
    回覆
    1. 要Google Play上架?還是弄進手機,如果是前者部落個之前有一篇文章可以搜尋一下,後者的話如果你的Eclipse中DDMS可以抓到手機,手機上開發者的部分有勾選,執行程式就會在手機上了。

      金鑰只跟開發的設備上及程式有關。

      刪除
  26. 老師! 我想請問一下,如果我每做一隻google地圖的程式,是否都要重新申請一組key金鑰?

    是一個Package Name 指對應一組key金鑰?

    如果是 不就每次我做一個範例都要再申請一組??

    回覆刪除
    回覆
    1. 是的,因為Package名稱不一樣,另外同一支程式如果改到其他電腦撰寫或修改,Key也是要重新申請。

      申請Key這也沒辦法,Google Map太好用了,遷就點囉^____^

      刪除
  27. 請問一下︰我按照上面的流程,我建立了一個 apk。安裝及運行沒有error,但是地圖是空白一片的。只是右下有出現平日 google map 的 + 和 - 號。

    回覆刪除
    回覆
    1. 這種情況九成是序號錯了,你可以查看看Logcat 看是否Google Service出現錯誤,重新申請一次看看!!

      刪除
  28. 老師! 想請問一下 我在GOOGLE申請了一組對應我Package名稱的KEY。

    這組KEY例如: ABC123456789 !

    Q1.我剛玩了一下 在程式裡將KEY亂改 例如上面KEY改成: 123456789ABC! 他還是能動ㄟ

    Q2.之後我又在"Google APIs Console 頁面Android專用的 API key頁面。"把我這組KEY刪了,為啥我程式還能跑出地圖?

    想請問一下老師 他這什麼原理嗎??

    回覆刪除
    回覆
    1. 1. 應該是cache的關係,你試著將地圖移到其他地方並放大縮小看看!
      2. 改Key應該是會造成Google Service問題,不然上面的Q&A就不會有地圖部出現的問題了。

      刪除
  29. 老師 我現在有很多個地址都存在EXCEL檔
    我想去把它都定位在ANDORID 首基地圖裡面
    大概需要哪些過程 麻煩老師

    回覆刪除
    回覆
    1. 1.你可以直接用程式讀取你的excel檔或者將excel轉成csv在匯入sqlite當程式的資料庫,如果資料量比較大的話我會建議以後者應該會簡單些可以參考:http://goo.gl/BECpMa 看看。
      2.Google map已經有將地址轉座標的功能,參考: http://goo.gl/e6B0U4 。
      3.接著就是將程式把步驟1的資料讀到程式轉成步驟2就行了。

      刪除
  30. 老師你好 我的地址資料大概有735筆存在csv檔裡面
    請問老師 建議是用sqlite還是當資料庫可嗎

    回覆刪除
    回覆
    1. 可以參考這份文件的說明
      http://www.cnblogs.com/kiddo/archive/2008/04/21/1163385.html

      刪除
    2. 735筆,建議存放在sqlite搭配sql語法來寫程式會比較簡單點。至少不用把全部資料載入記憶體,在搜尋時會快些而且java程式會比較好寫些。

      刪除
    3. 剛剛逛到的網站,看看是不是很接近你的需求,或許你改一下程式就可以用了。

      http://goo.gl/PHHQlG

      刪除
  31. 老師 我在網上查的資料好像大多人都是把google map寫在網頁上
    再標籤 再放到java 這樣會比較好嗎
    麻煩老師

    回覆刪除
    回覆
    1. 有點不是很明白您說的意思,你指的是用webview方式嗎?還是.....?有網頁範例嗎?

      刪除
  32. 嗨老師您好
    我照做一次獨立出來的app是可以的
    但結合project卻顯示不出來
    可以請問該如何解決嗎?

    回覆刪除
    回覆
    1. 你的project:
      1.記得程式要匯入google-play-services_lib 以及重新申請Map API Key
      2.peoject 的targetSdkVersion是看看用高一點的版本看看。

      刪除
  33. hey 老師你好~想請問您
    剛剛改了google api後面的Android apps project名稱
    金鑰活性是要在指定時間才可以啟用嗎???

    回覆刪除
    回覆
    1. 嗯!最簡單的認定方式就是程式第一行的package後面的名稱有改就要重新申請。

      刪除
  34. 老師剛以重新申請api key可是googlemap跑出來的只有放大及縮小符號
    其他畫面是空白的QAQ

    回覆刪除
  35. 嗨嗨老師不好意思右打擾你了
    剛剛有從上面問題中找到我要解答
    但想請問一下老師
    申請新key後
    為什麼Google Service會出現錯誤?

    回覆刪除
    回覆
    1. Google Service會出現錯誤,如果網路沒問題的話絕大多還是出現在key上面,我這邊申請key倒是沒有這樣的問題,你試試看照著文章中最後面那張圖擷取:

      藍色部分文字 + 一個分號";" + 程式第一行package到分號的所有字(名稱)

      我現在都是這樣做的沒有遇過Google Service會出現錯誤,你試試看不過ADT要較新版本才會有文章中的最後一張圖樣子。

      刪除
  36. 請問老師有gmail嗎?想把截圖傳給您看
    如果老師方便的話
    我重新申請的兩次api key但還是沒辦法
    也是最新版本的adt跟文章最後一張圖一樣
    不知道問題是在城市還是在key
    因為第一次做的時候是ok的

    回覆刪除
    回覆
    1. 你先借用PTT貼圖貼出來,然後把Logcat錯誤的部分貼出來,你應該可以看到 xxx.java 行號 之類的錯誤,xxx指的是你命名的檔名,通常問題是出現在這裡。

      PTT貼圖:
      http://ppt.cc/cut/

      刪除
  37. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 又修改了一次
      但錯誤和之前一樣
      http://ppt.cc/l8-P
      只是不再是error

      刪除
    2. 找到問題了嗎?
      如果還沒的話,從你錯誤的訊息看來,你確認:
      1.AndroidManifest.xml 有沒有少key到權限,見文章撰寫程式內容中第3點。
      2.網路有沒有通?(要在實機上執行,模擬器不支援ㄡ)
      3.Key;上述兩者如果沒問題就是key問題了,因為他找不到Google Service服務。

      刪除
  38. 老師老師
    我找到問題了
    發現原來package被動過
    所以com.example的名子換了
    在logcat中發現的

    感謝老師!!!!!!!!!!!!!!!!!!!!!受益良多QAQ

    回覆刪除
  39. 老師 可以在snippet這裡面輸入網址嗎
    然後讓那個網站網可以點下去連進去嗎

    回覆刪除
  40. 作者已經移除這則留言。

    回覆刪除
  41. 在地圖上畫了線addPolyline跟標點addMarker,但某時間後只想把點移掉留線,請問可以只移除marker嗎?如何做?因我只知道ap.clear()是全部清掉!謝謝!

    回覆刪除
  42. 作者已經移除這則留言。

    回覆刪除
  43. 老師您好

    想請問一下,我有大量的座標要標記,每個標記都需要有個簡單的內容
    請問要用甚麼方法比較好?
    我找了好久都找不到可以一次打上大量座標的方法。

    回覆刪除
  44. 老師您好

    想請問一下我做實機測試出來結果是一片空白地圖出不來要做什麼調整

    回覆刪除
    回覆
    1. 9成~Map Key申請錯誤,Logcat可以看到錯誤訊息。不同PC開發API Key亦要重新申請。

      刪除
  45. 老師你好 請問如果要在已有的專案 做這些事情要如何新增呢?(api key都用完了)
    還是一定要新增一個專案

    回覆刪除
    回覆
    1. 相同一個專案名稱的話只要一個Api Key即可。不同的專案名稱或不同PC開發才需要到網頁新申請key!

      刪除
  46. 老師你好 我想請問一下 我照著步驟做 可是進入模擬器點選程式後卻出現unfortunately HelloMAP has stopped 是哪一邊出錯呢?

    回覆刪除
    回覆
    1. 建議使用Android 4.x版的實體手機或平板測試,文章內文有說"模擬器"無法執行。

      刪除
  47. 老師你好 我按照你的步驟做下去,但出現了這個問題
    FragmentActivity cannot be resolved to a type
    不知道該如何解決..

    回覆刪除
    回覆
    1. 建議使用Android 4.x版的實體手機或平板測試。

      刪除
  48. 請問老師
    我在網路上試過各種方法包括您的方法
    我確定我程式碼沒有問題,也沒有任何紅字(error)
    但執行時卻顯示"很抱歉, MyMap已停止"
    請問這是什麼原因呢?

    回覆刪除
  49. 回覆
    1. 我只有照上面第三點 3.開啟AndroidManifest.xml 加入權限
      您說的檢查權限是要另外開啟嗎? 要如何開啟?

      刪除
    2. 請參考:http://joeshua.pixnet.net/blog/post/37037485-android-%E6%AC%8A%E9%99%90%E8%A8%AD%E5%AE%9A

      刪除
    3. 那要加入哪一行權限才能解決這個問題呢??
      我在另一個網站看到
      有多加這兩行權限


      但問題還是一樣
      不知道是不是layout中fragment的問題?

      刪除
  50. 照了這篇文實作在android 4.1.1 HTC One S
    節省了很多時間 不過
    程式在res --> layout --> main.xml 一開始放 fragment就會當掉

    後來在Manifest.xml加入
    - < meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />
    解決這個問題
    分享給各位

    回覆刪除
  51. 請問老師
    我都您照的步驟設定,最後在main.xml 畫面卻出現
    pick preview layout from the" fragment layout" context menu

    請問這是什麼沒設定好?

    回覆刪除
    回覆
    1. 新版的程式會自動帶出Menu的Class,如果沒有用到把它拿掉試試看。

      刪除
  52. 您好

    使用您本篇的 layout/main.xml 與 main.java

    可以編譯

    不過執行會失敗

    根據logcaty資訊

    {02-24 20:09:06.537: E/AndroidRuntime(1726): java.lang.RuntimeException: Unable to start activity ComponentInfo{XXXX.Main}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment}

    推測是 layout內使用fragment

    可是main.java內沒有用fragment ?

    是否需要改為

    http://stackoverflow.com/questions/20043511/android-view-inflateexception-binary-xml-file-line-2-error-inflating-class-fr

    [ public class MainActivity extends FragmentActivity {.....]

    謝謝


    回覆刪除
    回覆
    1. Google Maps Android API v2在官網中的確是有說明到地圖封裝在 MapFragment 類別中這是Google改v2最大一點的改變,所以main.java不用extends FragmentActivity相關撰寫,大致上使用在Android 3.x版以上是沒問題的。
      如果您的裝置是2.x版的可以參考:http://goo.gl/SR6mPW

      刪除
  53. 你好

    下午找到問題

    後續的問題

    提問再另外一篇內

    http://goo.gl/4MJFaj

    謝謝

    回覆刪除
  54. 你好 請問第三步會出現KEYTOOL不是內部或外部命令是哪裡出問題了前面都能進行

    回覆刪除
  55. 老師你好, 最後我跳出的錯誤訊息為 Google Maps Android API v2 only supports devices with OpenGL ES 2.0 and above ,麻煩老師幫我解答 謝謝

    回覆刪除
  56. 老師您好 GOOGLE Maps android api v2 only supports devices with opengl es 2.0 and above 我出現了此錯誤訊息 希望老師能幫我解答謝謝

    回覆刪除
  57. 請問老師 我在Layout 畫面中顯示 pick preview layout from the" fragment layout" context menu
    之後再 choose layout 之下選擇本身的layout 顯示 cyclic include not valid
    不太懂 新版的程式會自動帶出Menu的Class,如果沒有用到把它拿掉試試看。甚麼意思

    回覆刪除
    回覆
    1. 請在 AndroidManifest.xml中增加:
      <meta-data
      android:name="com.google.android.gms.version“
      android:value="@integer/google_play_services_version" />

      刪除
  58. 老師您好,
    請問 我在測試時都是ok,用usb實機測試時也是正常,但是發佈成apk,用apk安裝執行後,地圖就出不來了,是api key的關係嗎?

    回覆刪除
  59. 老師 如何按下button 之後 跳到其他的Activity 使用其他的XML 來顯示 google map?

    回覆刪除
  60. 老師不好意思:

    想請問一下老師,有辦法將Camera在一進入程式的時候
    移動到使用者目前的位置嗎??


    我目前有加一個我的位置定位共能
    map.setMyLocationEnabled(true);
    畫面上也可以WORK

    不知道是否可透過您原本寫的這個方法,改寫成移動到使用者的位置上
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(NKUT, 16));

    或者是可以程式自動幫點擊定位的按鈕?

    回覆刪除
  61. 老師 地圖是整個空白
    出現了
    Could not find class 'gpq', referenced from method gpr.a

    Could not find class 'com.google.android.gms.location.internal.ParcelableGeofence', referenced from method gls.a

    Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors).

    回覆刪除
    回覆
    1. 我都遇上這個問題 , 是 fragment 問題 ,
      fragment 轉至 activity 就會遇到 ,
      可能因為 fragment 和 map 都係用 fragment 關係

      刪除
  62. 老師您好:

    打擾了,我想請問一下,如果我googlemap的目前位置的藍點,走到某個目標點附近可以偵測到目標點並顯示出他的名稱嗎??

    感謝

    回覆刪除
  63. 老師你好
    我想請問一下
    我的專案都是跟著老師跑的
    也沒有任何的錯誤訊息
    可是連接手機後卻直接出現ERROR
    照道理說錯誤不是應該會至少有程式介面的畫面
    然後地圖部分因為錯誤所以是空白的
    但我跑出來就是直接錯誤
    然後彈回手機桌面
    想請問老師這是什麼問題嗎
    感謝:))

    回覆刪除
  64. 老師您好:

    我在網路上試過各種方法包括您的方法
    我確定我程式碼沒有問題,也沒有任何紅字(error)
    但執行時卻顯示"很抱歉, HelloMap已停止" 並且跳回桌面
    請問這是什麼原因呢?

    回覆刪除
  65. 老師您好
    我照您的方法打,但程式執行是閃退無法執行...

    回覆刪除
  66. 老師你好!!
    所有GOOGLE API KEY和SHA1
    我都設了
    但是疑似引用了
    goolge-play-serverice-lib後出現這錯誤

    Description Resource Path Location Type
    error: Error retrieving parent for item: No resource found that matches the given name '@android:style/Theme.Material.Light.DialogWhenLarge.NoActionBar'. appinvite_styles.xml /google-play-services_lib/res/values-v21 line 5 Android AAPT Problem
    The container 'Android Dependencies' references non existing library 'D:\Ecipse Workspace\google-play-services_lib\bin\google-play-services_lib.jar' GMapSample2 Build path Build Path Problem
    The project cannot be built until build path errors are resolved GMapSample2 Unknown Java Problem
    Unknown error: org.eclipse.core.runtime.OperationCanceledException testGmap Unknown Android Packaging Problem


    一直找不到原因
    請問為什麼 謝謝

    回覆刪除