Android 模拟 GPS 提供程序
Posted
技术标签:
【中文标题】Android 模拟 GPS 提供程序【英文标题】:Android mock gps provider 【发布时间】:2012-11-13 00:51:23 【问题描述】:我的代码 sn-p 是:
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 感谢您编辑问题。你能帮我找到一个合适的解决方案吗? 没问题,读起来更简单。您的设备是否支持 GPS? 不,我提供自己的经纬度值。昨天代码运行良好,但今天我收到此错误。 :( ..... 你能添加更多的堆栈跟踪行吗?跟踪似乎与您的代码没有直接关系。 当我删除 removeTestProvider() 行时,setTestProvider 行会抛出相同的异常.. :( .. 【参考方案1】:来自位置管理器上的 Android 文档:
removeTestProvider() throws
IllegalArgumentException if no provider with the given name exists
因此,如果您在模拟器上进行测试,GPS 的设置可能已在重新启动时被重置(请尝试检查您的权限和 DDMS 以再次启用它)。如果在设备上,您必须禁用 GPS(转到设置并启用 GPS)。
编辑:找到相关内容:here。基本上,模拟器中发生了一些似乎不稳定的事情。从该线程的 cmets 中,尝试使用 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 行会抛出相同的异常.. :( .. 那么几乎可以肯定您的设备/模拟器上没有启用 GPS 提供程序。它必须具有该功能才能接收模拟位置。 我根本没有更改模拟器设置。那为什么在重启之前它工作得很好?????? 应用程序现在可以使用我之前使用的代码顺利运行,没有显示任何错误。那是什么??????? 正如我在回答中提到的,请通过此链接:code.google.com/p/android/issues/detail?id=19857【参考方案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 模拟 GPS 提供程序的主要内容,如果未能解决你的问题,请参考以下文章