Android位置每分钟更新一次



我目前正在编写一个应用程序,每分钟(或其他指定的时间)接收位置数据,并将其发送到服务器。

我注意到的问题是:当我使用我的应用程序连接到电源,它工作完美-发送更新与定义的间隔。当我使用电池时,它会随机发送更新。

对于我的应用程序,我使用计时器来指定更新间隔。这个定时器在后台服务中运行。我请求更新定时器和删除更新时,我收到的位置。我的代码片段:

    private class mainTask extends TimerTask
    { 
        public void run() 
        {
            toastHandler.sendEmptyMessage(0); 
        }
    } 
    private final Handler toastHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            date = date.getInstance(); //used to set time of update.
            if(!GPSupdating)
            {
                locationManager.requestLocationUpdates("gps", 0, 0, locationListenerGPS);
                GPSupdating = true;
            }
        }
    };

My location listener:

    LocationListener locationListenerGPS = new LocationListener() 
    {
        public void onLocationChanged(Location updatedLocation) 
        {
            myGPSLocation = updatedLocation;
            haveLocationGPS = true;
            locationManager.removeUpdates(locationListenerGPS);
            GPSupdating = false;
        }
        public void onStatusChanged(String provider, int status, Bundle extras) {}
        public void onProviderEnabled(String provider) {}
        public void onProviderDisabled(String provider) {}
    };  

你知道为什么这不能正常工作吗?

这不是一个好的解决方案-每分钟打开/关闭侦听器

最好这样做:

1)将最小更新时间(在requestLocationUpdates中)设置为一分钟,并在更新侦听器中向服务器发送数据:

locationManager.requestLocationUpdates("gps", 60*1000, 0, locationListenerGPS);

如果您需要更准确的更新间隔,请使用

2)启动单独的线程并在其上启用GPS更新。将最后位置存储在线程或服务变量中。同时启动定时器和on定时器将位置发送给服务器。

尝试使用Criteria来管理电源。设置电源要求为"POWER_LOW"。但是你会失去一些准确性。

LocationManager locationManager= (LocationManager) getSystemService(context);
        Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            criteria.setPowerRequirement(Criteria.POWER_LOW);
            provider = locationManager.getBestProvider(criteria, true);

每分钟开启和关闭一次GPS并不会节省能源。要么选择更长的间隔时间(5分钟),要么每秒钟获取一次位置。
然后将位置存储在lastValidLocation文件中,启动自己的Timer,每分钟读取一次lastValidLocation

最新更新