OnLocationChangedcallback永远不会被调用

我正在尝试使用LocationManager获取用户当前的LocationManager 。 我做了大量的研究,似乎无法find有同样问题的人。 OnLocationChangedcallback似乎永远不会被调用。 以下是我的各种代码和logcat。

 protected LocationListener locationListener; protected LocationManager locationManager; protected Context context; 

我的OnCreate()方法

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v(TAG, "IN ON CREATE"); this.context = getActivity(); registerLocationUpdates(); } 

我的registerLocationUpdates方法

 void registerLocationUpdates() { Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_LOW); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); locationManager = (LocationManager)getActivity().getSystemService(LOCATION_SERVICE); provider = locationManager.getBestProvider(criteria, true); // Cant get a hold of provider if (provider == null) { Log.v(TAG, "Provider is null"); showNoProvider(); return; } else { Log.v(TAG, "Provider: " + provider); } locationListener = new MyLocationListener(); locationManager.requestLocationUpdates(provider, 1L, 1f, locationListener); // connect to the GPS location service Location oldLocation = locationManager.getLastKnownLocation(provider); if (oldLocation != null) { Log.v(TAG, "Got Old location"); latitude = Double.toString(oldLocation.getLatitude()); longitude = Double.toString(oldLocation.getLongitude()); waitingForLocationUpdate = false; getNearbyStores(); } else { Log.v(TAG, "NO Last Location found"); } } 

我的LocationListener

 private class MyLocationListener implements LocationListener { public void onLocationChanged(Location location) { latitude = Double.toString(location.getLatitude()); longitude = Double.toString(location.getLongitude()); Log.v(TAG, "IN ON LOCATION CHANGE"); if (waitingForLocationUpdate) { getNearbyStores(); waitingForLocationUpdate = false; } locationManager.removeUpdates(this); } public void onStatusChanged(String s, int i, Bundle bundle) { Log.v(TAG, "Status changed: " + s); } public void onProviderEnabled(String s) { Log.e(TAG, "PROVIDER DISABLED: " + s); } public void onProviderDisabled(String s) { Log.e(TAG, "PROVIDER DISABLED: " + s); } } 

我在AndroidManifest中的权限

 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

