GPS Location не получает данные после добавления функции, чтобы проверить, открыт ли GPS или нет - PullRequest
0 голосов
/ 18 сентября 2018


У меня есть простой класс, чтобы получить текущее местоположение пользователя, с которым он работал без проблем.
после добавления новой функции, прежде чем я начал получать текущее местоположение пользователя, чтобы проверить, открыт ли GPS илинет, если он не открылся, он приводит пользователя к файлу настроек, чтобы открыть GPS, а затем начинает брать его местоположение, сейчас я жду очень долго, и местоположение не появляется.вот код, который я использую для получения текущего местоположения.
SingleShotLocationProvider

public class SingleShotLocationProvider {

    public static interface LocationCallback {
        public void onNewLocationAvailable(GPSCoordinates location);
    }
    public static boolean GPSOpen = false;
    public static boolean NetworkOpen = false;

    // calls back to calling thread, note this is for low grain: if you want higher precision, swap the
    // contents of the else and if. Also be sure to check gps permission/settings are allowed.
    // call usually takes <10ms
    public static void requestSingleUpdate(final Context context, final LocationCallback callback) {
        final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        NetworkOpen = isNetworkEnabled;
        if (isNetworkEnabled) {
            Log.i("NETWORK_OPEN", "YES NETWORK Open");
            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_COARSE);
            locationManager.requestSingleUpdate(criteria, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    callback.onNewLocationAvailable(new GPSCoordinates(location.getLatitude(), location.getLongitude()));
                }

                @Override public void onStatusChanged(String provider, int status, Bundle extras) { }
                @Override public void onProviderEnabled(String provider) { }
                @Override public void onProviderDisabled(String provider) { }
            }, null);
        } else {
            boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            GPSOpen = isGPSEnabled;
            if (isGPSEnabled) {
                Log.i("GPS_OPEN", "YES GPS Opened");
                Criteria criteria = new Criteria();
                criteria.setAccuracy(Criteria.ACCURACY_FINE);
                locationManager.requestSingleUpdate(criteria, new LocationListener() {
                    @Override
                    public void onLocationChanged(Location location) {
                        callback.onNewLocationAvailable(new GPSCoordinates(location.getLatitude(), location.getLongitude()));
                    }

                    @Override public void onStatusChanged(String provider, int status, Bundle extras) { }
                    @Override public void onProviderEnabled(String provider) { }
                    @Override public void onProviderDisabled(String provider) { }
                }, null);
            }
            else {
                Toast.makeText(context, "Please Open GPS and retry", Toast.LENGTH_LONG).show();
                MainWindow w = (MainWindow)context;
                w.DisableTheProgressGPSClosed(); // i have a simple progress bar wait until the app get the location then it GONE
            }
        }
    }


    // consider returning Location instead of this dummy wrapper class
    public static class GPSCoordinates {
        public float longitude = -1;
        public float latitude = -1;

        public GPSCoordinates(float theLatitude, float theLongitude) {
            longitude = theLongitude;
            latitude = theLatitude;
        }

        public GPSCoordinates(double theLatitude, double theLongitude) {
            longitude = (float) theLongitude;
            latitude = (float) theLatitude;
        }
    }
}

вот функция, которую я использую, чтобы проверить, открыт GPS или нет.

public boolean turnGPSOn()
{
    LocationManager L = (LocationManager) getSystemService(LOCATION_SERVICE);

    if (!L.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        Toast.makeText(this, "Please open GPS", Toast.LENGTH_LONG).show();
        Intent I = new Intent(
                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivity(I);
        return true;
    }
    return false;
}

вот какЯ использую его, когда пользователь нажимает кнопку.

public void GetLocation() {
    if (turnGPSOn()) {
        return;
    }
    Log.i("Process_GPS_DATA", "Done process now GPS");
    progressBar.setVisibility(View.VISIBLE);
    foo(this);
}

Функция foo, которая вызывает здесь класс GPS.

public void foo(final Context context) {
    // when you need location
    // if inside activity context = this;
    SingleShotLocationProvider.requestSingleUpdate(context,
            new SingleShotLocationProvider.LocationCallback() {
                @Override public void onNewLocationAvailable(SingleShotLocationProvider.GPSCoordinates location) {
                    Log.i("Location", "my location is " + location.latitude + "," + location.longitude);
                    String BaseLocation = "https://www.google.com/maps/?q=" + location.latitude + "," + location.longitude + "";
                    StartSendRequest(location.longitude, location.latitude, BaseLocation);
                    Log.i("Google_URL", BaseLocation);
                }
            });
}

проблема в том, что все работает нормально, но я долго жду ине отображается местоположение, я не знаю, почему эта проблема, когда я делаю тест, я закрываю Android GPS, а затем сделать тест, местоположение не предоставляется, я тестирую тот же класс, прежде чем добавить проверить часть, и она работала нормально.
когдая тестирую в эмуляторе с уже открытым GPS, он работает и дает мне местоположение, когда я закрываю GPS, а затем проверяю снова, что он не работает, и я жду долгое время и ничего не показываю, так что я сделал не так.

...