【问题标题】:setTestProviderLocation() does not trigger calling of onLocationChanged()setTestProviderLocation() 不会触发 onLocationChanged() 的调用
【发布时间】:2011-05-16 09:07:33
【问题描述】:

我正在尝试让这段代码工作:

Testing GPS in Android

问题是,当我运行测试时,永远不会调用 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
}

【问题讨论】:

  • 你把所有的权限都放到manifest里面了吗?
  • 是的,George,它就在那里 - 我知道没关系,因为它引发了我之前更正的权限错误。

标签: android junit locationmanager


【解决方案1】:

这对我有用

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">

同样在安卓手机设置中确保你勾选了“允许模拟位置”复选框

【讨论】:

  • 您的代码似乎只是做同样的事情?我正在使用模拟器,但它已选中允许模拟位置。
  • 我将 setTime 和 setAltitude 添加到位置,仍然没有调用 onLocationChanged()。
  • 如果代码和我的一样,那可能是模拟器的问题。在 GPS 方面,我很少使用模拟器。
  • 我使用 LocationManager.GPS_PROVIDER 作为模拟名称。我不知道我为什么这样做。我知道它的错误和东西。可以试一次吗? :)
  • 当我这样做时,它会告诉我添加权限 ACCESS_FINE_LOCATION。当我这样做时,IllegalArgumentException: Provider "gps" unknown,由lm.setTestProviderEnabled(testProvider, true); 引起
【解决方案2】:

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

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

我的问题是我在两个不同的线程中有这两个(setTestProviderLocationrequestLocationUpdates),并且在之后调用了 requestLocationUpdates,所以我从来没有收到对 onLocationChanged 的回调。如果您的程序是多线程的(很可能是),请确保在 requestLocationUpdates 之后调用 setTestProviderLocation

我还注意到对setTestProviderLocation 的任何调用,onLocationChanged 将被调用一次(大约)。因此,您可以将setTestProviderLocation 放在一个循环中,以模拟对onLocationChanged 的一系列调用。这样您也可以模拟路径。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        添加并启用您的提供程序后,只需使用此行获取更新:
        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());
                }
            }
        

        同时处理异常。

        【讨论】:

          【解决方案6】:

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

          String mocLocationProvider= LocationManager.NETWORK_PROVIDER;

          然后它可以调用onLocationChanged()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-03
            • 1970-01-01
            • 2012-02-18
            • 1970-01-01
            • 2023-03-18
            相关资源
            最近更新 更多