位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖.

Slides:



Advertisements
Similar presentations
第四章 类、对象和接口.
Advertisements

3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
第二章 JAVA语言基础.
Google App Engine Google 應用服務引擎.
Android + Web Service 建國科技大學 資管系 饒瑞佶 2017/3 V1.
期末專題報告 MyPosition - 我在何處報你知 組員:曾哲浩 蔡承翰 指導老師:陳朝鈞.
Android App 系統開發教學 Luna 陳雯琳 2014/12/18
建立Android新專案 建國科技大學 資管系 饒瑞佶 2010/10.
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
實驗四:單位轉換程式.
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
實驗十三:顯示目前經緯度位置.
Ch06 再談選單元件 物件導向系統實務.
使用Android控制Arduino 史先强
第10章 App微信分享的实现 倚动实验室.
第11章 Android GPS位置服务与地图编程
第9章 位置服务与地图应用.
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Ch5 Android應用程式的主要組成.
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
Android Intent 建國科技大學 資管系 饒瑞佶 2011/1.
Chapter 6 進階UI設計.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
第4章 Android生命周期.
第9章 使用意圖啟動活動與內建應用程式 9-1 意圖的基礎 9-2 使用意圖啟動活動
开发Eclipse插件的基本步骤 插件通过添加到预定义的扩展点来向平台添加功能。要将程序代码变成插件,需要: 决定插件如何与平台集成
ANDROID PROGRAMMING2.
程式設計實作.
Android + Service 建國科技大學 資管系 饒瑞佶.
實驗十四:顯示與控制地圖.
第2讲 移动应用开发基础知识(二) 宋婕
建立Android新專案 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
第8章 Service解析.
手機的頁面轉換與資料傳遞.
Android 视频教程简介.
Embed Google Map 資二乙 1號 王思洋.
Ch02-基礎語法.
第10章 GPS位置服务与地图编程.
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
Android Application Component
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
實驗十五:標記目前位置.
Java變數 2014/6/24.
Chapter 5 Basic UI Design.
實驗九:延續實驗八, 製作一個完整音樂播放器
Location Based Services - LBS
補間動畫 (Tween Animation) 靜宜大學資管系 楊子青
第二章 Java语法基础.
Review 1~3.
實驗十六:匯出APK安裝檔與軟體上架.
第二章 Java基本语法 讲师:复凡.
Android Speech To Text(STT)
辅导课程十二.
用Intent啟動程式中的其他Activity、運用WebView顯示網頁 靜宜大學資管系 楊子青
第2章 Java语言基础.
第9章 BroadcastReceiver的使用
Android进程间通讯.
Web前端开发 第21章:地理定位 阮晓龙 / 河南中医药大学管理科学与工程学科
加速感測器 靜宜大學資管系 楊子青.
第二章 Java基础语法 北京传智播客教育
Part 8 Broadcast Receiver、Service和App Widget
Summary
Presentation transcript:

位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖

定位 首先講解如何使用定位的方法

定位 Global Positioning System(GPS) 網路 精確度較高 只能在戶外 透過基地台或其它網路方式定位 精確度較低 誤差範圍為5~10公尺 只能在戶外 網路 透過基地台或其它網路方式定位 精確度較低 誤差範圍為數十公尺到數百公尺 可在室內/室外 手機定位方式目前主要透過Global Positioning System (GPS)定位和基地台網路定位兩種方式: 1.GPS:GPS定位使用在地球上空軌道的24顆衛星發射訊號的時間和地理座標位置,利用三角定位的方式計算出手機目前的位置,誤差範圍為5~10公尺,所以較於基地台定位較為準確。但是,當使用者在室內的時候無法接收到GPS的地位。 2.網路:當手機可以接收到電信業者的訊號就可以透過基地台定位的方式將目前的位置計算出來,不過相對於GPS定位誤差範圍為數十公尺到數百公尺都有可能,誤差的範圍相對來講比較大。

