Обновляйте GPS-приемник каждые 5 секунд - PullRequest
1 голос
/ 19 августа 2011

Я должен обновлять слушателя каждые 5 секунд.Но это не так.Что может быть не так с моим кодом?

Большое спасибо за любую помощь!

package com.example.android.lbs;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.sql.Date;
import java.text.SimpleDateFormat;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class LbsGeocodingActivity extends Activity {

    public static final String LOG_TAG = "<<< ------------ >>> GeocodingActivity <<< ------------ >>>";

    TextView tv;
    int ScreenOutputCount;
    String newTrip;

    private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 0; // in Meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 5000; // in Milliseconds, 5 secconds

    protected LocationManager lm;
    MyLocationListener locationL = new MyLocationListener();

    protected Button retrieveLocationButton;
    //Log.e(LOG_TAG, e.toString());

    @Override
    public void onCreate(Bundle savedInstanceState) {

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

        try {
            View.OnClickListener handler = new View.OnClickListener(){
                public void onClick(View v) {
                    //we will use switch statement and just
                    //get thebutton's id to make things easier
                    switch (v.getId()) {

                        case R.id.trip_start: 
                            tripStart();
                            break;
                        case R.id.trip_end: 
                            tripEnd();
                        break;
                    }
                }
            };

            //we will set the listeners
            findViewById(R.id.trip_start).setOnClickListener(handler);
            findViewById(R.id.trip_end).setOnClickListener(handler);

            }catch(Exception e){
                 Log.e("Android Button Tutorial", e.toString());
            }

    }    

    public void tripStart(){

        File originalDirectories = new File( Environment.getExternalStorageDirectory() + "/Android/GpsTracker/" );
        if( !originalDirectories.exists() ){
            originalDirectories.mkdirs();
        }

        LbsGeocodingActivity.this.newTrip = getNewFileName();
        LbsGeocodingActivity.this.ScreenOutputCount = 1;
        LbsGeocodingActivity.this.tv = (TextView) this.findViewById( R.id.thetext );
        LbsGeocodingActivity.this.tv.setText("Location Updates: \n");

        LbsGeocodingActivity.this.lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        LbsGeocodingActivity.this.lm.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 
                MINIMUM_TIME_BETWEEN_UPDATES, 
                MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
                this.locationL
        );

        Toast.makeText(getBaseContext(), "New Trip Started.", Toast.LENGTH_SHORT).show();

    }

    public String getNewFileName(){
        SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdfDateTime.format(new Date(System.currentTimeMillis()));    
    }

    public void tripEnd(){
        LbsGeocodingActivity.this.lm.removeUpdates( this.locationL );
        Toast.makeText(getBaseContext(), "Trip Ended.", Toast.LENGTH_SHORT).show();
    }

    protected void showCurrentLocation() {
        try{
            Location location = LbsGeocodingActivity.this.lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            if (location != null) {
                String show_curent = "Longitude: " + location.getLongitude()
                                        + " | Latitude: " + location.getLatitude();

                //LbsGeocodingActivity.this.tv.append( show_curent );

                Toast.makeText(getBaseContext(), show_curent, Toast.LENGTH_SHORT).show();

                //LbsGeocodingActivity.this.ScreenOutputCount = LbsGeocodingActivity.this.ScreenOutputCount + 1;
            }else{
                Toast.makeText(getBaseContext(), "Last Know Location Not Found.", Toast.LENGTH_SHORT).show();
            }
        }catch( NullPointerException e){
            Log.e("Android Button Tutorial", e.toString() );
        }
    }   

    private class MyLocationListener implements LocationListener {

        public void onLocationChanged(Location location) {
            LbsGeocodingActivity.this.tv.append( LbsGeocodingActivity.this.ScreenOutputCount
                    + " | Longitude: " + location.getLongitude()
                    + " | Latitude: " + location.getLatitude() + "\n" );

            LbsGeocodingActivity.this.ScreenOutputCount = LbsGeocodingActivity.this.ScreenOutputCount + 1;

            logLocationUpdate( location.getLongitude(), location.getLatitude() );
        }

        public void logLocationUpdate( double longitude, double latitude){
            try {

                SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String timestamp =  sdfDateTime.format(new Date(System.currentTimeMillis()));

                String logString = timestamp + "::" +
                                    longitude + "::" +
                                    latitude + "\n";

                String sdcard = Environment.getExternalStorageDirectory() + "/Android/GpsTracker/";

                //then write the file
                final String TESTSTRING = new String(logString);

                File gpxfile = new File(sdcard, LbsGeocodingActivity.this.newTrip + ".txt" );
                FileWriter gpxwriter = new FileWriter( gpxfile, true );
                BufferedWriter out = new BufferedWriter( gpxwriter );
                out.write(TESTSTRING);
                out.close();

            }catch(Exception e){
              Log.e("GPS Tracker", e.getMessage());
            }
        }
        public void onStatusChanged(String s, int i, Bundle b) {
            /*
            Toast.makeText(LbsGeocodingActivity.this, "Provider status changed",
                    Toast.LENGTH_LONG).show();
            */
        }

        public void onProviderDisabled(String s) {
            Toast.makeText(LbsGeocodingActivity.this,
                    "Provider disabled by the user. GPS turned off",
                    Toast.LENGTH_LONG).show();
        }

        public void onProviderEnabled(String s) {
            Toast.makeText(LbsGeocodingActivity.this,
                    "Provider enabled by the user. GPS turned on",
                    Toast.LENGTH_LONG).show();
        }

    }

}

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Как заявил Дэвид Олссон, MINIMUM_TIME_BETWEEN_UPDATES только предотвращает слишком частый запрос слушателя.Если вы хотите регулярно requestLocationUpdates, вы должны использовать Timer и TimerTask и запускать requestLocationUpdates каждые 5 секунд

schedule(TimerTask task, long delay, long period)
Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.
3 голосов
/ 19 августа 2011

Если установить значение 5000 мс, это не обязательно означает, что вы будете получать местоположение каждую 5-ю секунду. Время - более или менее лучший сценарий.

minTime минимальный интервал времени для уведомлений в миллисекундах. Это поле используется только как подсказка для экономии энергии, и фактическое время между обновлениями местоположения может быть больше или меньше, чем это значение. http://developer.android.com/reference/android/location/LocationManager.html

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...