2014-02-23 207 views
5

我之前发布过关于此问题的信息,并且发现其他一些人遇到过无法找到解决方案的问题。Android GPS无法工作,直到重新启动新手机

我正在开发一个Android应用程序,该应用程序使用获得的GPS坐标和地理编码的邮政编码向服务器提交JSON查询。对于从未下载应用程序的全新用户,GPS不起作用。直到重新启动手机,GPS才能工作。安装应用程序然后重新启动后,即使GPS再次重新启动,GPS也将毫无问题地工作。

在这个问题上有很少的宝贵信息,我发现的唯一问题是使用Google Play定位服务,但没有进一步的细节。其他人遇到过这个问题吗?我的发展完全停止,直到这个问题得到解决。


编辑: 这里是链接到MainActivity.java文件调用地理定位6功能。

这里是链接到MyLocation.java文件,其中包含了地理位置

的多个来源我毫不怀疑,有做GPS的更好的方法实际的逻辑。我对Android开发非常陌生,因此非常感谢这方面的帮助。

编辑2: 我已经用工厂重置擦掉手机,并从头开始。我仍然无法在此设备上复制问题,只能在重新启动之前首次使用该应用的手机上进行复制。

+0

我从来没有在使用gps的应用中看到过此行为。您需要提供更多信息。 – Christine

+0

**“直到重新启动手机,GPS才能正常工作。”** - 我发现这很难相信。你的建议意味着*任何使用GPS的应用程序都需要在安装应用程序后重启设备。 – Squonk

+0

@Christine由于重启后工作,我必须尝试找到一个设备,我可以重置每个调试周期以复制行为。今晚可能会有更新,并会随时更新。 – mattcoker

回答

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本身不工作。

Handler应该完成这项工作,它是为Android设计的,所以我建议使用它。它看起来像:

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

...和你GetLastLocation将变为:

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

...和你cancel()等方法将需要引用的处理程序。

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

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

所以,在MainActivity位置类型将始终显示为的NETWORK_PROVIDER,无论实际的源。

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

最后,而不是使用两个侦听器的GPS和网络,我会建议使用在谷歌融合的位置提供播放服务,为这里讨论: http://developer.android.com/training/location/receive-location-updates.html

你会被限制在设备Android 2.2及更高版本并安装了Google Play服务,但在我看来,这是值得的,以避免处理平台中某些偏僻的位置并管理多个提供商。有关融合位置服务提供商的更多信息,以及它如何与直接倾听GPS和NETWORK提供商的差异,请参阅此2013 Google I/O presentation - Beyond the Blue Dot: New Features in Android Location

+0

只要我今晚可以看到更多,我可能会有一些问题给你。这种答案正是我期待的那种东西,虽然深入而完整。 – mattcoker

+0

+ mattcocker我面临同样的问题,你找到原因了吗? –

2

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

Play Services提供的唯一新功能是Geofencing。从你的答案我假设你不想使用Geofencing,但只是“通常”的位置请求。

Android平台为这类不需要Google Play服务的请求提供了一个很好的API。我从来没有遇到过使用它时描述的问题。

请注意,尽管Google声称Play服务比Android API更好,但自API 9(Android 2.3)以来,这并非如此,只要您使用不需要提供商的较新LocationManager.requestLocationUpdates方法即可指定。

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

+0

感谢您的回应,我不使用Google Play服务位置API,这是我所指的:[StackOverflow](http://stackoverflow.com/questions/15259229/android-app-not-able-to -get-gps-until-phone-restarts) 我一直在使用Android开发人员门户上列出的策略,他们工作得很好,只有这个例外。 – mattcoker

2

我曾与正规位置API前面同样的问题。我向Play Services求助,似乎有效。最近有时我会再次使用Google Play服务遇到此问题。这真的很奇怪,根据我的经验,probelem是系统范围的,所以当我的应用找不到位置时,比Google Maps应用无法收集。请注意,我使用Cyanogenmod,因此它可能是一些错误。

+0

同样,我不明白使用Google Play服务在您的位置上获得GPS修正之间的区别。你能否提供关于如何做到这一点的细节? – mattcoker

+0

如果你正在开发你的应用程序基于此,比你使用它:http://developer.android.com/training/location/index.html – Ripityom