我正在编写一个使用GPS进行本地化服务的应用。当用户尝试使用已禁用GPS的应用程序时,会弹出一个对话框。现在,用户可以最小化应用程序并更改GPS设置。当他重新打开应用程序时,它会在onResume()中检测到设置已更改并关闭对话框。 这工作正常,但用户有第二种方式启用GPS:状态栏。当状态栏打开和关闭时,onResume()和onWindowFocusChanged()都不会被调用,因此我不会检测用户何时启用GPS。
有没有办法检测状态栏的打开?
我可以通过LocationListener来实现,但我想按照上面的描述进行操作。
提前致谢!
我在android-dev IRC找到了帮助。现在,我正在使用观察者来注意设置here之类的更改。因此,我检测所有设置更改,即使它们是通过通知栏完成的,也不会从LocationManager请求更新。 谢谢你的帮助!
答案 0 :(得分:1)
要使用状态栏收听用户已启用的GPS,您可以通过位置管理器设置监听器以进行更改:
private class DisabledGPSListener implements LocationListener{
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
locationManager.removeUpdates(this);
locationManager.addGpsStatusListener(gpsStatusListener);
}
将此侦听器设置在onCreate()
中if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
locationManager.addGpsStatusListener(gpsStatusListener);
}else{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, new DisabledGPSListener());
}
其中gpsStatusListener是以下实例:
private class GPSStatuslistener implements GpsStatus.Listener {
@Override
public void onGpsStatusChanged(int event) {
switch (event) {
case GpsStatus.GPS_EVENT_STARTED:
Log.d(TAG, "ongpsstatus changed started");
//TODO: your code that get location updates, e.g. set active location listener
break;
case GpsStatus.GPS_EVENT_STOPPED:
Log.d(TAG, "ongpsstatus changed stopped");
createGpsDisabledAlert();
}
}
答案 1 :(得分:0)
您正在寻找的是LocationManager.addGpsStatusListener吗?
答案 2 :(得分:0)
这并不能直接解决您的问题,但您可能会发现更容易为用户打开设置:
startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 0);