Как узнать текущую широту и долготу без использования карт Google для Android

Я пытаюсь получить текущее местоположение пользователя либо по GPS, либо по провайдеру местоположения, но каждое решение, которое я пробовал (многие из stacksoverflow и google, youtube также), дает нулевое значение в качестве широты и долготы.

Вот код, который я использую

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        criteria.setAltitudeRequired(false);
        criteria.setSpeedRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(false);

        double lat = 0;
        double lng = 0;
        provider = locationManager.getBestProvider(criteria, false);

        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;
        }
        Location location = locationManager.getLastKnownLocation(provider);
        if (location != null)
        {
            lat = location.getLatitude();
            lng = location.getLongitude();
            Toast.makeText(this,"Location"+lat+" "+lng+" ",Toast.LENGTH_LONG).show();

        }else
            Toast.makeText(this,"Location"+lat+" "+lng+" ",Toast.LENGTH_LONG).show();

Приведенный выше код всегда дает 0,0 и 0,0 как широту и долготу.

Я также включил разрешения в Android Manifest:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Любые предложения, пожалуйста?


person U.Ahsan    schedule 13.09.2017    source источник
comment
developer.android.com/guide/topics/location/strategies.html   -  person CommonsWare    schedule 13.09.2017


Ответы (2)


Это все, что я использовал в своем проекте. Надеюсь, поможет!

Заявления:

Location location;
    LocationManager locationManager;
    String provider; 

onCreate:

  locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            provider = locationManager.getBestProvider(new Criteria(), false);

        locationManager.requestLocationUpdates(provider, 400, 1, this);

        location = locationManager.getLastKnownLocation(provider);

        lat = location.getLatitude(); long = location.getLongitude();
person Radu Serse    schedule 13.09.2017
comment
Вы импортировали это? import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; - person Radu Serse; 14.09.2017
comment
Да, я импортировал все это - person U.Ahsan; 14.09.2017

    public static void getLocation(final Context context, final Looper looper, final LocationUpdateListener locationUpdateListener, final LocationListener locationListener) {


    try {
        boolean isProviderEnabled;
        Location location;
        final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        isProviderEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (isProviderEnabled) {
            if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, locationListener, looper);
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                            locationManager.removeUpdates(locationListener);
                        }
                        getBackupLocation(context, looper, locationUpdateListener, locationListener);
                    }
                }, 10000);

                return;

            }
        }
        isProviderEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (isProviderEnabled) {

            locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, locationListener, looper);
            return;

        }
        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        if (location != null) {
            if (locationUpdateListener != null) {
                locationUpdateListener.onLocationUpdate(location);
                locationManager.removeUpdates(locationListener);
            }
            return;
        }

        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location != null) {
            if (locationUpdateListener != null) {
                locationUpdateListener.onLocationUpdate(location);
                locationManager.removeUpdates(locationListener);
            }
            return;

        }

        float defaultValue = -10000;
        SharedManager sharedManager = SharedManager.getInstance();
        double lat = sharedManager.getDoubleValue(SharedManager.LAT, defaultValue);
        double lng = sharedManager.getDoubleValue(SharedManager.LNG, defaultValue);

        if (lat != defaultValue && lng != defaultValue) {
            location = new Location(LocationManager.PASSIVE_PROVIDER);
            location.setLatitude(lat);
            location.setLongitude(lng);
            if (locationUpdateListener != null) {
                locationUpdateListener.onLocationUpdate(location);
                locationManager.removeUpdates(locationListener);
            }
            return;
        }
        location = new Location(LocationManager.PASSIVE_PROVIDER);
        location.setLatitude(PASSIVE_LAT);
        location.setLongitude(PASSIVE_LONG);
        if (locationUpdateListener != null) {
            locationUpdateListener.onLocationUpdate(location);
            locationManager.removeUpdates(locationListener);
        }

}
    catch(
Exception e)

    {
        //No Location
        Location location = new Location(LocationManager.PASSIVE_PROVIDER);
        location.setLatitude(PASSIVE_LAT);
        location.setLongitude(PASSIVE_LONG);
        if (locationUpdateListener != null) {
            locationUpdateListener.onLocationUpdate(location);
        }
    }

  }

Рабочая функция, которая проверяет GPS, сеть и LastKnownLocation .. Мое предложение: сначала используйте LastKnownLocation, затем Netowrk и last Resort как GPS .. меньше использования батареи.

Результаты определения местоположения возвращаются слушателям.

person Itzik Samara    schedule 13.09.2017