首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android如何每10秒采集一次位置数据

Android如何每10秒采集一次位置数据
EN

Stack Overflow用户
提问于 2011-01-14 13:03:06
回答 3查看 5.4K关注 0票数 1

我写了一个GPSDataCollectService,每10秒收集一次位置数据,但是它没有在我的HTC手机上报告位置,有什么问题吗?有人能帮帮我吗?

代码语言:javascript
复制
package com.android.example;

import java.util.Calendar;
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

        }

    }

}
EN

回答 3

Stack Overflow用户

发布于 2011-01-14 13:20:52

如果你的位置每10秒改变一次,那么只有你的LocationManager会跟踪新的位置。否则,它将使用相同的最后已知位置。

票数 0
EN

Stack Overflow用户

发布于 2011-01-14 16:06:27

在TimerTask中,您可能希望使用计时器,而不是使用LocationListener,也许您可以这样做:

代码语言:javascript
复制
LocationManager lm = yourActivityReference.getSystemService(Context.LOCATION_SERVICE);
String provider = lm.getBestProvider(new Criteria(),true);
Location loc = lm.getLastKnownLocation (provider);

我还没有检查过,但是如果我检查过了,我会让你知道...

致以问候。

EDIt:让我再试一次“经典”的方法。

代码语言:javascript
复制
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

        }

    }

}

我不认为您需要任何Timer,因为位置更新将异步调用您的侦听器,并且您可以设置超时。我没有在Android中使用过太多的GPS,但肯定有很多例子。

票数 0
EN

Stack Overflow用户

发布于 2018-11-22 13:23:17

可以使用minTime参数控制位置更新间隔。位置更新之间的运行时间永远不会小于minTime,但可能会更长,具体取决于位置提供程序的实现

使用

代码语言:javascript
复制
 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20 * 1000, 0, this);

更多详细信息请参阅Location Manager

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4688133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档