2 1 Android Google Maps Android API https

  • Slides: 42
Download presentation

靜宜大學資管系 楊子青 2 1. 新增地圖到Android應用程式 • Google Maps Android API 開始使用 – https: //developers.

靜宜大學資管系 楊子青 2 1. 新增地圖到Android應用程式 • Google Maps Android API 開始使用 – https: //developers. google. com/maps/documentation/an droid-api/start • • 步驟 1. 下載 Android Studio 步驟 2. 安裝 Google Play Services SDK 步驟 3. 建立「Google 地圖」專案 步驟 4. 取得 Google Maps API 金鑰 步驟 5. Hello Map! 看看這段程式碼 步驟 6. 連接 Android 裝置 步驟 7. 建置並執行您的應用程式

靜宜大學資管系 楊子青 12 Hello Map! 看看這段程式碼 • 檢視一下Maps. Activity. java程式碼 public class Maps. Activity

靜宜大學資管系 楊子青 12 Hello Map! 看看這段程式碼 • 檢視一下Maps. Activity. java程式碼 public class Maps. Activity extends Fragment. Activity implements On. Map. Ready. Callback { private Google. Map m. Map; @Override protected void on. Create(Bundle saved. Instance. State) { super. on. Create(saved. Instance. State); set. Content. View(R. layout. activity_maps); // Obtain the Support. Map. Fragment and get notified when the map is ready to be used. Support. Map. Fragment map. Fragment = (Support. Map. Fragment) get. Support. Fragment. Manager(). find. Fragment. By. Id(R. id. map); map. Fragment. get. Map. Async(this); }

靜宜大學資管系 楊子青 13 Hello Map! 看看這段程式碼 • 檢視一下Maps. Activity. java程式碼 @Override public void on.

靜宜大學資管系 楊子青 13 Hello Map! 看看這段程式碼 • 檢視一下Maps. Activity. java程式碼 @Override public void on. Map. Ready(Google. Map google. Map) { m. Map = google. Map; Latitude 緯度 Longitude 經度 // Add a marker in Sydney and move the camera Lat. Lng sydney = new Lat. Lng(-34, 151); 加入 m. Map. add. Marker(new Marker. Options(). position(sydney). title("Marker in 標記 Sydney")); m. Map. move. Camera(Camera. Update. Factory. new. Lat. Lng(sydney)); } 移動相機鏡頭,可參考: https: //developers. google. com/maps/documentation/androidapi/views? hl=zh-tw

靜宜大學資管系 楊子青 16 將地圖起點設為高美濕地 @Override public void on. Map. Ready(Google. Map google. Map) {

靜宜大學資管系 楊子青 16 將地圖起點設為高美濕地 @Override public void on. Map. Ready(Google. Map google. Map) { m. Map = google. Map; // Add a marker in Sydney and move the camera //Lat. Lng sydney = new Lat. Lng(-34, 151); //m. Map. add. Marker(new Marker. Options(). position(sydney). title("Marker in Sydney")); //m. Map. move. Camera(Camera. Update. Factory. new. Lat. Lng(sydney)); Lat. Lng gaomei = new Lat. Lng(24. 296054, 120. 5449059); m. Map. move. Camera(Camera. Update. Factory. new. Lat. Lng. Zoom(gaomei, 15)); m. Map. add. Marker(new Marker. Options() 縮放層級. title("高美濕地"). snippet("美麗的觀落日景點"). icon(Bitmap. Descriptor. Factory. from. Resource(R. mipmap. ic_launcher)). position(gaomei)); } 標記,可參考: https: //developers. google. com/maps/documentation/androidapi/marker? hl=zh-tw

靜宜大學資管系 楊子青 21 on. My. Location. Button. Click方法 public boolean on. My. Location. Button.

靜宜大學資管系 楊子青 21 on. My. Location. Button. Click方法 public boolean on. My. Location. Button. Click() { Toast. make. Text(this, "鏡頭轉至目前位置", Toast. LENGTH_SHORT). show(); // Return false so that we don't consume the event and the default behavior still occurs // 直接讓鏡頭轉至使用者目前位置 return false; }

靜宜大學資管系 楊子青 22 on. Map. Ready方法 public void on. Map. Ready(Google. Map google. Map)

靜宜大學資管系 楊子青 22 on. Map. Ready方法 public void on. Map. Ready(Google. Map google. Map) { m. Map = google. Map; …… m. Map. set. On. My. Location. Button. Click. Listener(this); enable. My. Location(); } 加入一個class的屬性 private static final int REQUEST_FINE_LOCATION_PERMISSION = 102;

靜宜大學資管系 楊子青 23 enable. My. Location方法 (詢問開啟權限) private void enable. My. Location() { if

靜宜大學資管系 楊子青 23 enable. My. Location方法 (詢問開啟權限) private void enable. My. Location() { if (Context. Compat. check. Self. Permission(this, android. Manifest. permission. ACCESS_FINE_LOCATION) != Package. Manager. PERMISSION_GRANTED) { // Permission to access the location is missing. 詢問使用者開啟權限 // 如果裝置版本是 6. 0(包含)以上 if (Build. VERSION. SDK_INT >= Build. VERSION_CODES. M) { // 取得授權狀態,參數是請求授權的名稱 int has. Permission = check. Self. Permission(android. Manifest. permission. ACCESS_FINE_LOCATION); // 如果未授權,向使用者請求 if (has. Permission != Package. Manager. PERMISSION_GRANTED) { // 請求授權 // 第一個參數是請求授權的名稱,第二個參數是請求代碼 request. Permissions( new String[]{android. Manifest. permission. ACCESS_FINE_LOCATION}, REQUEST_FINE_LOCATION_PERMISSION); } } } else if (m. Map != null) { // 在地圖上啟用「我的位置」圖層 m. Map. set. My. Location. Enabled(true); } }

靜宜大學資管系 楊子青 24 on. Request. Permissions. Result方法 (處理使用者是否允許開啟權限) public void on. Request. Permissions. Result(int

靜宜大學資管系 楊子青 24 on. Request. Permissions. Result方法 (處理使用者是否允許開啟權限) public void on. Request. Permissions. Result(int request. Code, String[] permissions, int[] grant. Results) { { if (request. Code == REQUEST_FINE_LOCATION_PERMISSION) { if (permissions. length > 0 && grant. Results[0] == Package. Manager. PERMISSION_GRANTED) enable. My. Location(); } else { // Permission was denied. Display an error message. Toast. make. Text(this, "需允許位置資訊授權,n才能顯示位置圖層", Toast. LENGTH_SHORT). show(); } } }

靜宜大學資管系 楊子青 28 3. 隨時更新目前位置及其經緯度 加上Location. Listener監聽介面,以及 Location. Manager物件 public class Maps. Activity extends

靜宜大學資管系 楊子青 28 3. 隨時更新目前位置及其經緯度 加上Location. Listener監聽介面,以及 Location. Manager物件 public class Maps. Activity extends Fragment. Activity implements On. Map. Ready. Callback, Google. Map. On. My. Location. Button. Click. Listener, android. location. Listener{ private Google. Map m. Map; private static final int REQUEST_FINE_LOCATION_PERMISSION = 102; Location. Manager location. Manager;

靜宜大學資管系 楊子青 29 實做Location. Listener四方法 @Override public void on. Location. Changed(Location location) { }

靜宜大學資管系 楊子青 29 實做Location. Listener四方法 @Override public void on. Location. Changed(Location location) { } @Override public void on. Status. Changed(String provider, int status, Bundle extras) { } @Override public void on. Provider. Enabled(String provider) { } @Override public void on. Provider. Disabled(String provider) { }

靜宜大學資管系 楊子青 30 修改enable. My. Location方法 Location Services,可參考: private void enable. My. Location() {

靜宜大學資管系 楊子青 30 修改enable. My. Location方法 Location Services,可參考: private void enable. My. Location() { … https: //developer. android. com/guide/topics/location/i ndex. html#location } else if (m. Map != null) { // 在地圖上啟用「我的位置」圖層 m. Map. set. My. Location. Enabled(true); 取得系統服務 location. Manager = (Location. Manager) get. System. Service(Context. LOCATION_SERVICE); location. Manager. request. Location. Updates(Location. Manager. GPS_PROVIDER, 2000, 1, this); } } 最小間隔時間 (1/1000秒) 最小距離 (公尺) 對應註冊的 監聽事件

靜宜大學資管系 楊子青 31 on. Location. Changed方法 當位置座標改變時 public void on. Location. Changed(Location location) {

靜宜大學資管系 楊子青 31 on. Location. Changed方法 當位置座標改變時 public void on. Location. Changed(Location location) { if (location != null){ String msg = "緯度:" + location. get. Latitude() + "n經度:" + location. get. Longitude(); Toast. make. Text(this, msg, Toast. LENGTH_SHORT). show(); Lat. Lng User. Place = new Lat. Lng(location. get. Latitude(), location. get. Longitude()); Camera. Position camera. Position = new Camera. Position. Builder(). target(User. Place). zoom(m. Map. get. Camera. Position(). zoom). bearing(location. get. Bearing()). build(); // 使用動畫的效果移動地圖 m. Map. animate. Camera(Camera. Update. Factory. new. Camera. Position(camera. Position)); } else{ Toast. make. Text(this, "無法取得定位資訊", Toast. LENGTH_SHORT). show(); } }

靜宜大學資管系 楊子青 32 on. Provider. Enabled與 on. Provider. Disabled方法 當服務提供商可提供服務時 public void on. Provider.

靜宜大學資管系 楊子青 32 on. Provider. Enabled與 on. Provider. Disabled方法 當服務提供商可提供服務時 public void on. Provider. Enabled(String provider) { Toast. make. Text(get. Base. Context(), "GPS已經開啟", Toast. LENGTH_SHORT). show(); } 當服務提供商失效時 public void on. Provider. Disabled(String provider) { Intent intent = new Intent(Settings. ACTION_LOCATION_SOURCE_SETTINGS); start. Activity(intent); Toast. make. Text(get. Base. Context(), "GPS已關閉", Toast. LENGTH_SHORT). show(); } 開啟位置設定畫面

靜宜大學資管系 楊子青 35 4. Activity's Life Cycle

靜宜大學資管系 楊子青 35 4. Activity's Life Cycle

靜宜大學資管系 楊子青 36 切換到其他應用程式,停止位置監聽 on. Pause (暫停目前活動時呼叫) @Override public void on. Pause() { super.

靜宜大學資管系 楊子青 36 切換到其他應用程式,停止位置監聽 on. Pause (暫停目前活動時呼叫) @Override public void on. Pause() { super. on. Pause(); // 如果裝置版本是 6. 0(包含)以上 if (Build. VERSION. SDK_INT >= Build. VERSION_CODES. M) { // 取得授權狀態,參數是請求授權的名稱 int has. Permission = check. Self. Permission(android. Manifest. permission. ACCESS_FINE_LOCATION); // 如果已授權,關掉更新 if (has. Permission == Package. Manager. PERMISSION_GRANTED) { location. Manager. remove. Updates(this); } } else{ location. Manager. remove. Updates(this); } }

靜宜大學資管系 楊子青 37 切回原應用程式,繼續位置監聽 on. Resume (與使用者互動時呼叫) @Override public void on. Resume(){ super. on.

靜宜大學資管系 楊子青 37 切回原應用程式,繼續位置監聽 on. Resume (與使用者互動時呼叫) @Override public void on. Resume(){ super. on. Resume(); // 如果裝置版本是 6. 0(包含)以上 if (Build. VERSION. SDK_INT >= Build. VERSION_CODES. M) { // 取得授權狀態,參數是請求授權的名稱 int has. Permission = check. Self. Permission(android. Manifest. permission. ACCESS_FINE_LOCATION); // 如果已授權,處理我的位置圖層 if (has. Permission == Package. Manager. PERMISSION_GRANTED) { enable. My. Location(); //處理我的位置圖層 } } else { enable. My. Location(); //處理我的位置圖層 } }

靜宜大學資管系 楊子青 38 強制螢幕為直向 Android. Manifest. xml … u=; <activity android: name=". Maps. Activity"

靜宜大學資管系 楊子青 38 強制螢幕為直向 Android. Manifest. xml … u=; <activity android: name=". Maps. Activity" android: screen. Orientation="portrait" android: label="@string/title_activity_maps"> …

靜宜大學資管系 楊子青 40 on. Map. Ready方法 • 加入第 2個標記,並將地圖註冊監聽事件 … Lat. Lng tcyang =

靜宜大學資管系 楊子青 40 on. Map. Ready方法 • 加入第 2個標記,並將地圖註冊監聽事件 … Lat. Lng tcyang = new Lat. Lng(24. 226695, 120. 5834667); m. Map. add. Marker(new Marker. Options(). title("主顧 579"). snippet("子青老師研究室"). icon(Bitmap. Descriptor. Factory. from. Resource(R. mipmap. ic_launcher)). position(tcyang)); m. Map. set. On. Info. Window. Click. Listener(this);

靜宜大學資管系 楊子青 41 on. Info. Window. Click方法 @Override public void on. Info. Window. Click(Marker

靜宜大學資管系 楊子青 41 on. Info. Window. Click方法 @Override public void on. Info. Window. Click(Marker marker) { Intent it = new Intent(); it. set. Action(Intent. ACTION_VIEW); if (marker. get. Title(). equals. Ignore. Case("高美濕地")){ it. set. Data(Uri. parse("http: //www. gaomei. com. tw/")); } else if (marker. get. Title(). equals. Ignore. Case("主顧 579")){ it. set. Data(Uri. parse("http: //www 1. pu. edu. tw/~tcyang")); } start. Activity(it); }