LocationListener 适用于模拟器,而不是手机
Posted
技术标签:
【中文标题】LocationListener 适用于模拟器,而不是手机【英文标题】:LocationListener works on emulator, not on phone 【发布时间】:2011-02-04 01:21:43 【问题描述】:我无法让 LocationListener 在我的手机上调用 onLocationChanged() 回调。当我在模拟器中运行我的代码时,它工作正常,每次我进行地理修复时都会调用回调。
当我在手机上运行应用程序时,什么都没有发生。永远不会调用回调。我在我的设置中通过 GPS 和无线启用了定位。该应用程序具有位置权限的所有使用权限。
另外,当我在 LocationManager 对象上调用 getLastKnownLocation() 时,我的应用程序崩溃了。 (不过,只在我愚蠢的手机上)。即使我尝试捕获导致它崩溃的异常,它仍然只是崩溃,所以我什至无法获得有关导致它崩溃的任何信息。这非常令人沮丧。
LocationManager.getBestProvider() 正在返回 GPS,当我打开谷歌地图时,它会立即找到我的位置。这到底是怎么回事?有什么方法可以让我弄清楚它为什么会在我的手机上崩溃?
private void setupLocListener()
Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);
c.setAltitudeRequired(false);
c.setBearingRequired(false);
c.setSpeedRequired(false);
c.setCostAllowed(false);
lm.requestLocationUpdates(lm.getBestProvider(c,true), 0, 0, new LocationListener()
@Override
public void onLocationChanged(Location arg0)
map.setLocation(arg0);
public void onProviderDisabled(String arg0)
public void onProviderEnabled(String arg0)
public void onStatusChanged(String arg0, int arg1, Bundle arg2)
);
【问题讨论】:
在 Eclipse 中使用adb logcat
、DDMS 或 DDMS 透视图检查 LogCat 并查看与您的崩溃相关的堆栈跟踪。
【参考方案1】:
在您真正开始接收 GPS 坐标之前,onLocationChanged() 不会触发。
根据我的经验,我的意思是芯片必须预热大约一分钟左右,然后才能开始接收数据。
我通常会启动其他一些应用程序并等待它证明 GPS 芯片已经预热,然后再去测试我的任何 GPS 应用程序。
我知道您提到它在 Google 地图中可以正常工作,但您是否尝试过清除内存并在之后立即重新启动应用程序?
在您开始接收坐标之前,getLastKnownLocation() 始终为空。
【讨论】:
您能澄清一下您所说的开始接收坐标是什么意思吗?您的意思是硬件必须触发它还是需要执行任何函数调用才能访问 GPS 信息?【参考方案2】:当坐标可用时,Location 框架会将坐标推送到您的回调中。根据天气等,您最初可能无法获得“修复”。成功注册监听器后,您应该会在状态栏上看到“GPS”指示器。
getLastKnownPosition()
工作得很好(它可能会返回null
);谷歌地图在等待位置提供者的初始修复时使用它。
您可能还想查看其他可用的提供程序,例如cell-tower 数据,并尝试从那些(即 LKP)获取数据,而不是或直到您的“首选”提供商开始推送数据。
此外,不要假设存在任何特定服务,例如LocationManager
(Context.getSystemService()
可以返回null
),或者存在任何合适的提供者,(getBestProvider()
可以返回null
)。您的代码将在具有正确设置的正确设备上按原样失败。如果文档上写着null
,您必须检查它,否则用户将卸载它,因为它到处都是 FC。
【讨论】:
以上是关于LocationListener 适用于模拟器,而不是手机的主要内容,如果未能解决你的问题,请参考以下文章
Cordova 相机插件适用于模拟器,而不适用于 Android 设备
FBRequestConnection startForCustomAudienceThirdPartyID:nil 适用于模拟器,而不适用于设备
使用Video Control在黑莓应用程序中捕获图片仅适用于模拟器而非设备