星期日, 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/
張貼留言