Xamarin.Android開發實踐(十七)

原文:Xamarin.Android開發實踐(十七)html

Xamarin.Android之定位

1、前言

打開咱們手中的應用,能夠發現愈來愈多的應用使用了定位,從而使咱們的生活更加方便,因此本章咱們將學習如何在Xamarin中進行定位的開發。git

 

 

2、準備工做

由於咱們的虛擬機是運行在電腦本地的,天然就無法進行定位了,可是咱們能夠藉助DDMS這個工具幫助咱們去調試。網絡

 

首先要肯定你的Android SDK所在的目錄,讀者能夠經過如下方式找到:ide

工具-》選項工具

 

而後讀者打開該文件夾下的tools文件夾,咱們就能夠看到裏面有不少以bat結果的文件,這個時候咱們打開名爲ddms.bat的文件後,將會看到以下界面:post

 

經過這裏咱們就能夠手動發送GPS位置信息了。學習

 

注:項目還須要如下權限測試

 

3、正文

 

1.監聽GPS位置的變化

本節中咱們將會學習如何獲取位置管理器,並經過位置管理器去獲取不一樣的定位提供 器,之全部會有多個位置提供器是由於咱們的手機不只僅只能靠GPS定位,同時也可以根據基站以及網絡定位,固然精準度,耗電量都各自不一樣,這就給咱們提供 了比較靈活的方式去控制,下面咱們打開新建項目的MainActivity.cs文件並在OnCreate中寫入下面的代碼:ui

1         protected override void OnCreate(Bundle bundle) 2  { 3 base.OnCreate(bundle); 4  SetContentView(Resource.Layout.Main); 5 LocationManager lm = (LocationManager)GetSystemService(LocationService); 6 }

 

在Android中有許多的服務都是經過這種方式去獲取,因此讀者必定要有這樣的習慣,而不是跟本地開發同樣都是直接調用某個類就能夠了,這裏咱們須要經過GetSystemService獲取指定名稱的服務,例如咱們這裏的定位管理器,有了定位管理器以後,咱們就能夠經過它獲取定位提供器、監聽位置變化等。下面爲了可以很是明顯看出變化,咱們將監聽GPS位置信息變化,並經過TOAST顯示出來,首先咱們讓MainActivity實現ILocationListener接口中的方法,並在OnLocationChanged中寫入以下代碼:this

1         public void OnLocationChanged(Location location) 2  { 3 String s = String.Format("{0} {1}", location.Longitude, location.Latitude); 4  Toast.MakeText(ApplicationContext, s, ToastLength.Short).Show(); 5 }

 

最後咱們還須要經過位置管理器將其註冊,只須要在OnCreate的最後寫入以下代碼便可:

1 lm.RequestLocationUpdates(LocationManager.GpsProvider, 5000, 500f, this);

該方法的大體意思就是跟蹤GPS位置的變化,而且每5秒刷新一次,同時兩次的位置的間隔要在500米,按照筆者的實際測試來看並不會每5秒調用你的方法一次,而是須要同時知足,因此後面讀者會發現即便修改了GPS位置也不會顯示變化,這是由於變更的位置過小所致。

 

咱們經過DDMS改變GPS位置後將能夠看到以下的提示:

 

 

2.獲取位置提供器

咱們已經知道了位置提供器是有多個的,可是實際狀況並非全部提供器咱們均可以使用的,有些多是關閉的,有些多是開啓的,那麼咱們就須要知道當前有哪些位置提供器是可用的,只須要經過位置提供器就能夠辦到,具體的代碼以下所示:

 1     [Activity(Label = "LocationStudy", MainLauncher = true, Icon = "@drawable/icon")]  2 public class MainActivity : ListActivity  3  {  4 protected override void OnCreate(Bundle bundle)  5  {  6 base.OnCreate(bundle);  7 LocationManager lm = (LocationManager)GetSystemService(LocationService);  8 IList<String> list = lm.GetProviders(true);  9 ListAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, list); 10  } 11 }

 

 

運行成功後咱們就能夠看到當前開啓的位置提供器有哪些了,下面是筆者虛擬的截圖:

 

接下來咱們就能夠從中選擇一個位置提供器,並經過位置提供器的GetProvider方法獲取,除了利用上面的方式還能夠獲取指定位置提供器,好比的代碼將獲取三種不一樣的位置提供器:

1             LocationProvider lpGps = lm.GetProvider(LocationManager.GpsProvider); 2 LocationProvider lpNet = lm.GetProvider(LocationManager.NetworkProvider); 3 LocationProvider lpPsv = lm.GetProvider(LocationManager.PassiveProvider);

 

 

