开发者

How to collect location data every 10 seconds in Android

开发者 https://www.devze.com 2023-02-05 03:20 出处:网络
I wrote a GPSDataCollectService to collect location data every 10 seconds, but it did not report location in my HTC mobile phone, any wrong? could anyone help me?

I wrote a GPSDataCollectService to collect location data every 10 seconds, but it did not report location in my HTC mobile phone, any wrong? could anyone help me?

package com.android.example;

import java.util.Calend开发者_开发百科ar;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

public class GPSDataCollectorService extends Service {

    private static final String TAG = GPSDataCollectorService.class
            .getSimpleName();

    LocationManager locationManager;
    LocationListener gpsLocationListener;

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

    private Timer timer;

    private TimerTask collectTask = new TimerTask() {
        @Override
        public void run() {
            Log.i(TAG, "Timer task doing work: "
                    + Calendar.getInstance().getTimeInMillis());
            locationManager = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);
            gpsLocationListener = new GPSLocationListener();
            locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 10 * 1000L, 0,
                    gpsLocationListener);
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "Service creating");
        timer = new Timer("GPSDataCollectorTimer");
        timer.schedule(collectTask, 1000L, 10 * 1000L);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "Service destroying");
        locationManager.removeUpdates(gpsLocationListener);
        timer.cancel();
        timer = null;
    }

    private class GPSLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged: " + location.toString());
            locationManager.removeUpdates(gpsLocationListener);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged: " + status);
        }

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

        }

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

        }

    }

}


If your location is changed every 10 sec then only your LocationManager will track the new location. Otherwise it will use the same last known location.


Instead of using a LocationListener, you may want to use a Timer, within the TimerTask, maybe you can do something like this:

LocationManager lm = yourActivityReference.getSystemService(Context.LOCATION_SERVICE);
String provider = lm.getBestProvider(new Criteria(),true);
Location loc = lm.getLastKnownLocation (provider);

I haven't checked it, but if I do I will let know...

Regards.

EDIt: Let me try again with the "classic" approach.

public class GPSDataCollectorService extends Service {

    private static final String TAG = GPSDataCollectorService.class
            .getSimpleName();

    LocationManager locationManager;
    LocationListener gpsLocationListener;

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


    @Override
    public void onCreate() {
        super.onCreate();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        gpsLocationListener = new GPSLocationListener();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000L, 0, gpsLocationListener);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "Service destroying");
        locationManager.removeUpdates(gpsLocationListener);
    }

    private class GPSLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged: " + location.toString());
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged: " + status);
        }

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

        }

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

        }

    }

}

I don't think you need any Timer, since the Location updates will call your listener asynchronally and you can set the timeout. I haven't played much with GPS in Android, but there must be plenty of examples out there.


The location update interval can be controlled using the minTime parameter. The elapsed time between location updates will never be less than minTime, although it can be more depending on the Location Provider implementation

Use

 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20 * 1000, 0, this);

more details refer Location Manager

0

精彩评论

暂无评论...
验证码 换一张
取 消