安卓模拟GPS提供商(Android mock gps provider)

2019-07-04 02:21发布

我的代码片段是:

mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if(mLocationManager.getProvider(LocationManager.GPS_PROVIDER) != null) {
    mLocationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
}

mLocationManager.addTestProvider(LocationManager.GPS_PROVIDER,
            "requiresNetwork" == "", "requiresSatellite" == "",
            "requiresCell" == "", "hasMonetaryCost" == "",
            "supportsAltitude" == "", "supportsSpeed" == "",
            "supportsBearing" == "",

android.location.Criteria.POWER_LOW,
        android.location.Criteria.ACCURACY_FINE);

location = new Location(LocationManager.GPS_PROVIDER);

mLocationManager.setTestProviderEnabled(
        LocationManager.GPS_PROVIDER, true);

// mLocationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER,
// location);

location.setLatitude(FinalLatitudeIntArray[0]);
location.setLongitude(FinalLongitudeIntArray[0]);
mLocationManager.setTestProviderLocation(
        LocationManager.GPS_PROVIDER, location);

我得到的错误:

java.lang.IllegalArgumentException: Provider "gps" unknown
at android.os.Parcel.readException(Parcel.java:1326)
at android.os.Parcel.readException(Parcel.java:1276)
at android.location.ILocationManager$Stub$Proxy.removeTestProviderEnabled(ILocationManager.java:1097)
at android.location.LocationManager.removeTestProviderEnabled(LocationManager.java:1130)

请帮我整理出这个错误。 加上。 此前的申请被罚款运行,但是当我重新启动系统,启动应用程序显示错误。

Answer 1:

从位置管理器Android的文档:

removeTestProvider() throws 
IllegalArgumentException    if no provider with the given name exists

所以,如果你在模拟器上测试,GPS的设置可能已被重新启动( 请尝试检查权限和DDMS再次启用它 )复位。 如果设备上,您必须禁用GPS( 去设置并启用GPS)。

编辑 :找到相关的事情: 这里 。 基本上有一些事情上似乎在模拟器中飘忽不定。 从该线程上的意见,尝试使用Criteria.ACCURACY_FINE代替LocationManager.GPS_PROVIDER ,如:

    LocationManager locationManager = (LocationManager)context.getSystemService( Context.LOCATION_SERVICE );

    Criteria criteria = new Criteria();
    criteria.setAccuracy( Criteria.ACCURACY_FINE );
    String provider = locationManager.getBestProvider( criteria, true );

    if ( provider == null ) {
        Log.e( TAG, "No location provider found!" );
        return;
    }

通过螺纹更多信息请。



Answer 2:

我也有同样的问题,因为一些设备目前不具备GPS。 一个好的方法是如“varevarao”所提到的,但如果我使用的标准方法,我也遇到了问题。 在某些设备上,它仍然会返回在“getBestProvider”空(见下面的代码)。

    Criteria criteria = new Criteria();
    criteria.setAccuracy( Criteria.ACCURACY_FINE );
    String provider = locationManager.getBestProvider( criteria, false );

    if ( provider == null ) {
        criteria.setAccuracy( Criteria.ACCURACY_COARSE );
        provider = locationManager.getBestProvider( criteria, true );
        Log.d( "Function", "No location provider found!" );
        return;
    }

我这样做是为了解决这个问题(见下面的代码)。 不知道是否是最好的方法,但它现在对我的作品。 它通过获取的“位置提供商的设备上可用的列表,然后获取第一(不应该的问题,因为我只是用它来模拟位置)。

   List<String> tmpProviders = locationManager.getAllProviders();

   if (!tmpProviders.isEmpty() && tmpProviders.toArray()[0] != null && !tmpProviders.toArray()[0].toString().isEmpty() ) {
      mocLocationProvider = tmpProviders.toArray()[0].toString();
  } else {// your error goes here }


文章来源: Android mock gps provider