2009-12-29 57 views

回答

27

是的。

如果您使用Eclipse ADT插件進行開發,請在啓動模擬器後打開DDMS透視圖並查找「模擬器控制」視圖。如果您想定期發送多個座標(模擬特定路線的旅行),您可以使用位置控件部分發送固定的緯度和經度座標,或GPX(GPS交換格式)或KML(Keyhole標記語言)文件, 。

或者,你可以簡單地遠程登錄到仿真器和命令行,支持固定緯度和經度座標以及NMEA數據語句使用地理命令:

telnet localhost 5554 
geo fix -82.411629 28.054553 
geo nmea $GPGGA,001431.092,0118.2653,N,10351.1359,E,0,00,,-19.6,M,4.1,M,,0000*5B 
+3

如何在真實設備上進行測試 - 如何將您的GEO設置爲adb? – fijiaaron 2011-08-11 21:36:55

+0

非常感謝。我做了很多調查,現在我有答案! – eav 2012-09-13 07:35:29

+0

嗨。我遇到了同樣的問題,我想使用「geo fix」命令在真實的設備上進行測試,事實證明這是不可能的,因此我編寫了一個提供該功能的應用程序:) [MockGeoFix](https:// play .google.com/store/apps/details?id = github.luv.mockgeofix&hl = en)和[源代碼](https://github.com/luv/mockgeofix/) – luv 2016-07-25 00:19:55

15

也許你想給一個使用單元測試,所以你可以試試這個:

public class GPSPollingServiceTest extends AndroidTestCase { 
    private LocationManager locationManager; 

    public void testGPS() { 
     LocationManager locationManager = (LocationManager) this.getContext().getSystemService(Context.LOCATION_SERVICE); 
     locationManager.addTestProvider("Test", false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); 
     locationManager.setTestProviderEnabled("Test", true); 

     // Set up your test 

     Location location = new Location("Test"); 
     location.setLatitude(10.0); 
     location.setLongitude(20.0); 
     locationManager.setTestProviderLocation("Test", location); 

     // Check if your listener reacted the right way 

     locationManager.removeTestProvider("Test"); 
    } 
} 


對於這個工作,你還需要一個必要的許可權的AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
+0

嗨,能否請你多解釋一下詳細說明了這段代碼如何工對位置事件做出響應的活動將如何用這個進行實際測試? – Petar 2012-03-08 16:36:28

+1

嗨,這已經有一段時間了,但讓我們來看看我是否可以再次將它們整合在一起: 使用LocationManager,您可以獲得系統GPS位置管理器,通知您的應用程序位置變化。在第二行中添加一個新的位置提供程序。由於您將在單元測試中運行,您將不會有任何其他位置提供商註冊。 我在哪裏標記了「//設置測試」註釋,您可以初始化要測試的組件,這些組件應該在LocationManager中偵聽對位置的更改。 – Mallox 2012-03-14 16:14:32

+0

之後,您向位置管理器發送一個新位置,並且您要測試的代碼應該使用該信息做一些事情,以便事後檢查它是否正確。 最後,如果您編寫其他測試,您希望移除測試提供程序,以便不存在多個用於測試的位置提供程序。 (即使junit可能會正確地清理它) – Mallox 2012-03-14 16:20:25

0

我建議您編寫測試,將位置對象發送到您要測試的偵聽器類。考慮到這一點,您將需要一些輔助方法來生成位置對象。

例如爲:

首先,你用固定座標(例如紐約的中心)發送的位置。

//測試,如果一切正常

比你發送一個座標是從100米APPART第一個座標。爲此,您可以用函數我最近實施:https://stackoverflow.com/a/17545955/322791

//測試,如果一切正常

這是常見的GPS方法與時間有關。我建議你在偵聽器類上實現方法getNow(),並在需要當前時間時調用它。

long getNow() { 
    if (isUnitTesting) { 
     return unitTestTime; 
    } else { 
     System.getcurrenttimemillis(); 
    } 
} 

在單元測試環境中,您只需設置obj.isUnitTesting =真實obj.unitTestTime你想要的任何時間。之後,您可以將第一個位置發送給聽衆,然後您更改時間(+ x秒)併發送另一個位置...

以這種方式測試應用程序會容易得多。

2

除了Mallox碼這是除了真正的GPS定位模擬位置sulotion: TEST_MOCK_GPS_LOCATION是一個字符串

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    Location location = null; 

    List providers = lm.getAllProviders(); 
    for (Object provider : providers) { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     Location loc = lm.getLastKnownLocation((String) provider); 
     if (provider.equals(TEST_MOCK_GPS_LOCATION)) { 
      mLastLocation = loc; 
     } 
    } 

在測試類是:

public class GPSPollingServiceTest extends AndroidTestCase { 
private LocationManager locationManager; 

public void testGPS() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 
    LocationManager locationManager = (LocationManager) this.getContext().getSystemService(Context.LOCATION_SERVICE); 
    List providers = locationManager.getAllProviders(); 
    if(!providers.contains(TEST_MOCK_GPS_LOCATION)) { 
     locationManager.addTestProvider(TEST_MOCK_GPS_LOCATION, false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); 
     locationManager.setTestProviderEnabled(TEST_MOCK_GPS_LOCATION, true); 
     // Set up your test 
     Location location = new Location(TEST_MOCK_GPS_LOCATION); 
     location.setLatitude(34.1233400); 
     location.setLongitude(15.6777880); 
     location.setAccuracy(7); 
     location.setTime(8); 
     location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 

     locationManager.setTestProviderLocation(TEST_MOCK_GPS_LOCATION, location); 

     Method locationJellyBeanFixMethod = Location.class.getMethod("makeComplete"); 
     if (locationJellyBeanFixMethod != null) { 
      locationJellyBeanFixMethod.invoke(location); 
     } 
    } else { 
     // Check if your listener reacted the right way 
     locationManager.removeTestProvider(TEST_MOCK_GPS_LOCATION); 
    } 
} 

}

希望它能幫到你

0

在模擬器的擴展控件中(單擊仿真器旁邊控制欄上的「...」),可以使用位置選項卡,您可以手動輸入各個位置(緯度/經度/高度)並將它們發送到虛擬設備,或從您可以導入的GPX或KML文件中以所需速度設置GPS數據播放。

編輯:這是我正在談論的默認Android模擬器。