在重新启动新手机之前,Android GPS无效

时间:2014-02-23 21:53:32

标签: java android gps google-play-services restart

我之前发布过有关此问题的文章,并发现其他一些人遇到同样的问题而没有找到解决方案。

我正在开发一个Android应用程序,它使用获得的GPS坐标和地理编码的邮政编码向服务器提交JSON查询。对于从未下载过该应用的全新用户,GPS无论如何都无法正常工作。直到重新启动手机才能运行GPS。安装应用程序然后重新启动后,GPS每次都会正常工作,即使它们重新启动也是如此。

关于此问题的信息很少,我发现的唯一问题是使用Google Play定位服务,没有进一步的详细信息。其他人遇到过这个问题吗?在完成此问题之前,我的开发已完全停止。


编辑: 以下是调用地理定位函数的MainActivity.java文件的链接。

以下是MyLocation.java文件的链接,其中包含多个地理位置来源的实际逻辑

我毫不怀疑有更好的GPS方法。我对Android开发非常陌生,因此非常感谢您对此方面的任何帮助。

编辑2: 我已经通过恢复出厂设置擦拭了我的手机,并从头开始。我仍然无法在此设备上复制此问题,仅在重启前第一次使用该应用的手机上。

3 个答案:

答案 0 :(得分:3)

看起来您正在注册GPS和NETWORK提供商以收听位置10秒钟,当计时器在10秒后熄灭时,您尝试从两个提供商处获取最新位置。

这里有一些事情发生。

首先,您似乎正在以错误的方法监听更新。你的两个听众应该是这样的:

    LocationListener locationListenerGps = new LocationListener() {

            // This will never be called, its not part of the LocationListener interface - http://developer.android.com/reference/android/location/LocationListener.html
            /* public void onStatusChanged(Location location) {
                    timer1.cancel();

                    locationResult.gotLocation(location);
                    lm.removeUpdates(this);
                    lm.removeUpdates(locationListenerNetwork);
            } */
            public void onProviderEnabled(String provider) {}
            public void onProviderDisabled(String provider) {}
            public void onLocationChanged(Location location) {
                    // This is the correct method to receive location callbacks
                    timer1.cancel();

                    locationResult.gotLocation(location);
                    lm.removeUpdates(this);
                    lm.removeUpdates(locationListenerNetwork);

            }
            public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

其次,我使用ScheduledThreadPoolExecutorHandler代替Timer

来自Timer文档:

  

首选ScheduledThreadPoolExecutor获取新代码...此类不保证任务调度的实时性。

如果需要重新启动以使应用程序正常工作,那么可能与计时器在10秒后未触发​​有关。请注意,这并不一定意味着GPS本身无法正常工作。

处理程序应该完成这项工作并且它是专为Android设计的,所以我建议使用它。它看起来像:

Handler handler = new Handler();
handler.postDelayed(getLastLocation, 10000);

...而您的GetLastLocation将更改为:

Runnable getLastLocation = new Runnable() {
    @Override
    public void run() {
        ...
    }
}

...您的cancel()和其他方法需要引用Handler。

另请注意,您要使用提供程序类型NETWORK_PROVIDER声明MainActivity中的Location对象,然后在该对象中设置lat / long。

public Location mUserCoordinates = new Location(LocationManager.NETWORK_PROVIDER);

因此,无论实际来源如何,MainActivity中的地理位置类型始终显示为NETWORK_PROVIDER

此外,看起来您的MainActivity不需要实现LocationListener,因为它从未在LocationManager中注册。

最后,我建议在Google Play服务中使用融合位置提供程序,而不是使用GPS和网络的两个侦听器,如下所述: http://developer.android.com/training/location/receive-location-updates.html

您将被限制在安装了Google Play服务的Android 2.2及更高版本的设备上,但在我看来,它的价值在于避免处理平台中某些位置的怪癖并管理多个提供商。有关融合位置提供商及其与直接收听GPS和NETWORK提供商的不同之处,请参阅此2013 Google I/O presentation - Beyond the Blue Dot: New Features in Android Location

答案 1 :(得分:2)

为什么使用Google Play服务位置API?

Play服务提供的唯一新功能是Geofencing。从您的回答中我假设您不想使用Geofencing而只是“通常”的位置请求。

Android平台为此类请求提供了一个出色的API,不需要Google Play服务。我从来没有遇到你在使用它时描述的问题。

请注意,虽然Google声称Play服务比Android API更好,但自从API 9(Android 2.3)以来,只要您使用不需要要指定的提供者。

请参阅:http://developer.android.com/guide/topics/location/strategies.html

答案 2 :(得分:2)

我之前的常规Location API遇到了同样的问题。我开始玩Play Services了,它似乎有效。最近有时我会再次使用Google Play服务遇到此问题。这真的很奇怪,根据我的经验,探测器是系统范围的,所以当我的应用程序找不到位置时,谷歌地图应用程序无法收集。请注意,我使用Cyanogenmod,因此它可能是一些错误。