最后,我运行我的应用程序后,logcat

 01-25 09:43:10.963: VERBOSE/NearbyListFragment(3060): IN ON CREATE 01-25 09:43:10.963: VERBOSE/LocationManagerService(1329): getProviders 01-25 09:43:10.963: VERBOSE/LocationManagerService(1329): getProviders 01-25 09:43:10.973: VERBOSE/LocationManagerService(1329): getProviders 01-25 09:43:10.983: VERBOSE/NearbyListFragment(3060): Provider: gps 01-25 09:43:10.983: DEBUG/LocationManager(3060): requestLocationUpdates: provider = gps, listener = co.fusionweb.dealsplus.app.NearbyItems$NearbyListFragment$MyLocationListener@46ef4680 01-25 09:43:10.983: DEBUG/GpsLocationProvider(1329): setMinTime 1 01-25 09:43:10.983: VERBOSE/NearbyListFragment(3060): NO Last Location found 01-25 09:43:10.983: VERBOSE/LocationManagerService(1329): _requestLocationUpdates: listener = Receiver{47421e68 Listener android.os.BinderProxy@47421a68} 01-25 09:43:11.003: VERBOSE/countingFragment(3060): IN ON CREATE VIEW 01-25 09:43:11.003: WARN/GpsLocationProvider(1329): Duplicate add listener for co.fusionweb.dealsplus 01-25 09:43:11.013: VERBOSE/ScrollListener(3060): In Constructor 01-25 09:43:11.013: VERBOSE/ScrollListener(3060): Scrolling 01-25 09:43:11.033: DEBUG/GpsLocationProvider(1329): startNavigating 01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_qos_time_out(standalone = 60, agps = 89) 01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_qos_accuracy(accuracy = 50) 01-25 09:43:11.043: VERBOSE/lib_locapi(1329): persist.radio.agps.mode: [] 01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_set_position mode, client = 1, interval = 1, mode = 1 01-25 09:43:11.043: VERBOSE/lib_locapi(1329): loc_eng_ioctl called: client = 1, ioctl_type = 2 01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): loc_ioctl 01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [96] 01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet size: [28] 01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): loc_api_sync_ioctl: select_id = 0, loc_ioctl returned 0 01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet size: [80] 01-25 09:43:11.043: VERBOSE/locapi_rpc_glue(1329): Callback received: 80 (cb_id=0x5310000 handle=1) 01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [28] 01-25 09:43:11.043: VERBOSE/lib_locapi(1329): loc_eng_ioctl result: client = 1, ioctl_type = 2, SUCCESS 01-25 09:43:11.043: DEBUG/lib_locapi(1329): loc_eng_start 01-25 09:43:11.043: DEBUG/locapi_rpc_glue(1329): loc_start_fix 01-25 09:43:11.043: DEBUG/RPC(1329): written RPC packet size: [44] 01-25 09:43:11.043: DEBUG/RPC(1329): read RPC packet 01-25 09:43:11.053: DEBUG/RPC(1329): read RPC packet size: [28] 01-25 09:43:11.103: DEBUG/RPC(1329): read RPC packet 01-25 09:43:11.103: DEBUG/RPC(1329): read RPC packet size: [80] 01-25 09:43:11.113: VERBOSE/locapi_rpc_glue(1329): Callback received: 100 (cb_id=0x5310000 handle=1) 01-25 09:43:11.113: VERBOSE/lib_locapi(1329): process_deferred_action: pthread_cond_wait returned 01-25 09:43:11.113: DEBUG/lib_locapi(1329): loc_eng_report_status: GPS_STATUS_SESSION_BEGIN 01-25 09:43:11.113: DEBUG/lib_locapi(1329): loc_eng_report_status: update status 01-25 09:43:11.113: VERBOSE/GpsLocationProvider(1329): reportStatus status: 1 01-25 09:43:11.113: DEBUG/GpsLocationProvider(1329): Acquiring wakelock 01-25 09:43:11.123: DEBUG/RPC(1329): written RPC packet size: [28] 01-25 09:43:11.183: DEBUG/PowerManagerService(1329): New lightsensor value:40, lcdValue:77 01-25 09:43:11.273: DEBUG/RPC(1329): read RPC packet 01-25 09:43:11.273: DEBUG/RPC(1329): read RPC packet size: [80] 01-25 09:43:11.273: VERBOSE/locapi_rpc_glue(1329): Callback received: 100 (cb_id=0x5310000 handle=1) 01-25 09:43:11.273: VERBOSE/lib_locapi(1329): process_deferred_action: pthread_cond_wait returned 01-25 09:43:11.273: DEBUG/lib_locapi(1329): loc_eng_report_status: GPS_STATUS_ENGINE_ON 01-25 09:43:11.273: DEBUG/lib_locapi(1329): loc_eng_report_status: update status 01-25 09:43:11.273: VERBOSE/GpsLocationProvider(1329): reportStatus status: 3 

而且,这个logcat的android SDK位置部分不断重复它们自己。 我已经尝试了一切,我可以想到和看到谷歌和stackoverflow。 阿尔斯只是一个旁注,我已经能够得到它在2.3设备上使用requestSingleUpdate在API 9中可用,并遵循指南深入潜入位置,但我需要它的工作2.1或2.2和更高使用旧的SDK。 所以,如果你有任何提示或想知道更多,请让我知道。 提前致谢。

它看起来像你安装应该工作,因为它不,我会尽可能简单的例子,以排除故障。 我会让你的请求看起来像

 requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

这样你可以得到所有的更新。 并注释掉有关获取最后一个已知位置的部分。 现在还不需要

然后在onLocationChanged() ,就有了

 Log.v(TAG, "IN ON LOCATION CHANGE, lat=" + latitude + ", lon=" + longitude); 

