从服务获取位置数据?

时间:2013-02-04 14:31:06

标签: android android-service android-location

我尝试提供定位服务,但不知怎的,我不能让它工作。 Lat和Lng始终为NULL。

我在locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);上有一些例外,所以我把它放在 run()方法中,现在异常消失了。可能是什么问题?

那么使定位服务有效的解决方案是什么?

代码:

public class LocationService extends Service {

    private Timer timer = new Timer();

    private LocationManager locManager;
    private LocationListener locListener = new MyLocationListener();

    private String latitude;
    private String longitude;
    private String providerToSend;

    Messenger messenger;
    Timer t = new Timer();

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

    public void onCreate() {
        super.onCreate();

        locListener = new MyLocationListener();
        locationProviderInit();
        startService();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        shutdownService();

    }

    private void startService() {


        locManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        String token = new SharedPreffer(this).loadPreferences("token");

            Log.d("Debug - token: ", "Van Token: " + token);

            t.schedule(new TimerTask() {

                @Override
                public void run() {

                    locationProviderInit();

                    if (latitude != null && longitude != null) {

                        Log.d("Debug - lat: ", latitude);
                        Log.d("Debug - lng: ", longitude);

                    } else {

                        Log.d("Debug - lat and lng are: ", "NULL");
                    }

                }
            }, 0, 5000);

    }

    private void locationProviderInit() {

        new Runnable() {

            @Override
            public void run() {

                try {

                    boolean gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                    boolean network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                    if (gps_enabled) {
                        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
                        providerToSend = LocationManager.GPS_PROVIDER;
                    }

                    if (network_enabled) {
                        locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
                        providerToSend = LocationManager.NETWORK_PROVIDER;
                    }

                } catch (Exception e) {
                    Log.d("Debug", e.toString());
                }
            }
        };

    }


    class MyLocationListener implements LocationListener {
        public void onLocationChanged(Location location) {

            if (location != null) {
                longitude = Double.toString(location.getLongitude());
                latitude = Double.toString(location.getLatitude());
            }
        }

        public void onProviderDisabled(String arg) {
        }

        public void onProviderEnabled(String arg) {
        }

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

    private void shutdownService() {
        if (timer != null)
            timer.cancel();
        Log.i(getClass().getSimpleName(), "Timer stopped!!!");
    }

}

2 个答案:

答案 0 :(得分:1)

您是否尝试在Runnable对象中的方法run()中放置调试消息,并查看它是否曾被执行过?

在不使用它的情况下定义Runnable实例,例如。在一个帖子中,将无法正常工作。

以下是您可以作为指南使用的开源GPS日志记录服务的几个示例。

GPSLoggerService

GPSLoggingService

答案 1 :(得分:1)

你没有在locationProviderInit ...

中执行Runnable