принудительное обновление много раз: местоположение GPS в течение 3-6 секунд - PullRequest
0 голосов
/ 31 мая 2011

моему приложению нужно использовать новый текущий параметр GPS (обновлять каждые 3–8 секунд): широта и долгота. и я использую как: GPS-провайдер и сетевой провайдер. Я знаю, использовать для обновления параметров GPS

if(gps_enabled)
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);

if(network_enabled)
     lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);

Проблема: на самом деле, gps обновляется после каждой среды 40-50 секунд

Как я могу получить обновление GPS через 3-8 секунд ??

спасибо

Ответы [ 4 ]

2 голосов
/ 09 июня 2011

Я написал небольшое приложение, которое будет возвращать позицию, среднюю скорость и текущую скорость. Когда я запускаю его на своем телефоне (HTC Legend), он обновляется 1-2 раза в секунду. Вы можете использовать его, если хотите. вам просто нужно создать файл main.xml с 6 текстовыми представлениями, а затем добавить эту строку в ваш файл AndroidManifest.xmll:

package Hartford.gps;

import java.math.BigDecimal;

import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

public class GPSMain extends Activity implements LocationListener {

LocationManager locationManager;
LocationListener locationListener;

//text views to display latitude and longitude
TextView latituteField;
TextView longitudeField;
TextView currentSpeedField;
TextView kmphSpeedField;
TextView avgSpeedField;
TextView avgKmphField;

//objects to store positional information
protected double lat;
protected double lon;

//objects to store values for current and average speed
protected double currentSpeed;
protected double kmphSpeed;
protected double avgSpeed;
protected double avgKmph;
protected double totalSpeed;
protected double totalKmph;

//counter that is incremented every time a new position is received, used to calculate average speed
int counter = 0;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    run();
}

@Override
public void onResume() {
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this);
    super.onResume();
}

@Override
public void onPause() {
    locationManager.removeUpdates(this);
    super.onPause();
}

private void run(){

    final Criteria criteria = new Criteria();

    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setSpeedRequired(true);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW);
    //Acquire a reference to the system Location Manager

    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    // Define a listener that responds to location updates
    locationListener = new LocationListener() {

        public void onLocationChanged(Location newLocation) {

            counter++;

            //current speed fo the gps device
            currentSpeed = round(newLocation.getSpeed(),3,BigDecimal.ROUND_HALF_UP);
            kmphSpeed = round((currentSpeed*3.6),3,BigDecimal.ROUND_HALF_UP);

            //all speeds added together
            totalSpeed = totalSpeed + currentSpeed;
            totalKmph = totalKmph + kmphSpeed;

            //calculates average speed
            avgSpeed = round(totalSpeed/counter,3,BigDecimal.ROUND_HALF_UP);
            avgKmph = round(totalKmph/counter,3,BigDecimal.ROUND_HALF_UP);

            //gets position
            lat = round(((double) (newLocation.getLatitude())),3,BigDecimal.ROUND_HALF_UP);
            lon = round(((double) (newLocation.getLongitude())),3,BigDecimal.ROUND_HALF_UP);

            latituteField = (TextView) findViewById(R.id.lat);
            longitudeField = (TextView) findViewById(R.id.lon);             
            currentSpeedField = (TextView) findViewById(R.id.speed);
            kmphSpeedField = (TextView) findViewById(R.id.kmph);
            avgSpeedField = (TextView) findViewById(R.id.avgspeed);
            avgKmphField = (TextView) findViewById(R.id.avgkmph);

            latituteField.setText("Current Latitude:        "+String.valueOf(lat));
            longitudeField.setText("Current Longitude:      "+String.valueOf(lon));
            currentSpeedField.setText("Current Speed (m/s):     "+String.valueOf(currentSpeed));
            kmphSpeedField.setText("Cuttent Speed (kmph):       "+String.valueOf(kmphSpeed));
            avgSpeedField.setText("Average Speed (m/s):     "+String.valueOf(avgSpeed));
            avgKmphField.setText("Average Speed (kmph):     "+String.valueOf(avgKmph));

        }

        //not entirely sure what these do yet
        public void onStatusChanged(String provider, int status, Bundle extras) {}
        public void onProviderEnabled(String provider) {}
        public void onProviderDisabled(String provider) {}

    };

    // Register the listener with the Location Manager to receive location updates
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, locationListener);
}

//Method to round the doubles to a max of 3 decimal places
public static double round(double unrounded, int precision, int roundingMode)
{
    BigDecimal bd = new BigDecimal(unrounded);
    BigDecimal rounded = bd.setScale(precision, roundingMode);
    return rounded.doubleValue();
}


@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

}
2 голосов
/ 01 июня 2011
try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
                try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}

// lm является locationManager

Фактически.Я не использую условие: network_enabled или Network-провайдера, чтобы получить Местоположение.---> Это работает и новый код:

 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, locationListenerGps);

Причина, я не использую Network_Provider.Потому что, когда 2 GPS и сетевой провайдер, система будет использовать NEtwork_provider.Но в logcat я вижу, что смартфон не обновляет цикл «Слушатель» 3-6 с помощью Network_provider.En revanche, с GPS_PROVIDER, обновление смартфона всегда 3-6 с.

- впервые при открытии GPS;Мне нужно 30-50 секунд, чтобы получить первый слушатель.Но это нормально

0 голосов
/ 31 мая 2011

Взгляните на requestLocationUpdates (...)

public void requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)

Поскольку: Уровень API 1

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

Получение самого последнего местоположения может занять некоторое время.Если требуется непосредственное расположение, приложения могут использовать метод getLastKnownLocation (String).

В случае, если поставщик отключен пользователем, обновления будут остановлены и будет вызван метод onProviderDisabled (String).Как только провайдер снова включится, будет вызван метод onProviderEnabled (String) и снова начнутся обновления местоположения.

Частотой уведомления можно управлять с помощью параметров minTime и minDistance.Если minTime больше 0, LocationManager потенциально может отдыхать в течение миллисекунд minTime между обновлениями местоположения для экономии энергии.Если minDistance больше 0, местоположение будет транслироваться только в том случае, если устройство перемещается на счетчики minDistance.Чтобы получать уведомления как можно чаще, установите оба параметра на 0.

Фоновые службы должны быть осторожны при установке достаточно высокого значения minTime, чтобы устройство не потребляло слишком много энергии, оставляя GPS или беспроводные радиостанции включенными.все время.В частности, значения менее 60000 мс не рекомендуются.

Вызывающий поток должен быть потоком Looper, таким как основной поток вызывающего Activity.

Параметры

предоставляют имя поставщикапровайдера для регистрации

minTime минимальный интервал времени для уведомлений в миллисекундах.Это поле используется только как подсказка для экономии энергии, и фактическое время между обновлениями местоположения может быть больше или меньше этого значения.

minDistance минимальный интервал расстояния для уведомлений, в метрах

слушатель{#link LocationListener}, метод onLocationChanged (Location) которого будет вызываться для каждого обновления местоположения

0 голосов
/ 31 мая 2011

Параметр minTime requestLocationUpdates должен быть от 3000 до 8000

public void requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener, Looper looper)

minTime the minimum интервал времени для уведомлений в миллисекундах. Это поле используется только как подсказка для экономии энергии, и фактическое время между обновлениями местоположения может быть больше или меньше этого значения.

minDistance минимальный интервал расстояния для уведомлений, в метрах

...