我正试图让这段代码起作用:
问题是,当我运行测试时,永远不会调用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
}
答案 0 :(得分: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手机设置中,请确保勾选“允许模拟位置”复选框
答案 1 :(得分:2)
我遇到了同样的问题,可以让它发挥作用。我会在这里分享,以防它可以帮助其他任何人。
要考虑的是,对setTestProviderLocation
的任何调用都将调用在调用时在模拟提供程序上注册的任何侦听器。因此,如果您在致电setTestProviderLocation
之后拨打requestLocationUpdates
,则永远不会调用onLocationChanged
回调。
我的问题是我在两个不同的主题中有这两个(setTestProviderLocation
和requestLocationUpdates
)并且之后调用了requestLocationUpdates
,所以我从未收到onLocationChanged
的回调。如果您的程序是多线程的(很可能是这样),请确保在setTestProviderLocation
之后调用requestLocationUpdates
。
此外,我注意到对setTestProviderLocation
的任何调用,onLocationChanged
将被调用一次(大约)。因此,您可以将setTestProviderLocation
置于循环中,以模拟对onLocationChanged
的一系列调用。这样你也可以模拟路径。
答案 2 :(得分:1)
我遇到了同样的问题。无法解决问题,最后我放弃并在onLocationChanged( location)
之后手动添加了对locationManager.setTestProviderEnabled( PROVIDER, location)
的电话。它不漂亮但是很有效。
答案 3 :(得分:0)
我遇到了类似的问题。无论我尝试了什么,我都无法自动调用onLocationChanged()。最后,我放弃了并创建了一个方法,该方法都使用setTestProviderLocation()设置位置并直接调用onLocationChanged()。这不是一个完美的解决方案,但它可以满足我的需求。
答案 4 :(得分:0)
添加并启用您的提供商后,只需使用此行即可获取更新:
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());
}
}
还要处理异常。
答案 5 :(得分:-1)
我对此问题有同样的问题,我认为问题是TestProvider,所以我设置了
String mocLocationProvider= LocationManager.NETWORK_PROVIDER;
然后它可以调用onLocationChanged()
。