Служба GPS не используется, если она включена в Activity

Я пишу код, чтобы иметь возможность использовать локализацию (на основе GPS, если она доступна, иначе на основе сети). Все работает нормально, если я вхожу в свою деятельность с включенным GPS на своем мобильном телефоне. Но если я вхожу в действие с выключенным GPS, а затем включаю GPS, в то время как в действии ничего не происходит, и местоположение на основе СЕТИ все еще активно, а не переключается на основе GPS.

Я что-то пропустил ? Спасибо

public class MapActivity extends Activity implements LocationListener {

    //Used CameraPosition attributes
    private final int MAP_BEARING = 69;
    private final int SETUP_ZOOM = 16;
    private final int AT_POSITION_ZOOM = 19;
    private final int UPDATE_FREQUENCY = 20000; //Update frequency (ms)
    private final LatLng MAP_CENTER = new LatLng(44.80736, -0.596572);

    private CheckBox mServices, mRestauration, mBuildings;
    private Resources mResources;
    private GoogleMap mMap;
    private LocationManager mLocationManager;
    private Marker mCurrentLocation;
    private ArrayList<Marker> mServicesMarkers, mRestaurationMarkers, mBuildingsMarkers;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        mResources = getResources();
        mServices = (CheckBox) findViewById(R.id.services_check);
        mRestauration = (CheckBox) findViewById(R.id.restauration_check);
        mBuildings = (CheckBox) findViewById(R.id.buildings_check); 
        setUpLocationServices();
    }

    public void setUpLocationServices() {
        mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        String provider = mLocationManager.getBestProvider(criteria, true);
        Location location = mLocationManager.getLastKnownLocation(provider);
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        LatLng currentPosition = new LatLng(latitude, longitude);

        mCurrentLocation = mMap.addMarker(new MarkerOptions()
        .position(currentPosition)
        .title("Votre position")
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.user_location_marker)));   

        if (location != null)
            onLocationChanged(location);
        if (isGpsEnabled())
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        else
            mLocationManager.requestLocationUpdates(provider, UPDATE_FREQUENCY, 0, this);

    }

    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation.remove();
        LatLng currentPosition = new LatLng(location.getLatitude(), location.getLongitude());
        mCurrentLocation = mMap.addMarker(new MarkerOptions()
        .position(currentPosition)
        .title("Votre position")
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.user_location_marker)));      
    }

    public boolean isGpsEnabled() {
        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        return service.isProviderEnabled(LocationManager.GPS_PROVIDER);
    }

    @Override
    public void onProviderDisabled(String provider) {
        mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (isGpsEnabled()) 
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,  this);
        else 
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, UPDATE_FREQUENCY, 0, this);               
    }

    @Override
    public void onProviderEnabled(String provider) {
        mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (isGpsEnabled())
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        else 
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, UPDATE_FREQUENCY, 0, this);           
    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub
    }
}

person Stefan Mijatovic    schedule 11.03.2013    source источник
comment
Нет идей по поводу проблемы? знак равно   -  person Stefan Mijatovic    schedule 13.03.2013


Ответы (1)


Проблема, кажется, здесь:

  if (isGpsEnabled())
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
  else
        mLocationManager.requestLocationUpdates(provider, UPDATE_FREQUENCY, 0, this);

Вы запускаете этот код только один раз, в onCreate(). Если вы хотите получать обновления местоположения после включения GPS, вам нужно попросить об этом. На современных устройствах я предпочитаю использовать API определения местоположения службы Google Play. с провайдером Fused Location. Именно так я реализовал свое последнее коммерческое приложение, возвращаясь к GPS, только если не был установлен Google Play.

Другой вариант, если вы просмотрите эту ссылку, на isBetterLocation метод, вы можете сравнить текущее значение с новым и выбрать лучшее из двух. Таким образом, если у вас есть один и вы получаете другой, вы можете решить, лучше ли это место, чем раньше.

person David S.    schedule 13.12.2013