5

我试图让这段代码工作:

在 Android 中测试 GPS

问题是,当我运行测试时,永远不会调用 onLocationChanged():

public class LocationTest0 extends AndroidTestCase implements LocationListener {
private Location received = null;
public void testExample() {
    LocationManager lm = (LocationManager)this.getContext().getSystemService(Context.LOCATION_SERVICE);
    String testProvider = "Test";

    if (null == lm.getProvider(testProvider)){
        lm.addTestProvider(testProvider, false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
    }

    lm.setTestProviderEnabled(testProvider, true);
    lm.requestLocationUpdates(testProvider, 0, 0, this);
    lm.setTestProviderStatus(testProvider, LocationProvider.AVAILABLE, null, System.currentTimeMillis());

    Location location = new Location(testProvider);
    location.setLatitude(1.0);
    location.setLongitude(2.0);
    location.setTime(System.currentTimeMillis());
    lm.setTestProviderLocation(testProvider, location);

    Assert.assertFalse("Received Location is null", received == null );

    lm.removeTestProvider(testProvider);
}
@Override
public void onLocationChanged(Location location) {
    received = location;
    Log.d("LocationTest0", "onLocationChanged CALLED");
    // Never gets called
}
4

6 回答 6

5

这对我有用

locationManager.addTestProvider(mocLocationProvider, false, false,
                    false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);

.

Location mockLocation = new Location(mocLocationProvider); // a string
mockLocation.setLatitude(location.getLatitude());  // double 
mockLocation.setLongitude(location.getLongitude()); 
mockLocation.setAltitude(location.getAltitude()); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 

.

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

同样在 android 手机设置中,确保您勾选了“允许模拟位置”复选框

于 2011-05-16T09:16:18.090 回答
2

我有同样的问题,可以让它工作。我会在这里分享它以防它可以帮助其他人。

要考虑的事情是,任何调用都setTestProviderLocation将调用在调用时在模拟提供程序上注册的任何侦听器。因此,如果您setTestProviderLocation在该调用之后立即调用requestLocationUpdates,则onLocationChanged永远不会调用回调。

我的问题是我在两个不同的线程中有这两个(setTestProviderLocation和)并在之后被调用,所以我从来没有回调到. 如果您的程序是多线程的(很可能是),请确保在.requestLocationUpdatesrequestLocationUpdatesonLocationChangedsetTestProviderLocationrequestLocationUpdates

我还注意到任何对setTestProviderLocation,的调用onLocationChanged都会被调用一次(大约)。因此,您可以放入setTestProviderLocation一个循环来模拟对onLocationChanged. 这样您也可以模拟路径。

于 2015-08-02T21:42:13.513 回答
1

我有同样的问题。无法解决,最后我放弃并手动添加了对onLocationChanged( location)after的调用。locationManager.setTestProviderEnabled( PROVIDER, location)它不漂亮但有效。

于 2013-10-16T19:46:37.943 回答
0

我遇到了类似的问题。无论我尝试了什么,我都无法自动调用 onLocationChanged()。最终,我放弃并创建了一个方法,既可以使用 setTestProviderLocation() 设置位置,又可以直接调用 onLocationChanged()。这不是一个完美的解决方案,但它可以满足我的需求。

于 2011-10-14T18:23:22.557 回答
0

添加并启用您的 Provider 后,只需使用此行获取更新:
locationManager.requestLocationUpdates(MOCK_PROVIDER, 0, 0, this);

我建议在活动启动时使用这样的方法:

    private void enableProvider() {
        
        try {
            locationManager.addTestProvider(
                    MOCK_PROVIDER,
                    false,
                    false,
                    false,
                    false,
                    true,
                    true,
                    true,
                    0,
                    5
            );
        } catch (IllegalArgumentException | SecurityException e) {
            Log.w(TAG, "addTestProvider" + e.getMessage());
        }
        try {
            locationManager.setTestProviderEnabled(MOCK_PROVIDER, true);
            locationManager.requestLocationUpdates(MOCK_PROVIDER, 0, 0, this); <-- Update Request
        } catch (IllegalArgumentException | SecurityException e) {
            Log.w(TAG, "setTestProviderEnabled" + e.getMessage());
        }
    }

同时处理异常。

于 2020-08-05T05:45:01.213 回答
-1

我对这个问题也有同样的问题,我认为问题是TestProvider,所以我设置了

String mocLocationProvider= LocationManager.NETWORK_PROVIDER;

然后它可以调用onLocationChanged().

于 2012-10-28T17:51:31.487 回答