Широта и долгота всегда обнуляются (GPS и TimerTask)

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

public void onClick(View v) {
isInternetPresent = cd.isConnectingToInternet();
if (isInternetPresent) {
try {
    gpt = new GPSTracker(MainActivity.this);
    System.out.println("Internet is present");
    setContentView(R.layout.tracklayout);
    TimerTask myTask = new TimerTask() {
        @Override
        public void run() {
            try {
            Log.d("flow", "" + "task()");
            gpt = new GPSTracker(MainActivity.this);
            lc = gpt.getLocation();
            if (gpt.canGetLocation()) {
                double latitude = gpt.getLatitude();
                double longitude = gpt.getLongitude();
                Log.d("latitude", "" + latitude);
                Log.d("longitude", "" + longitude);
                        runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),"Reached.. ",Toast.LENGTH_LONG).show();
                }
            });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    };
    Timer myTimer = new Timer();
    myTimer.schedule(myTask, 3000, 30000);
        } catch (Exception e) {
    e.printStackTrace();
    }
} else {
    alert.showAlertDialog(MainActivity.this,"Mobile Data is Off","Please Turn On mobile data to proceed", false);
    }

}
});

Широта и долгота всегда обнуляются, даже если я вручную ввел координаты через DDMS. С кодом GPSTracker проблем нет. Вне timertask он работал нормально. В чем проблема с этим кодом. Кто-нибудь, пожалуйста, помогите


person Sushin PS    schedule 19.02.2014    source источник


Ответы (3)


Проверьте эту ссылку,

В этом проверьте класс GPSTracker.java и этот код.

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}
@Override
public void onLocationChanged(Location location) {
}

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onProviderEnabled(String provider) {
}

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

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

Надеюсь, это поможет.

person i.n.e.f    schedule 19.02.2014
comment
этот код именно то, что у меня есть. он отлично работает, пока я звонил вне TimerTask. Но я хочу получить данные о местоположении в определенном интервале - person Sushin PS; 19.02.2014
comment
Вы пытались установить время в методе requestLocationUpdate? для этого кода locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); все еще не работает? - person i.n.e.f; 19.02.2014
comment
Да, это все еще не работает. Но когда я удалил TimerTask и перенес весь код внутри TimerTask наружу, то он отлично работает и показывает мне правильную широту и долготу. Есть ли способ сделать это повторно - person Sushin PS; 19.02.2014

Поскольку вы используете GPSTracker, если GPS не работает, вы не можете точно знать значения широты и долготы, вы не сможете получить точное местоположение. Это может занять несколько минут или секунд, потому что это зависит от множества ограничений, таких как ваше положение внутри здания, погода, качество оборудования вашего устройства и т. д., поскольку вы используете спутник для определения местоположения. Таким образом, мы можем сказать, что это зависит от устройства и настроек среды ( например, погода, расположение под небом/внутри или снаружи здания, качество аппаратного обеспечения устройства и т. д.).

Почему вы не используете NETWORK_PROVIDER?? если вы можете ... Если вы хотите получить приблизительное местоположение быстрее с помощью программы, чем вы можете получить местоположение с помощью NETWORK_PROVIDER, что не так точно, но может очень быстро определить местоположение.

Посетите для примеров

http://www.vogella.com/tutorials/AndroidLocationAPI/article.html

http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/

http://developer.android.com/guide/topics/location/strategies.html

person Jitesh Upadhyay    schedule 19.02.2014
comment
Класс GPSTracker я получил от androidhive.info. Я также использовал NETWORK_PROVIDER. У меня возникает эта проблема при проверке эмулятора. Я отправляю данные широты и долготы через DDMS. Я работал нормально, пока он был вне TimerTask - person Sushin PS; 19.02.2014
comment
в эмуляторе мы можем вручную ввести широту и долготу через DDMS. Работает всегда нормально - person Sushin PS; 19.02.2014
comment
да, я знаю, но у меня нет большого опыта работы с этим - person Jitesh Upadhyay; 19.02.2014

Не используйте таймер. Реализуйте LocationListener с этим действием. Пропишите коды в timertask, чтобы OnLocation изменился. Не нужно запускать в определенный интервал времени, потому что мы получаем те же данные, если находимся в одном и том же месте.

person Sushin PS    schedule 20.02.2014