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:我已经通过恢复出厂设置擦拭了我的手机,并从头开始.我仍然无法在此设备上复制此问题,仅在重启之前第一次使用该应用的手机上.
看起来您正在注册 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)
其次,我会使用ScheduledThreadPoolExecutor或Handler而不是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 位置中的新功能
| 归档时间: |
|
| 查看次数: |
5386 次 |
| 最近记录: |