将其余的注释掉,让你的听众保持活跃。 这应该给你一个真正的设备上的更新stream。 在模拟器上,您需要使用DDMS,每次按发送时都会得到一个GPS更新。

更换

LocationManager.GPS_PROVIDER

LocationManager.NETWORK_PROVIDER

解决了我的问题。

这里是我的位置pipe理器的代码片段

  LocationManager locationManager = (LocationManager) getActivity().getSystemService(LOCATION_SERVICE); 

/ /检查位置权限,棉花糖和以上

  if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. Toast.makeText(getActivity(), "Not Enough Permission", Toast.LENGTH_SHORT).show(); return; } 

//获取当前位置

  Location myLocation = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); currentLatitude = myLocation.getLatitude(); currentLongitude = myLocation.getLongitude(); 

//使用LocationManager.NETWORK_PROVIDER请求位置更新

  locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, MapFragment.this); 

正如史蒂夫·布莱克威尔写道,你的设置是好的。 你可以尝试的是了解你是否有100%的GPS固定信号! 我已经安装了一个漂亮的GPStesting仪应用程序(从游戏商店) ,它会告诉你,如果你有一个修复或没有连接到哪些卫星和连接强度。 这是我的OnLocationChanged()永远不会调用的原因..我试图从一个build筑物内运行它:\

祝你好运!

我遇到类似的问题。 我有权限,请求正确的服务,但没有更新。 事实certificate,我所要做的只是等待。 当我在互联网上search这个问题的时候,我已经运行了应用程序,几分钟后它才开始接收更新。 然后,即使当我杀了应用程序,再次运行它,更新来瞬间 – 我想这是一个系统的东西,一些优化,也许是由于设备不动的事实(顺便说一句,这不是一些低劣的设备,它是像素)。

我有相同的情况,我认为我在我的代码中犯了一些错误,所以onLocationchage方法没有被调用,最后我解决了这个问题。

 Step 1 : Close your application and Open Google Map Application. Step 2 : Touch the location finder button or icon over the Google Map app then It will show, currently where you are located. Step 3 : Now Run your app and check onlocationchage will call. 

我面临同样的问题。 我得到getLastKnownLocation为null。 当我重新启动设备中的设备和位置服务时问题已解决。

当设备处于低功耗或使用省电模式时,GPS提供商将禁用 ,那么在这种情况下,我们不能接收onLocationChanged

因此,在我的应用程序中,我将同时使用GPS_PROVIDERNETWORK_PROVIDER来接收onLocationChanged()

https://developer.android.com/guide/topics/location/strategies.html#Updates

要请求来自GPS提供商的位置更新,请使用GPS_PROVIDER而不是NETWORK_PROVIDER。 您还可以通过调用requestLocationUpdates()两次(一次为NETWORK_PROVIDER,一次为GPS_PROVIDER)请求GPS和networking位置提供程序的位置更新。

如果您尝试使用NETWORK_PROVIDER,那么testing真的很困难:

  • 在模拟器上:从不工作
  • 在真实的设备:只有getLastKnownLocation()的作品,以接收onLocationChanged(),你必须使用移动数据,并有可能从盗贼的电话丢失的风险:P

我猜这是因为它只是networking提供商的位置而不是你的设备本身,而networking提供商从不移动,所以onLocationChanged()永远不会调用。 只有在移动数据和WiFi之间切换时才会发生,反之亦然。 如果我错了,请纠正我。

所以我build议在考虑性能和电池使用之前使用GPS_PROVIDER进行实验。 它在仿真器和实际设备上都很好地工作。 最佳做法是: https : //developer.android.com/guide/topics/location/strategies.html

我花了几个小时才用NETWORK_PROVIDERtesting没有任何结果,所以希望我的build议有帮助。

我有我的真实设备(M,应用程序的targetSDK 23)上的同样的问题(onLocationChanged()永远不会调用NETWORK_PROVIDER),直到我重新启动它。