安卓模拟GPS提供程序

4
我的代码片段如下:
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)

请帮我解决这个错误。 补充说明: 之前应用程序运行正常,但是当我重新启动系统后,应用程序开始显示错误。


@rekire 感谢您编辑问题。您能帮我找到一个合适的解决方案吗? - sneaker_android
没问题,这样阅读起来更简单。你的设备支持GPS吗? - rekire
不,我会提供自己的纬度和经度数值。 昨天代码运行得很好,但今天出现了这个错误。:( ..... - sneaker_android
你能添加一些堆栈跟踪的行吗?这个跟踪似乎与你的代码没有直接关系。 - rekire
当我删除removeTestProvider()行时,setTestProvider行会抛出相同的异常.. :( ....... - sneaker_android
2个回答

3
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;
    }

请查看该帖子获取更多信息。


当我删除removeTestProvider()这一行时,setTestProvider这一行会抛出相同的异常... :( ....... - sneaker_android
那么几乎可以确定您的设备/模拟器上没有启用GPS提供程序。它必须具备该功能才能接收模拟位置。 - varevarao
我根本没有改变模拟器的设置。那么为什么在重新启动之前它能够正常工作????? - sneaker_android
应用程序现在使用我之前的代码运行顺畅,没有显示任何错误。那是什么意思?????? - sneaker_android
1
正如我在答案中提到的那样,请查看此链接:http://code.google.com/p/android/issues/detail?id=19857 - varevarao

1

我遇到了同样的问题,因为现在一些设备上没有GPS。一个好的方法就像“varevarao”所提到的那样,但是如果我使用标准方法也会遇到问题。在某些设备上,它仍然在“getBestProvider”处返回null(请参见下面的代码)。

    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 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接