新增uses-permission AndroidManifest.xml 網路定位 GPS定位/網路定位 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package=“tw.edu.ncu.ce.bnlab.gpsex" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".GpsEX" <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 網路定位 GPS定位/網路定位 若在應用程式中需要使用定位功能必須在專案的AndroidManifest.xml檔案中,加入uses-permission android.permission.ACCESS_COARSE_LOCATION允許使用網路定位的方式 android.permission.ACCESS_FINE_LOCATION允許使用GPS和網路定位的方式

程式中開啟Android系統定位服務設定界面 使用Activity類別中的startActivity()方法 Intent intent= new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); 如果GPS衛星定位功能沒有開啟,可以使用Activity類別中的startActivity()方法,將Android系統中的設定應用程式打開到定位設定頁面,startActivity()方法須傳入Intent物件 在使此使用Intent(String action)建構子,建立Intent物件,建構子傳入的參數為動作字串,設定定位頁面的動作字串定義在Settings類別中Settings.ACTION_LOCATION_SOURCE_SETTINGS

android.provider.Settings 提供很多相關動作字串,可以在應用程式中用來開啟內建設定程式的功能頁面 如: String ACTION_ADD_ACCOUNT : 新增聯絡人 String ACTION_BLUETOOTH_SETTINGS : 設定藍牙 String ACTION_DATE_SETTINGS : 設定日期和時間 String ACTION_WIFI_SETTINGS : 顯示Wi-Fi設定 String ACTION_SOUND_SETTINGS : 顯示設定音效 String ACTION_LOCALE_SETTINGS : 設定語言環境 String ACTION_LOCATION_SOURCE_SETTINGS : 設定位置資訊服務 詳細資料參考http://developer.android.com/reference/android/provider/Settings.html android.provider.Settings提供了很多相關動作字串,可以在應用程式中用來開啟內建設定程式的功能頁面,詳細資料可以參考http://developer.android.com/reference/android/provider/Settings.html網頁 http://developer.android.com/reference/android/provider/Settings.html

Context類別 服務字串常數 方法 Object getSystemService(String name) LOCATION_SERVICE 定位服務 SENSOR_SERVICE 感測器服務 TELEPHONY_SERVICE 電話服務 VIBRATOR_SERVICE 震動服務 使用Context類別中的Object getSystemService(String name)方法可取得系統服務,參數為要取得服務的服務名稱字串 在Context類別中有定義許多服務字串常數,如: LOCATION_SERVICE 定位服務 SENSOR_SERVICE 感測器服務 TELEPHONY_SERVICE 電話服務 VIBRATOR_SERVICE … http://developer.android.com/reference/android/content/Context.html

LocationManager類別 LocationManager類別用來管理系統的定位服務 LocationManager lmgr= (LocationManager) getSystemService(Context.LOCATION_SERVICE ); 方法 boolean isProviderEnabled(String provider) 判斷是否開啟定位服務 參數provider:定位服務提供者 LocationManager.GPS_PROVIDER LocationManager.NETWORK_PROVIDER 有開啟回傳true,未開啟回傳false GPS定位 LocationManager類別用來管理系統的定位服務,需使用Context類別中的getSystemService(String name)方法取得系統定位服務的LocationManager物件,參數為定位服務字串Context.LOCATION_SERVICE 。 boolean isProviderEnabled(String provider)方法用來判斷是否開啟定位服務,其中的參數provider表示定位服務提供者,LocationManager.GPS_PROVIDER為GPS提供,LocationManager.NETWORK_PROVIDER為網路定位提供,若有開啟回傳true,未開啟回傳false。 網路定位 http://developer.android.com/reference/android/location/LocationManager.html

LocationManager 類別 Location getLastKnownLocation(String provider) 取得最後定位位置 使用GPS定位 Location loc= lmgr.getLastKnownLocation(LocationManager.GPS_PROVIDER); if(loc!=null) { Toast.makeText(this, "緯度:"+ loc.getLatitude()+ ",經度:"+ loc.getLongitude(), Toast.LENGTH_LONG).show(); } getLastKnownLocation(String provider)用來取得最後定位位置函式,此範例為將取得的Location,呼叫Location類別的getLatitude()方法取得緯度,getLongtitude()方法取得經度,並使用Toast視窗顯示出來。

