NETWORK_PROVIDER的LocationListener已启用,但onLocationChanged永远不会被调用

我正在开发一个应用程序,在一个服务6,6分钟内整天获取手机的位置,它工作正常,但有时networking提供商监听程序的OnLocationChanged停止被调用,而我不知道为什么。

由于某种原因停止被调用,但提供程序是启用和列表工作,当我启用或禁用提供程序手动, onProviderEnabledonProviderDisabled被调用。

它只是发生在NETWORK_PROVIDERGPS_PROVIDER运作良好。

监听器:

 LocationListener locationListenerGPS = new LocationListener() { // @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO locationListenerGPS onStatusChanged Log.d(TAG, "Provedor trocado"); } // @Override public void onProviderEnabled(String provider) { Log.w(TAG, "PROVEDOR " + provider + " HABILITADO!"); } // @Override public void onProviderDisabled(String provider) { Log.w(TAG, "PROVEDOR " + provider + " DESABILITADO!"); } // @Override public void onLocationChanged(Location location) { longitudeGPS = location.getLongitude(); latitudeGPS = location.getLatitude(); Log.d(TAG,"LocationChangedGPS LAT: "+latitudeGPS+" longi: "+longitudeGPS); gpsComSinal = true; } }; LocationListener locationListenerNET = new LocationListener() { // @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO locationListenerNET onStatusChanged Log.d("Contele", "Provedor foi mudado"); } // @Override public void onProviderEnabled(String provider) { Log.i(TAG, "PROVEDOR " + provider + " HABILITADO!"); } // @Override public void onProviderDisabled(String provider) { Log.i(TAG, "PROVEDOR " + provider + " DESABILITADO!"); } @Override public void onLocationChanged(Location location) { longitudeNET = location.getLongitude(); latitudeNET = location.getLatitude(); Log.d(TAG,"LocationChangedNET LAT: "+latitudeNET+" longi: "+longitudeNET); netComSinal = true; } }; 

码:

 public void initProviders() { localizacao = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); localizacao.removeUpdates(locationListenerNET); localizacao.removeUpdates(locationListenerGPS); localizacao.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGPS); localizacao.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNET); Log.d(TAG,"EsperaGPS"); Handler esperaGPS = new Handler() { public void handleMessage(Message msg) { requestGPS(); } }; Message msgEsperaGPS = Message.obtain(); msgEsperaGPS.what = 0; esperaGPS.sendMessageDelayed(msgEsperaGPS, 35000); } public void requestGPS() { if (gpsComSinal) { Log.d(TAG,"PEGO SINAL DE GPS"); rastreio = "GPS"; longitude = longitudeGPS; latitude = latitudeGPS; Log.d(TAG, "Utilizando provedor GPS."); localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); } else { Log.d(TAG,"Sem GPS... pegar NEt"); // Setando os valores para usar network localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); localizacao .requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNET); Log.d(TAG,"EsperaNET"); requestNET(); } } public void requestNET() { if (netComSinal) { Log.d(TAG,"PEGO SINAL DE NET"); rastreio = "NET"; longitude = longitudeNET; latitude = latitudeNET; Log.d(TAG, "Utilizando provedor NET."); localizacao.removeUpdates(locationListenerNET); } else { localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); Log.d(TAG,"Sem sinal"); } } 

三星Galaxy S3报告: 在这里输入图像说明

依然连续4天获得“Sem sinal”。

Galaxy Y和LG Optimus l5已经发生这个问题

我已经做了另一个testing,看看其他应用程序是否获得了NET的职位,我发现他们正在通过相同的问题,他们无法获得NET的位置只是GetLastknowLocation; testing我用了这个问题的Galaxy S3,我禁用了GPS提供商。 (在Cerberustesting)。

我找不到任何解释,说明为什么NETWORKSLOCATIONS的听众停止给职位,但可能是因为它不应该停留两三天。

我已经做了一些其他的testing,看看这个问题是否正在我的应用中发生,我发现他们正在通过相同的问题,例如在Cerberus:

我使用“Sem sinal”问题在手机(Galaxy S3)中禁用GPS提供程序,请查看:

我的报告: 在这里输入图像说明

和Cerberus(打印采取在14/05/2013)报告: 在这里输入图像说明

但是当我打开谷歌地图,似乎工作正常,我试图移动到一个距离的地方,看看是否会显示GetLastknowLocation ,但没有,谷歌地图把我放在正确的地方,所以我意识到谷歌地图使用motionevent移动我在地图上;

同时打印Google地图的日志以获取NetWorkProvider:

正常情况下:

在这里输入图像说明

Sem sinal案例:

在这里输入图像说明

我遇到了与networking提供商类似的问题,只有解决scheme是强制设备重新启动 。 虽然谷歌地图总是显示正确的位置,因为它除了networking位置提供商之外还使用其他传感器信息。

但是,这是一个好消息 ,不是很久以前,Google通过Google Play服务框架(Google Play Service Framework)推出了Fused Location Provider API,它比GPS /networking位置提供商更容易使用。

兼容达到API级别8,现在当我得到这个networking提供商这个奇怪的问题,同时融合位置给了我准确的位置(无需设备重新启动)。

我已经在这里提交了一个工作FusedLocationtesting项目 ,你可以克隆和testing自己。

以下是代码片段: –

 package com.example.fusedLoctionTest.service; import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient; import com.google.android.gms.location.LocationClient; import com.google.android.gms.location.LocationRequest; public class FusedLocationService extends Service implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener{ private static final LocationRequest REQUEST = LocationRequest.create() .setInterval(0) .setFastestInterval(0) .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); public static final String LOCATION_RECEIVED = "fused.location.received"; private Long now; private LocationClient mLocationClient; private final Object locking = new Object(); private Runnable onFusedLocationProviderTimeout; private Handler handler = new Handler(); @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); now = Long.valueOf(System.currentTimeMillis()); mLocationClient = new LocationClient(this, this, this); mLocationClient.connect(); return START_STICKY; } @Override public void onConnected(Bundle bundle) { Log.d("FusedLocationService", "Fused Location Provider got connected successfully"); mLocationClient.requestLocationUpdates(REQUEST,this); onFusedLocationProviderTimeout = new Runnable() { public void run() { Log.d("FusedLocationService", "location Timeout"); Location lastbestStaleLocation=getLastBestStaleLocation(); sendLocationUsingBroadCast(lastbestStaleLocation); if(lastbestStaleLocation!=null) Log.d("FusedLocationService", "Last best location returned ["+lastbestStaleLocation.getLatitude()+","+lastbestStaleLocation.getLongitude()+"] in "+(Long.valueOf(System.currentTimeMillis())-now)+" ms"); if(mLocationClient.isConnected()) mLocationClient.disconnect(); } }; handler.postDelayed(onFusedLocationProviderTimeout, 20000);//20 sec } private void sendLocationUsingBroadCast(Location location) { Intent locationBroadcast = new Intent(FusedLocationService.LOCATION_RECEIVED); locationBroadcast.putExtra("LOCATION", location); locationBroadcast.putExtra("TIME", Long.valueOf(System.currentTimeMillis()-now) +" ms"); LocalBroadcastManager.getInstance(this).sendBroadcast(locationBroadcast); stopSelf(); } @Override public void onDisconnected() { Log.d("FusedLocationService","Fused Location Provider got disconnected successfully"); stopSelf(); } @Override public void onLocationChanged(Location location) { synchronized (locking){ Log.d("FusedLocationService", "Location received successfully ["+location.getLatitude()+","+location.getLongitude()+"] in "+(Long.valueOf(System.currentTimeMillis()-now))+" ms"); handler.removeCallbacks(onFusedLocationProviderTimeout); if(mLocationClient.isConnected()) mLocationClient.removeLocationUpdates(this); sendLocationUsingBroadCast(location); if(mLocationClient.isConnected()) mLocationClient.disconnect(); } } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.d("FusedLocationService", "Error connecting to Fused Location Provider"); } public Location getLastBestStaleLocation() { Location bestResult = null; LocationManager locMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Location lastFusedLocation=mLocationClient.getLastLocation(); Location gpsLocation = locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER); Location networkLocation = locMgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (gpsLocation != null && networkLocation != null) { if (gpsLocation.getTime() > networkLocation.getTime()) bestResult = gpsLocation; } else if (gpsLocation != null) { bestResult = gpsLocation; } else if (networkLocation != null) { bestResult = networkLocation; } //take Fused Location in to consideration while checking for last stale location if (bestResult != null && lastFusedLocation != null) { if (bestResult.getTime() < lastFusedLocation.getTime()) bestResult = lastFusedLocation; } return bestResult; } @Override public IBinder onBind(Intent intent) { return null; } } 

我有完全相同的问题,唯一的解决办法是重新启动设备。 有趣的是,没有一个应用程序有一个位置信息,除了谷歌地图。
谷歌地图应用程序find一个位置!

PS在服务中使用LocationListener,所以绝对不是引用错误,死对象等问题。

我仍然有这个问题。 但我仍然在寻找答案,我试图在NETWORK_PROVIDER的监听器中实现这个:

 public void onStatusChanged(final String provider, final int status, final Bundle extras) { switch( status ) { case LocationProvider.AVAILABLE: // ... break; case LocationProvider.OUT_OF_SERVICE: // ... break; case LocationProvider.TEMPORARILY_UNAVAILABLE: // ... break; } } 

因为: OUT_OF_SERVICE如果服务提供者没有服务,而且这个预计在不久的将来也不会改变; TEMPORARILY_UNAVAILABLE如果提供者暂时不可用,但预计很快可用; 如果提供者当前可用,则为可用。 onStatusChanged

我认为OUT_OF_SERVICE是我的问题,到目前为止还没有解决scheme,只是重新启动设备,然后我试图做一些报告,当这种情况发生时,我要求用户reebot设备,但很less设备recive这个状态。

似乎一个开放的错误,在Android开源项目,问题跟踪报告的networking提供商问题: https : //code.google.com/p/android/issues/detail? id = 57707 。 简而言之:2013年7月17日发布的问题 – 上一篇博客2015年1月7日,Android 4.1.x出现问题,出现在各种设备上,“未在最新的Play服务库中解决”,没有在Blog中提出解决方法。

我明白我们的问题中的一些事情; 你调用requestGPS方法,然后dicover它的位置。如果GPS启用,通过GPS获得。 另外通过NET的gott。 当调用requestGPS和控件提供者比得到经纬度,但删除更新(不要因为你删除更新触发呼叫);

 if (gpsComSinal) { Log.d(TAG,"PEGO SINAL DE GPS"); rastreio = "GPS"; longitude = longitudeGPS; latitude = latitudeGPS; Log.d(TAG, "Utilizando provedor GPS."); // if you remove update don't call onLocationChanged localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); } else { Log.d(TAG,"Sem GPS... pegar NEt"); // Setando os valores para usar network localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); localizacao.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNET); Log.d(TAG,"EsperaNET"); requestNET(); } 

当手机的GPS正在运行并收到信号时,NETWORK_PROVIDER不会更新。 如果您closuresGPS并强制手机从networking获取其位置,则您将再次开始获取更新。

我想这是因为你的应用程序在后台被“杀死”。 我以前遇到过这个问题,我通过在服务中移动LocationListener的创build来解决这个问题。 一定要保持对听众的参考。 它只是可以解决问题。