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

mat*_*ker 5 java gps android restart google-play-services

我以前发过关于这个问题的帖子,发现其他一些人遇到了同样的问题而没有找到解决方案.

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

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


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

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

我毫不怀疑有更好的GPS方法.我对Android开发很新,所以非常感谢这方面的任何帮助.

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

Sea*_*eau 3

看起来您正在注册 GPS 和网络提供商以侦听位置 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) {}
    };
Run Code Online (Sandbox Code Playgroud)

其次,我会使用ScheduledThreadPoolExecutorHandler而不是Timer

来自Timer文档:

对于新代码,首选 ScheduledThreadPoolExecutor...此类不提供有关任务调度的实时性的保证。

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

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

Handler handler = new Handler();
handler.postDelayed(getLastLocation, 10000);
Run Code Online (Sandbox Code Playgroud)

...您GetLastLocation将更改为:

Runnable getLastLocation = new Runnable() {
    @Override
    public void run() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

...您的cancel()方法和其他方法需要引用处理程序。

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

public Location mUserCoordinates = new Location(LocationManager.NETWORK_PROVIDER);
Run Code Online (Sandbox Code Playgroud)

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

另外,您的 MainActivity 似乎不需要实现 LocationListener,因为它从未向 LocationManager 注册。

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

您将仅限于安装了 Google Play 服务的 Android 2.2 及更高版本的设备,但在我看来,避免处理平台中的一些怪异位置和管理多个提供商是值得的。有关 Fused 位置提供程序以及它与直接侦听 GPS 和网络提供程序有何不同的更多信息,请参阅此2013 Google I/O 演示文稿 - 超越蓝点:Android 位置中的新功能