LocationManager 類別 void requestLocationUpdates(String provider, long minTime, float minDistance,  LocationListener listener) 註冊位置更新事件 會在onResume()方法區塊中進行註冊 void removeUpdates(LocationListener listener) 移除位置更新事件 會在onPause()方法區塊中移除監聽事件 lmgr.removeUpdates(this); 建議最小更新延遲時間(ms) lmgr.requestLocationUpdates( LocationManager.GPS_PROVIDER, 60000, 1, this); 定位服務提供者 最短通知距離(m) requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)用來要求監聽位置更新事件,通常會在onResume()生命週期中加入 參數provider:定位服務提供者 參數minTime:建議最小更新延遲時間(ms) 參數minDistance:最短通知距離(m) removeUpdates(LocationListener listener)用來移除位置更新事件通常會在會在onPause()生命週期中加入

public class MainActivity extends Activity implements LocationListener { LocationManager lmgr; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lmgr=(LocationManager) getSystemService(Context.LOCATION_SERVICE); } protected void onResume() { lmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 1, this); super.onResume(); protected void onPause() { lmgr.removeUpdates(this); super.onPause(); public void onLocationChanged(Location location) { } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras){ } 3 實作LocationListener 1 2 新增未實作的方法(自動產生) 4 1:呼叫getSystemService(Context.LOCATION_SERVICE)取得LocationManager物件 2:程式執行時監聽接收到的位置 3:程式暫停時關閉監聽接收到的位置 將滑鼠移到requestLocationUpdates,選擇讓GPSDemoActivity實作LocationListener(implements LocationListener)以新增未實作的方法產生以下的方法 public void onLocationChanged(Location location) {} //當位置發生改變時需要呼叫的方法 public void onProviderDisabled(String provider) {} //當停用位置提供器需要呼叫的方法 public void onProviderEnabled(String provider) {} //當啟用位置提供器需要呼叫的方法 public void onStatusChanged(String provider, int status, Bundle extras) {} //當硬體狀態發生改變需要呼叫的方法 位置改變 定位功能關閉 定位功能開啟 定位狀態改變

自動判斷定位服務來源 可使用Criteria類別,依據條件自動判斷定位服務來源 耗電量(power) 精準度(accuracy) 相對位置(bearing) 速度(speed) 高度(altitude)

Criteria類別 設定定位資訊提供者的條件 Criteria c=new Criteria(); c.setPowerRequirement(Criteria.POWER_LOW); //Criteria.POWER_HIGH, Criteria.POWER_MEDIUM c.setAccuracy(Criteria.ACCURACY_COARSE); //Criteria.ACCURACY_FINE c.setBearingRequired(false); c.setSpeedRequired(false); c.setAltitudeRequired(true); c.setCostAllowed(false); 設定耗電量 設定精準度 是否提供相對位置 使用Criteria類別來設定位置提供者的條件,在定位的時候會有許多位置的提供者,可以透過Criteria類別來設定滿足條件的提供者當作作好的選擇,條件的設定包含精準度、耗電量、花費、海拔、速度和方向等條件。 詳細的API資料可以參考:http://developer.android.com/reference/android/location/Criteria.html 是否提供速度資訊 是否提供高度資訊 是否允許收費 http://developer.android.com/reference/android/location/Criteria.html

自動判斷定位服務來源 取得最佳的位置提供者 Criteria c=new Criteria(); //設定條件 不要求精準度、耗電量、 高度、速度、相對位置和 不允許花費定位 取得最佳的位置提供者 Criteria c=new Criteria(); //設定條件 String best=lmgr.getBestProvider(c, true); Location l=lmgr.getLastKnownLocation(best); 是否只使用開啟的定位服務提供者

Location 類別 Location類別為取得的定位座標 方法 float distanceTo(Location dest) double getLatitude() 取得緯度 double getLongitude() 取得經度 Location類別為取得的定位座標 詳細的API資料可以參考:http://developer.android.com/reference/android/location/Location.html http://developer.android.com/reference/android/location/Location.html

