我正在开发一个可以在服务中全天花费6和6分钟的时间来定位手机的应用程序,它可以正常工作,但有时网络提供商侦听器的方法OnLocationChanged
不再被调用,而我不不知道为什么。
出于某种原因停止调用,但是提供程序已启用,并且列表器正在工作,当我手动启用或禁用提供程序时,会调用onProviderEnabled
和onProviderDisabled
。
NETWORK_PROVIDER
发生了,GPS_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");
}
}
[在Samsung Galaxy S3中的报告:“ >>
连续4天仍收到“ Sem sinal”。
此问题已在Galaxy Y和LG Optimus l5上发生
我进行了另一项测试,以查看其他应用程序是否具有NET位置,我发现它们通过了相同的问题,它们不能仅通过GetLastknowLocation获得NET位置;测试我是否曾使用Galaxy S3解决此问题,并禁用了GPS提供程序。 (在Cerberus中测试)。
关于NETWORKSLOCATIONS侦听器为何停止给出位置,我找不到任何解释,但这可能是因为它应该连续2或3天不停止工作。
我已经对其他应用程序进行了一些测试,以查看我的应用程序是否正在发生此问题,我发现它们针对相同的问题通过了测试,例如在Cerberus中:
我禁用了带有“ Sem sinal”问题的手机(Galaxy S3)中的GPS Provider,请看一下:
我的报告:“ >>
和Cerberus(打印于2013年5月14日)报告:
但是当我打开Google Maps似乎可以正常工作时,我试图移到一个远处,看看它是否会显示GetLastknowLocation
,但是不,google maps暂时将我放在正确的位置,因此我意识到Google Maps正在使用motionevent在地图上移动我;
并且还要打印Google Maps日志以获取NetWorkProvider:
正常情况:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9MU25RMC5wbmcifQ==” alt =“在此处输入图像描述”>
正弦案例:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8xd0FCbi5qcGcifQ==” alt =“在此处输入图像描述”>
[我正在开发一个可以在服务中全天花费6和6分钟的时间来定位手机的应用程序,它可以正常工作,但是有时网络提供商的OnLocationChanged方法...
网络提供商
中遇到过类似的问题,唯一的解决方法是强制设备重新启动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(如果提供程序暂时不可用,但预计不久将可用);如果提供者当前可用,则可用。
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();
}