我正在开发一个应用程序,可以在服务中全天 6 和 6 分钟内获取手机的位置,它工作正常,但有时该方法OnLocationChanged
网络提供商侦听器的停止被调用,我不知道为什么。
由于某种原因,它停止被调用,但当我手动启用或禁用提供程序时,提供程序已启用且列表器正在工作,onProviderEnabled
and onProviderDisabled
叫做。
它只是发生在NETWORK_PROVIDER
, the 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;
}
};
Code:
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");
}
}
Report in a Samsung Galaxy S3:
仍然连续 4 天获得“Sem sinal”。
Galaxy Y 和 LG Optimus l5 已出现此问题
我做了另一个测试,看看其他应用程序是否获得了 NET 位置,我发现它们通过了同样的问题,它们无法仅通过 GetLastknowLocation 获得 NET 位置;为了测试我使用的 Galaxy S3 是否存在此问题,我禁用了 GPS 提供商。 (在 Cerberus 中测试)。
我找不到任何解释为什么 NETWORKSLOCATIONS 侦听器停止提供位置,但这可能是因为它不应该连续工作 2 或 3 天。
我已经对其他应用程序进行了一些测试,看看这个问题是否只发生在我的应用程序中,并且我发现它们正在通过相同的问题,例如在 Cerberus 中:
我在手机(Galaxy S3)中禁用了 GPS 提供商,并出现“Sem sinal”问题,请看一下:
My report:
And Cerberus(print taken in 14/05/2013) report:
但是当我打开谷歌地图时,它似乎工作正常,我尝试移动到远处的地方,看看它是否会显示GetLastknowLocation
,但是没有,谷歌地图当时把我放在了正确的位置,所以我意识到谷歌地图正在使用motionevent在地图上移动我;
并打印 Google Maps 的 Log 以获取 NetWorkProvider:
正常情况:
典型案例: