创建一个获取GPS坐标的服务并将其发送到服务器

时间:2015-10-14 19:39:09

标签: java android gps locationmanager locationlistener

我正在开发一款将gps数据发送到服务器的原型Android应用。当我直接从我的MainActivity类调用我的类GetLocation时,我有一些工作。但是,我希望这真的可以作为后台服务。我尝试使用类似的代码,但由于某种原因,LocationListener的函数永远不会被调用(我唯一看到的是onLocationChanged)。我误解了这是如何工作的吗?谢谢。这是我的代码。

public class GetLocation {
...
public GetLocation(Context myContext, String hostParam)
{
    this.context = myContext;
    sendMessage = false;
    sendData = new SendData(Constants.HOST_NAME);
    locationManager = (LocationManager) context.getSystemService((Context.LOCATION_SERVICE));
    this.host = hostParam;
    locationListener = new LocationListener()
    {
        @Override
        public void onLocationChanged(Location location)
        {
            String sentence = AssembleSentence.assembleNMEAURL(location);
            //sendData.sendMessage(sentence);
            int geozoneLocation = GeoZone.getGeozoneLocation(location);
            switch(geozoneLocation)
            {
                case GeoZone.LEVEL_ONE:
                    sendMessage = false;
                    if(Constants.LEVEL_ONE_INTERVAL != currentInterval)
                    {
                        startLocationUpdates(Constants.LEVEL_ONE_INTERVAL, LocationManager.NETWORK_PROVIDER);
                    }
                    break;
                case GeoZone.LEVEL_TWO:
                    sendMessage = false;
                    if(Constants.LEVEL_ONE_INTERVAL != currentInterval)
                    {
                        startLocationUpdates(Constants.LEVEL_TWO_INTERVAL, LocationManager.NETWORK_PROVIDER);
                    }
                    break;
                case GeoZone.LEVEL_THREE:
                    sendMessage = false;
                    if(Constants.LEVEL_ONE_INTERVAL != currentInterval)
                    {
                        startLocationUpdates(Constants.LEVEL_THREE_INTERVAL, LocationManager.NETWORK_PROVIDER);
                    }
                    break;
                case GeoZone.LEVEL_FOUR:
                    sendMessage = true;
                    if(Constants.LEVEL_ONE_INTERVAL != currentInterval)
                    {
                        startLocationUpdates(Constants.LEVEL_FOUR_INTERVAL, LocationManager.GPS_PROVIDER);
                    }
                    break;
            }
            if(sendMessage)
            {
                sendData.sendMessage(sentence);
            }
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras)
        {

        }

        @Override
        public void onProviderEnabled(String provider)
        {

        }

        @Override
        public void onProviderDisabled(String provider)
        {

        }
    };
}
....
}

我的服务类在下面调用。

public class TelematicsIntent extends Service
{

public TelematicsIntent()
{
}
@Override
public IBinder onBind(Intent intent)
{
    throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate()
{

    GetLocation location = new GetLocation(this, Constants.HOST_NAME);
}


@Override
public void onDestroy()
{

}
}

此Service类由MainActivity类调用。我知道正确调用了GetLocation类,因为我在中设置了一个断点 this.host = hostParam并且代码停在那里,但我在语句int geozoneLocation = GeoZone.getGeozoneLocation(location);中添加了另一个断点,其中GeoZone类是另一个只通过位置数据的类,并返回该位置是否在特定区域内。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我弄清楚为什么没有被召唤。我忘了实际启动位置服务,因为我无法在代码中实际启动它们。我应该早点看到这个,但我想我没有。