Текущее местоположение пользователя не восстанавливается - PullRequest
0 голосов
/ 14 марта 2012

Это мой последний вопрос о GPS

Получение 0.0 для широты и долготы при отображении текущего местоположения на карте

Теперь вот код, который я использую для получения текущего местоположения пользователя.

 LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria crta = new Criteria();
        crta.setAccuracy(Criteria.ACCURACY_FINE);
        crta.setAltitudeRequired(false);
        crta.setBearingRequired(false);
        crta.setCostAllowed(true);
        crta.setPowerRequirement(Criteria.POWER_LOW);
        String provider = mlocManager.getBestProvider(crta, true);
        Location loc = null;
        if (provider != null) {
            loc = mlocManager.getLastKnownLocation(provider);
        }
        LocationListener mlocListener = new MyLocationListener();
        mlocListener.onLocationChanged(loc);
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                2000, 10, mlocListener);


public class MyLocationListener implements LocationListener{
    public MyLocationListener() {
    }

    @Override
    public void onLocationChanged(Location loc) {
        if (null != loc) {
        String Text = "Your current location is: \n" + "Latitude = \n"
        + loc.getLatitude() + "\nLongitude = \n" + loc.getLongitude();
        Toast.makeText(getApplicationContext(),Text,Toast.LENGTH_SHORT).show();

        GeoPoint myGeoPoint = new GeoPoint((int)(loc.getLatitude()*1E6),(int)(loc.getLongitude()*1E6));
         mpc.animateTo(myGeoPoint);
         mpc.setZoom(10);
         objMapView.invalidate();

        }
    }

    @Override
    public void onProviderDisabled(String provider){
        Toast.makeText(getApplicationContext(), "gps disabled",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderEnabled(String provider) {
        Toast.makeText(getApplicationContext(), "gps enabled",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }
}

Теперь проблема, с которой я сталкиваюсь, заключается в том, что при включении GPS мне не отображается текущее местоположение. Объект loc, loc = mlocManager.getLastKnownLocation (поставщик); всегда возвращает ноль. Я получил значение для провайдера как GPS.

Но если я выключу свое соединение gps, тот же объект loc будет иметь соответствующую информацию, и он будет работать частично корректно. Это означает, что это дает мне ближайшее местоположение. Я имею в виду полное местоположение города, где я сижу.

Но если я подключен к gps-соединению, это не дает мне даже местоположение города, не включается, если цикл только внутри класса слушателя местоположения. Я не понимаю, что здесь происходит.

Кто-нибудь может подсказать, как это решить?

Обновление:

Это значение, которое я получаю для объекта loc, если мой gps выключен

* Тысячу двадцать-три * Местоположение [mProvider = сеть, время изменения = 1331718353322, mLatitude = 12,9053401, mLongitude = 74,8359128, mHasAltitude = ложь, mAltitude = 0,0, mHasSpeed ​​= ложь, mSpeed ​​= 0,0, mHasBearing = ложь, mBearing = 0,0, mHasAccuracy = верно, mAccuracy = 36,0, mExtras = Пачка [mParcelledData.dataSize = 148]].

Но если GPS включен, loca возвращает ноль

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

CustomLocationManager.Java

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class CustomLocationManager {

    private LocationManager mLocationManager;
    private LocationValue locationValue;
    private Location networkLocation = null;
    private Location gpsLocation = null;

    private Timer mTimer;

    private boolean isGpsEnabled = false;
    private boolean isNetworkEnabled = false;

    private static CustomLocationManager _instance;

    private CustomLocationManager() {}

    public static CustomLocationManager getCustomLocationManager() {
        if (_instance == null) {
            _instance = new CustomLocationManager();
        }
        return _instance;
    }

    public LocationManager getLocationManager(Context context) {
        if (mLocationManager == null)
            mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        return mLocationManager;
    }

    public boolean getCurrentLocation(Context context, LocationValue result) {
        locationValue = result;
        if (mLocationManager == null)
            mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        try {
            isGpsEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {}

        try {
            isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {}

        if (!isGpsEnabled && !isNetworkEnabled)
            return false;

        if (isGpsEnabled)
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpsLocationListener);

        if (isNetworkEnabled)
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networkLocationListener);

        mTimer = new Timer();
        mTimer.schedule(new GetLastKnownLocation(), 20000);

        return true;
    }

    LocationListener gpsLocationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            mTimer.cancel();
            locationValue.getCurrentLocation(location);
            mLocationManager.removeUpdates(this);
            mLocationManager.removeUpdates(networkLocationListener);
        }

        public void onProviderDisabled(String provider) {}

        public void onProviderEnabled(String provider) {}

        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    private LocationListener networkLocationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            mTimer.cancel();
            locationValue.getCurrentLocation(location);
            mLocationManager.removeUpdates(this);
            mLocationManager.removeUpdates(gpsLocationListener);
        }

        public void onProviderDisabled(String provider) {}

        public void onProviderEnabled(String provider) {}

        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    private class GetLastKnownLocation extends TimerTask {
        CurrentLocationHandler handler;

        GetLastKnownLocation() {
            handler = new CurrentLocationHandler();
        }

        @Override
        public void run() {
            mLocationManager.removeUpdates(gpsLocationListener);
            mLocationManager.removeUpdates(networkLocationListener);

            if (isGpsEnabled)
                gpsLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

            if (isNetworkEnabled)
                networkLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            handler.sendEmptyMessage(0);
        }
    }

    private class CurrentLocationHandler extends Handler {
        @Override
        public final void handleMessage(Message msg) {
            if (gpsLocation != null && networkLocation != null) {

                if (gpsLocation.getTime() > networkLocation.getTime())
                    locationValue.getCurrentLocation(gpsLocation);
                else
                    locationValue.getCurrentLocation(networkLocation);

                return;
            }

            if (gpsLocation != null) {
                locationValue.getCurrentLocation(gpsLocation);
                return;
            }

            if (networkLocation != null) {
                locationValue.getCurrentLocation(networkLocation);
                return;
            }

            locationValue.getCurrentLocation(null);
        }
    }
}


LocationValue.Java

import android.location.Location;

public abstract class LocationValue {
    public abstract void getCurrentLocation(Location location);
}


YourActivity.Java

private void getCurrentLocation() {
        CustomLocationManager.getCustomLocationManager().getCurrentLocation(this, locationValue);
    }

    public LocationValue locationValue = new LocationValue() {
        @Override
        public void getCurrentLocation(Location location) {
            // You will get location here if the GPS is enabled
            if(location != null) {
                Log.d("LOCATION", location.getLatitude() + ", " + location.getLongitude());
            }
        }
    };


AndroidManifest.xml

  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
0 голосов
/ 14 марта 2012

Прежде всего, я не знаком с API определения местоположения Android, но вы пробовали GPS снаружи? Поскольку GPS не работает внутри зданий, довольно сложно определить местоположение вашего мобильного устройства, используя только ваш GPS. Находясь в помещении, обычно ваше местоположение «GPS» определяется с использованием соединения точки доступа WiFi.

...