進行實驗十三,請參考實驗 首先講解如何使用定位的方法

Geocoder 類別 方法 Geocoder 類別可以從地理位置的名稱查詢到此位置的經緯度座標以及地址,也可以反查 static boolean isPresent() 判斷Android核心是否有實作此API List<Address> getFromLocation(double latitude, double longitude, int maxResults) 經緯度轉換成地址,參數maxResults為回傳幾個地址結果,建議1~5 List<Address> getFromLocationName(String locationName, int maxResults) 某個地點名稱,轉換成地址,參數maxResults為回傳幾個地址結果,建議1~5 Geocoder 類別可以從地理位置的名稱查詢到此位置的經緯度座標以及地址,也可以反查 詳細的API資料可以參考:http://developer.android.com/reference/android/location/Geocoder.html Note:要使用Geocoder 請在新增專案的Compile With 處,請選擇包含Google APIs 的SDK,才可以使用Google API 所提供的查詢地點的地址 http://developer.android.com/reference/android/location/Geocoder.html

Address 類別 Address類別用來儲存位置資訊,包含地址和經緯度等資料 方法 int getMaxAddressLineIndex() 取得地址行數的索引最大值 String getAddressLine(int index) 取得參數index索引值的行數地址 String getCountryName() 國家名稱 double getLatitude() 取得查詢的緯度 double getLongitude() 取得查詢的經度 … Address類別用來儲存Geocoder類別的方法查詢結果 詳細的API資料可以參考:http://developer.android.com/reference/android/location/Address.html http://developer.android.com/reference/android/location/Address.html

查詢地址範例 查詢結果: Geocoder geo=new Geocoder(this); try { List<Address> adr = geo.getFromLocationName("明新科技大學", 1); for(int i=0;i<adr.size();i++) Log.i("log", "緯度:"+adr.get(i).getLatitude()+ " 經度:"+adr.get(i).getLongitude()+ " 地址:"+adr.get(i).getAddressLine(0)); } catch (IOException e) { e.printStackTrace(); } 此查詢地址的範例將地點轉換成地址資訊在Log視窗印出經緯度和地址,使用Geocoder類別的getFromLocationName()方法將位置轉換成地址,Log視窗中可以看到查詢後的結果。 此範例建立專案時須選用Google API 查詢結果: 需使用Google API 緯度:24.864155 經度:120.990741 地址:304台灣新竹縣新豐鄉新興路1號

Google Map 本章節開始要講解如何使用Google Map的API

Google地圖服務

開通Google Maps Android API

開通Google Maps Android API

開通Google Maps Android API

開通Google Maps Android API

取得程式佈署的keystore認證指紋

取得程式佈署的keystore認證指紋

取得程式佈署的keystore認證指紋

建立Android 應用程式API金鑰

建立Android 應用程式API金鑰

建立Android 應用程式API金鑰

設定專案ID

建立Android 應用程式API金鑰

如何使用Google Map地圖

透過SDK Manager下載Google Play Services套件

Google Play Services 函式庫匯入到專案工作區

Google Play Services 函式庫匯入到專案工作區

專案引用google-play-services_lib函式庫

AndroidMenifest.xml中加入相關節點

AndroidMenifest.xml中加入相關節點

檢查Google Play services APIs版本

檢查Google Play services APIs版本

程式中加入地圖片段

操作地圖

GoogleMap類別與地圖設定相關方法

地圖相關設定的XML屬性

地圖相關設定的XML屬性

進行實驗十四,請參考實驗 首先講解如何使用定位的方法

GoogleMap類別

GoogleMap類別與地圖設定相關方法

CameraUpdateFactory類別常用的靜態方法

LatLng類別常用的方法和欄位

在地圖上加上標記

GoogleMap類別與標記相關方法

MarkerOptions類別常用方法

BitmapDescriptorFactory類別常用的靜態方法

Marker類別常用的方法

進行實驗十五,請參考實驗 首先講解如何使用定位的方法

Q & A 問答時間