我正在开发一个应用程序,该应用程序可以在服务中 6 分钟和 6 分钟内全天获取手机的位置,它工作正常,但有时OnLocationChanged
网络提供商侦听器的方法停止被调用,我不知道为什么。
它由于某种原因停止被调用,但是当我手动启用或禁用 Provider 并被调用时,Provider 已启用并且 Lister 正在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");
}
}
三星 Galaxy S3 中的报告:
仍然连续 4 天获得“Sem sinal”。
Galaxy Y 和 LG Optimus l5 已经出现了这个问题
我进行了另一项测试,看看其他应用程序是否获得了 NET 位置,我发现它们通过了同样的问题,它们无法仅通过 GetLastknowLocation 获得 NET 位置;测试我使用 Galaxy S3 解决了这个问题,并禁用了 GPS Provider。(在 Cerberus 中测试)。
我找不到任何解释为什么 NETWORKSLOCATIONS 听众停止给出位置,但这可能是因为它不应该连续工作 2 或 3 天。
我已经对其他应用程序进行了一些测试,以查看这个问题是否只是在我的应用程序中发生,我发现它们正在通过相同的问题,例如在 Cerberus 中:
我用“Sem sinal”问题禁用了手机(Galaxy S3)中的 GPS 提供程序,看看:
我的报告:
和 Cerberus(打印于 2013 年 5 月 14 日)报告:
但是当我打开谷歌地图时它似乎工作正常,我试图移动到一个较远的地方,看看它是否会显示GetLastknowLocation
,但是没有,谷歌地图把我放在正确的地方,所以我意识到谷歌Maps 正在使用 motionevent 在地图中移动我;
并打印 Google Maps 的 Log 以获取 NetWorkProvider:
正常情况:
标准案例: