星期日, 2月 17, 2013

在Android 上模擬GPS位置


最近在大翻修Navier HUD,
為了加入一些過去做不到的特色,
這些功能不是靠小改版就能處理的,
因此把過去沒加入的遺珠之憾透過這一次翻修,
整理整個架構。
Google Map也使用新版本來寫,
但在Google Map v2 API 無法在模擬器上執行,
地圖的部分會變成下圖那樣一片黑
並要求你更新Google Play Services
只是基於安全政策,模擬器是沒辦法更新Google Play Service的

本來那也沒什麼,因為只要使用實機來測試就行了,
在模擬器上執行有個好處,
就是可以使用DDMS來餵模擬器kml或gpx格式的GPS資料,
如果已經有了預先記錄好的GPS 經緯度資料,
就可以拿來測試。
一旦模擬器開不了地圖,這些GPS就沒用武之地了。

如果程式碼中沒有使用到Google API元件
可以參考此文章的作法
http://nemanjakovacevic.net/blog/2012/12/how-to-make-android-google-maps-v2-work-in-android-emulator/

但如果需要使用Google API,上面的方法就沒用拉。
既然實機不能用DDMS餵資料,
最後只好自己寫程式餵自己APP資料拉。

那在實機上怎麼餵假的GPS資料呢?
這時會需要實作一個Mock Location Provider
如下程式碼


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class MockLocationProvider {
 String providerName;
 Context ctx;

 public MockLocationProvider(String name, Context ctx) {
  this.providerName = name;
  this.ctx = ctx;

  LocationManager lm = (LocationManager) ctx
    .getSystemService(Context.LOCATION_SERVICE);
  lm.addTestProvider(providerName, false, false, false, false, false,
    true, true, 0, 5);
  lm.setTestProviderEnabled(providerName, true);
 }

 public void pushLocation(double lat, double lon) {
  LocationManager lm = (LocationManager) ctx
    .getSystemService(Context.LOCATION_SERVICE);

  Location mockLocation = new Location(providerName);
  mockLocation.setLatitude(lat);
  mockLocation.setLongitude(lon);
  mockLocation.setAltitude(0);
  mockLocation.setTime(System.currentTimeMillis());
  lm.setTestProviderLocation(providerName, mockLocation);
 }

 public void shutdown() {
  LocationManager lm = (LocationManager) ctx
    .getSystemService(Context.LOCATION_SERVICE);
  lm.removeTestProvider(providerName);
 }
}

使用下列方式來餵一個假GPS位置,如果是模擬連續收到數個GPS位置可以以一個迴圈來提供位置,並mock.wait(int milisec)來處理時間間隔

1
2
3
mock = new MockLocationProvider(LocationManager.GPS_PROVIDER, _context);

mock.pushLocation(point.lat, point.lng);

在AndroidManifest.xml需加入允許假位置的權限

android:name="android.permission.ACCESS_MOCK_LOCATION";

在測試的手機上必須在設定>開發人員選項>允許模擬位置 打勾


最後,在釋出正式版本之前,記得要註解掉假GPS部分的程式碼。

可以參考此連結文章了解http://mobiarch.wordpress.com/2012/07/17/testing-with-mock-location-data-in-android/

1 則留言:

林俊德 提到...

最近重裝了一次google市場,無意間耶升級了版大的這個大作,畫面著實驚艷,升級後發現一些問題~整理如下
1.雖說是安全性因素,但程式是否一定要檢核google play??
發現每次只要把google play 凍結或移除、移到SD卡就無法使用導航,
對要省空間與不使用台灣市場的我,有點小遺憾。
2.有root的手機在將將此程式移到記憶卡時,程式在重開機後會消失無法啟動。
(檔案雖然仍在,但需重安裝,讓系統會以覆蓋方式處理)
3.程式讀不到破解版的goole map
 因原版不能導航,變成得裝兩套導航,
 我手機容量不大~這樣逼我決定我會很糾葛的...(破解的map可以看流量與匯自設點)
4.切換程式時(電話 line 等....)此程式會關閉(包括導航路徑...)這蠻嚴重的~會出車禍的。。。