注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/location/location-testing.html
樣例代碼:
要測試一個使用定位服務的地點認知應用,你不需要將你的設備從一個地方移動到另一個地方來生成數據。你可以將定位服務放到測試模式中。在該模式中你可以發送測試的 Location 對象到定位服務中,然后它會發送給定位客戶端。在測試模式下,定位服務也可以使用測試 Location 對象來激活地理圍欄。
使用測試位置有如下幾個好處:
- 測試位置允許你創建一個特定的測試數據,而不是通過移動設備獲取一些近似的數據。
- 由于測試位置來自于定位服務,他們測試你的定位代碼的每一個部分。另外,由于你可以將測試數據和你的應用時分離的,所以在你發布應用的時候,不需要移除你的測試代碼。
- 由于你不需要通過移動設備來產生測試數據,所以你可以使用模擬器進行測試。
最佳的使用測試位置的方法是從一個另外的測試位置提供應用發出。這節課包含了一個你可以下載并使用的提供器應用,你可以使用它來測試你的應用。你可以根據你的需求恰當地更新提供器應用。相關的內容將會在后續章節中講解。
這節課剩余的部分將會展示如何啟動測試模式,并使用一個定位客戶端將測試位置發送給定位服務。
Note:
測試位置對定位服務在行為認知上所使用的算法是沒有影響的。要了解有關行為認知方面的知識,可以閱讀: Recognizing the User's Current Activity (博客鏈接: http://www.cnblogs.com/jdneo/p/3758479.html )
一). 打開測試模式
要在測試模式下將測試位置發送給定位服務,一個測試應用必須請求 ACCESS_MOCK_LOCATION 權限。另外,你必須使用“ Enable mock locations ”選項啟用測試設備上的測試位置。要學習如何在設備上啟用測試位置,可以閱讀: Setting up a Device for Development 。
要打開定位服務的測試模式,首先將一個定位客戶端連接到定位服務,這在 Retrieving the Current Location (博客鏈接: http://www.cnblogs.com/jdneo/p/3713826.html )中已經講解過。然后調用 LocationClient.setMockMode(true) 。一旦你調用了這個方法,定位服務會關閉它的內部定位提供器,并僅發送你所提供的測試位置。下面的代碼片段展示了如何調用 LocationClient.setMockMode(true) :
// Define a LocationClient object public LocationClient mLocationClient; ... // Connect to Location Services mLocationClient.connect(); ... // When the location client is connected, set mock mode mLocationClinet.setMockMode( true );
一旦你將定位客戶端連接到了定位服務上,你必須保持連接直到你完成了測試位置的發送。一旦你調用了 LocationClient.disconnect() ,定位服務會重新回到它的內部定位提供器上。如果你要在定位客戶端正在連接的狀態下關閉測試模式,需要調用 LocationClient.setMockMode(false) 。
二). 發送測試位置
一旦你設置了測試模式,你可以創建測試 Location 對象并將它們發送至定位服務。之后,定位服務會將這些測試 Location 對象發送給已連接的定位客戶端。定位服務也會使用測試 Location 對象來控制地理圍欄的激活。
要創建一個新的測試 Location ,我們使用你的測試數據創建一個新的 Location 對象。把提供器的值設置為“ flp ”,定位服務會把它放到發出的 Location 對象中。下面的代碼片段展示了如何創建一個新的測試 Location :
private static final String PROVIDER = "flp" ; private static final double LAT = 37.377166 ; private static final double LNG = -122.086966 ; private static final float ACCURACY = 3.0f ; ... /* * From input arguments, create a single Location with provider set to * "flp" */ public Location createLocation( double lat, double lng, float accuracy) { // Create a new Location Location newLocation = new Location(PROVIDER); newLocation.setLatitude(lat); newLocation.setLongitude(lng); newLocation.setAccuracy(accuracy); return newLocation; } ... // Example of creating a new Location from test data Location testLocation = createLocation(LAT, LNG, ACCURACY);
在測試模式下,調用 LocationClient.setMockLocation() 將一個測試位置發送給定位服務。例如:
mLocationClient.setMockLocation(testLocation);
定位服務會設置該測試位置作為當前的位置,且該地點會作為下一個更新的地點發出。如果這一新的測試位置穿越了一個地理圍欄,那么定位服務會激活該地理圍欄。
三). 運行測試位置提供器應用
本節會包含一個測試位置提供器應用的簡短概述(可在最上面的連接下載),并對你應該如何使用該應用進行測試進行一些指導。
概述
本課程中涉及的 測試位置提供器應用,會從后臺一個運行了已啟動的 Service 的線程中,將測試位置發送給定位服務。通過使用一個已啟動的服務,提供器應用可以一直保持運行,即使應用的主 Activity 由于配置的變更或者其它系統事件而被銷毀。通過使用后臺線程,可以讓該服務執行一個長期的測試任務而不會阻塞UI線程。
當你打開
提供器應用后,啟動的
Activity
允許你將測試參數發送給
Service
,并控制你希望測試的類型。涉及到下列選項:
測試前暫停
在 提供器應用將測試數據發送給定位服務前需要等待的時間。這一間隔可以允許你在測試開始前,有時間從提供器應用切換到要測試的應用。
發送間隔
提供器應用將測試數據發送給定位服務時的中間間隔。在后面的章節會進一步說道該選項。
單次執行
即從普通模式切換到測試模式,執行一次測試數據,之后再切換回普通模式,并殺掉 Service 。
連續執行
即從普通模式切換到測試模式,無限地執行測試數據,之后再切換回普通模式,后臺線程以及已啟動的 Service 會一直執行,甚至主 Activity 已經被銷毀 。
停止測試
如果一個連續測試正在執行中,該選項會停止它;否則,會返回一個警告消息。啟動的 Service 會從測試模式切換到普通模式,然后將其自身中止。同時后臺線程也會被中止。
除了上述選項之外,提供器應用還具有兩種顯示狀態:
應用狀態
顯示提供器應用相關的生命周期狀態信息。
連接狀態
顯示連接到客戶端的連接狀態信息。
由于已啟動的 Service 正在運行,所以它還會推送測試狀態的通知。這些通知允許你即使應用不在前臺也可以觀察狀態的更新情況。當你點擊了一個通知,提供器應用的主 Activity 會回到前臺。
使用測試位置提供器應用進行測試
要測試來自測試位置提供器應用的測試位置數據:
在一個裝有Google Play服務的設備上安裝測試位置提供器。定位服務是Google Play服務的一部分。
在設備上,啟用測試位置。要學習怎么做,可以查看: Setting up a Device for Development 。
從啟動器開始提供器應用,然后在主界面上選擇模式。
除非你移除了啟動暫停,不然的話,測試位置提供器應用會暫停一些時間,然后開始將測試數據發送給定位服務。
運行你想要測試的應用。當測試位置提供器應用在運行時,你正在測試的應用匯接收測試位置而不是真實的位置。
如果提供器應用是在處于連續測試的中間,你可以通過點擊“ Stop test ”切換回真實地點。這會強制已啟動的 Service 關閉測試模式并且將其自身停止。當服務停止后,后臺線程也被銷毀了。
四). 有關測試的建議
下面的章節包含了創建測試數據以及使用測試位置提供器應用提供的數據這兩方面的建議。
選擇一個發送間隔
每一個讓定位服務發送位置的測試位置提供器都有它自己的最小更新間隔。例如,GPS提供器無法以每秒更新一次的頻率發送地理位置更新。,而Wi-Fi定位的頻率上限則是5秒一次。對于真實的位置,這些周期是會被自動處理的,但你需要再發送測試位置的時候為它們進行計數。例如,你不應該以超過一秒一次的頻率發送測試位置。如果你在測試室內的位置(更多地依賴于Wi-Fi),那么你使用的頻率應該是五秒一次。
仿真移動速度
要仿真一個實際設備的速度,可以縮短或者延長連續兩個位置之間的距離。例如,可以每秒移動88英尺來模擬汽車的行駛,因為這相當于每小時60英里。相對而言,每秒1.5英尺的變化可以仿真快不行走,這相當于每小時3英里。
計算位置數據
通過搜索網絡,你可以發現找到很多計算起始位置經緯度與結束位置經緯度之間距離的小程序,以及計算兩點經緯度之間距離所用的公式。另外 Location 類提供了兩個方法來計算兩點之間距離。
一個靜態方法,根據經緯度來計算兩點之間的距離。
對一個給定的 Location ,返回到另一個 Location 的距離。
地理圍欄測試
當你對一個由地理圍欄檢測功能的應用進行測試時,使用的測試數據應該能夠反映不同形式的行動方式,如:行走,騎車,駕駛,火車等。對于慢速的行動模式,可以讓兩點間的距離變化較小。對應的,對于快速地行動模式,可以讓兩點間的距離大一些。
管理測試數據
這節課所包含的測試位置提供器應用可以以常量的形式測試經緯度以及精度。你可以考慮其他測試數據的組織形式:
XML:
可以將位置數據存儲于測試位置提供器應用中對應的XML文件中,這樣可以將測試數據與代碼分離,方便測試。
從服務器下載:
將位置數據存儲于服務器中,并讓提供器應用下載。由于數據和應用完全分離,所以你可以修改測試數據而不用重新構建應用。你也可以通過修改服務器上的測試數據,并讓結果立即反應到你正在測試的測試位置中。
記錄的數據
除了設想一些測試數據外,你還可以寫一個工具應用,它記錄你移動設備過程中的位置數據。并將這些數據作為測試數據,或利用這些數據幫助你構造一些測試數據。例如,你可以在行走的過程中記錄一些數據,然后創建一些測試數據,這些數據會隨著時間的變化而發生相應的變化。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
