Download presentation
Presentation is loading. Please wait.
1
位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖
2
定位 首先講解如何使用定位的方法
3
定位 Global Positioning System(GPS) 網路 精確度較高 只能在戶外 透過基地台或其它網路方式定位 精確度較低
誤差範圍為5~10公尺 只能在戶外 網路 透過基地台或其它網路方式定位 精確度較低 誤差範圍為數十公尺到數百公尺 可在室內/室外 手機定位方式目前主要透過Global Positioning System (GPS)定位和基地台網路定位兩種方式: 1.GPS:GPS定位使用在地球上空軌道的24顆衛星發射訊號的時間和地理座標位置,利用三角定位的方式計算出手機目前的位置,誤差範圍為5~10公尺,所以較於基地台定位較為準確。但是,當使用者在室內的時候無法接收到GPS的地位。 2.網路:當手機可以接收到電信業者的訊號就可以透過基地台定位的方式將目前的位置計算出來,不過相對於GPS定位誤差範圍為數十公尺到數百公尺都有可能,誤差的範圍相對來講比較大。
4
新增uses-permission AndroidManifest.xml 網路定位 GPS定位/網路定位
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns: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 > <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和網路定位的方式
5
程式中開啟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
6
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 : 設定位置資訊服務 詳細資料參考 android.provider.Settings提供了很多相關動作字串,可以在應用程式中用來開啟內建設定程式的功能頁面,詳細資料可以參考
7
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 …
8
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。 網路定位
9
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視窗顯示出來。
10
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()生命週期中加入
11
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) {} //當硬體狀態發生改變需要呼叫的方法 位置改變 定位功能關閉 定位功能開啟 定位狀態改變
12
自動判斷定位服務來源 可使用Criteria類別,依據條件自動判斷定位服務來源 耗電量(power) 精準度(accuracy)
相對位置(bearing) 速度(speed) 高度(altitude)
13
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資料可以參考: 是否提供速度資訊 是否提供高度資訊 是否允許收費
14
自動判斷定位服務來源 取得最佳的位置提供者 Criteria c=new Criteria(); //設定條件
不要求精準度、耗電量、 高度、速度、相對位置和 不允許花費定位 取得最佳的位置提供者 Criteria c=new Criteria(); //設定條件 String best=lmgr.getBestProvider(c, true); Location l=lmgr.getLastKnownLocation(best); 是否只使用開啟的定位服務提供者
15
Location 類別 Location類別為取得的定位座標 方法 float distanceTo(Location dest)
double getLatitude() 取得緯度 double getLongitude() 取得經度 Location類別為取得的定位座標 詳細的API資料可以參考:
16
進行實驗十三,請參考實驗 首先講解如何使用定位的方法
17
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資料可以參考: Note:要使用Geocoder 請在新增專案的Compile With 處,請選擇包含Google APIs 的SDK,才可以使用Google API 所提供的查詢地點的地址
18
Address 類別 Address類別用來儲存位置資訊,包含地址和經緯度等資料 方法
int getMaxAddressLineIndex() 取得地址行數的索引最大值 String getAddressLine(int index) 取得參數index索引值的行數地址 String getCountryName() 國家名稱 double getLatitude() 取得查詢的緯度 double getLongitude() 取得查詢的經度 … Address類別用來儲存Geocoder類別的方法查詢結果 詳細的API資料可以參考:
19
查詢地址範例 查詢結果: 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 緯度: 經度: 地址:304台灣新竹縣新豐鄉新興路1號
20
Google Map 本章節開始要講解如何使用Google Map的API
21
Google地圖服務
22
開通Google Maps Android API
23
開通Google Maps Android API
24
開通Google Maps Android API
25
開通Google Maps Android API
26
取得程式佈署的keystore認證指紋
27
取得程式佈署的keystore認證指紋
28
取得程式佈署的keystore認證指紋
30
建立Android 應用程式API金鑰
31
建立Android 應用程式API金鑰
32
建立Android 應用程式API金鑰
33
設定專案ID
34
建立Android 應用程式API金鑰
35
如何使用Google Map地圖
36
透過SDK Manager下載Google Play Services套件
37
Google Play Services 函式庫匯入到專案工作區
38
Google Play Services 函式庫匯入到專案工作區
39
專案引用google-play-services_lib函式庫
40
AndroidMenifest.xml中加入相關節點
41
AndroidMenifest.xml中加入相關節點
42
檢查Google Play services APIs版本
43
檢查Google Play services APIs版本
44
程式中加入地圖片段
45
操作地圖
46
GoogleMap類別與地圖設定相關方法
47
地圖相關設定的XML屬性
48
地圖相關設定的XML屬性
49
進行實驗十四,請參考實驗 首先講解如何使用定位的方法
50
GoogleMap類別
51
GoogleMap類別與地圖設定相關方法
52
CameraUpdateFactory類別常用的靜態方法
53
LatLng類別常用的方法和欄位
54
在地圖上加上標記
55
GoogleMap類別與標記相關方法
56
MarkerOptions類別常用方法
57
BitmapDescriptorFactory類別常用的靜態方法
58
Marker類別常用的方法
59
進行實驗十五,請參考實驗 首先講解如何使用定位的方法
60
Q & A 問答時間
Similar presentations