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)获取数据,而不是或直到您的“首选”提供商开始推送数据。 此外,不要假设存在任何特定服务,例如LocationManagerContext.getSystemService() 可以返回null),或者存在任何合适的提供者,(getBestProvider() 可以返回null)。您的代码将在具有正确设置的正确设备上按原样失败。如果文档上写着null,您必须检查它,否则用户将卸载它,因为它到处都是 FC。

【讨论】:

以上是关于LocationListener 适用于模拟器,而不是手机的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 相机插件适用于模拟器,而不适用于 Android 设备

FBRequestConnection startForCustomAudienceThirdPartyID:nil 适用于模拟器,而不适用于设备

使用Video Control在黑莓应用程序中捕获图片仅适用于模拟器而非设备

Rhino Mocks 存根和模拟仅适用于接口?

无法仅将本地 html 文件加载到设备上的 WKWebView 中(适用于模拟器)

适用于 iOS 8 但不适用于 iOS 7 的简单动画