上面這些方式在實際中都會比較麻煩,因此下面咱們還要介紹另外一種獲取位置提供器的方式,它是基於條件的,經過咱們的條件,位置管理器會選擇一個最佳的位置管理器給咱們,好比下面的代碼,咱們將會得到符合這個條件的位置提供器:

 1             LocationManager lm = (LocationManager)GetSystemService(LocationService);  2 Criteria cri = new Criteria();  3 //精確度  4 cri.Accuracy = Accuracy.Coarse;  5 //耗能  6 cri.PowerRequirement = Power.Low;  7 //海拔精度  8 cri.AltitudeRequired = false;  9 //方向準確度 10 cri.BearingAccuracy = Accuracy.Low; 11 //是否花費 12 cri.CostAllowed = false; 13 //水平方向精度 14 cri.HorizontalAccuracy = Accuracy.Low; 15 //速度精度 16 cri.SpeedAccuracy = Accuracy.Low; 17 //是否具有速度能力 18 cri.SpeedRequired = false; 19 //垂直方向精度 20 cri.VerticalAccuracy = Accuracy.Low; 21 22 //根據條件獲取最佳位置提供器 23 String pidStr = lm.GetBestProvider(cri, true); 24 LocationProvider lp = lm.GetProvider(pidStr);

經過代碼中的註釋,咱們就可以本身控制須要要素,從而獲取對應的位置提供器。位置信息不是必需要監遵從而實時肯定當前的位置,咱們也能夠經過位置管理器的RequestSingleUpdate方 法來實現只獲取一次,固然這個方法仍是有點麻煩,並且還須要位置信息更新,有一個方法能夠直接獲取到上一次位置更新的信息,這樣就能夠避免位置信息必需要 再更新一次,這就比如在你的應用打開以前,上一個應用已經更新的位置信息,那麼再打開你的應用以後就不須要再從新獲取了,這個方法的調用以下所示:

1             LocationManager lm = (LocationManager)GetSystemService(LocationService); 2 Location lc = lm.GetLastKnownLocation(LocationManager.GpsProvider);

 

該方法獲取了上一次的GPS的位置信息,但在此以前沒有位置的更新的話,那麼返回的位置信息多是錯誤的,或不存在。

 

 

3.追蹤位置變化

在第一個示例中咱們就利用了一種以接口的方式來接收位置更新,可是在Android中最佳的方式固然不是這樣的,咱們還可使用廣播接收器來接收這些位置更新,下面咱們將學習如何使用該方式來接收位置更新,首先咱們須要新建一個廣播接收器:

1  [BroadcastReceiver()] 2 public class LocationBroadCast : BroadcastReceiver 3  { 4 public override void OnReceive(Context context, Intent intent) 5  { 6 Location lc = (Location)intent.Extras.Get(LocationManager.KeyLocationChanged); 7 Toast.MakeText(context, lc.Longitude + " " + lc.Latitude, ToastLength.Short).Show(); 8  } 9 }

 

其中的內容跟第一節是同樣,利用Toast顯示更新後的位置。

 

下面咱們就須要採用RequestLocationUpdates的另外一個重載方法來實現註冊這個廣播接收器,代碼以下所示:

1             LocationManager lm = (LocationManager)GetSystemService(LocationService); 2 var tent = new Intent(this, typeof(LocationBroadCast)); 3 var ptent = PendingIntent.GetBroadcast(this, 0, tent, PendingIntentFlags.UpdateCurrent); 4 lm.RequestLocationUpdates(LocationManager.GpsProvider, 5000, 100, ptent);

這其中筆者就很少作解釋了,只要是按照這個教程學習下來的應該會明白什麼意思了。

 

 

4.臨近警告

這個概念很是容易理解,天然有了GPS定位,那麼咱們就能夠設置一個區域,當使用者進入或離開這個區域的時候能夠通知咱們的APP,下面咱們將上面的稍做修改既能夠實現臨近警告,首先是廣播接收器:

 1  [BroadcastReceiver()]  2 public class LocationBroadCast : BroadcastReceiver  3  {  4 public override void OnReceive(Context context, Intent intent)  5  {  6 if (intent.GetBooleanExtra(LocationManager.KeyProximityEntering, true))  7  {  8 Toast.MakeText(context, "entering", ToastLength.Short).Show();  9  } 10 else 11  { 12 Toast.MakeText(context, "exiting", ToastLength.Short).Show(); 13  } 14  } 15 }

 

這裏咱們經過KeyProximityEntering能夠得到當前是離開這個區域仍是進入這個區域,對應的註冊部分也很是簡單:

1         protected override void OnCreate(Bundle bundle) 2  { 3 base.OnCreate(bundle); 4 LocationManager lm = (LocationManager)GetSystemService(LocationService); 5 var tent = new Intent(this, typeof(LocationBroadCast)); 6 var ptent = PendingIntent.GetBroadcast(this, -1, tent, 0); 7 lm.AddProximityAlert(38.422006, -110.084095, 5000f, -1, ptent); 8 }

AddProximityAlert的前三個參數就是指定這個範圍的,第一個和第二個是定一個點,第三個則是半徑,第四個參數是超時時間,這裏筆者設置爲-1表示不存在超時,最後一個固然就是咱們的廣播接收器了。

相關文章
相關標籤/搜索