android在后台获取位置并更新listview

时间:2014-11-04 13:56:02

标签: android listview background gps location

我正在尝试编写一个应用程序,该应用程序正在使用用户的当前位置并计算距离并将其写入我的列表视图。

该位置不一定非常准确,我只想在刷新列表或在应用程序启动时获取新位置,而不是连续。

我的问题是带有gps的locationlistener需要很长时间才能找到位置,我必须在显示正确的距离之前更新我的列表。

我正在考虑实现一个后台任务,该任务获取位置并在找到位置时自动更新列表。这会是一个解决方案吗?

是否可以选择更快地获取位置,即使它不如gps准确?

到目前为止我的位置听众:

 public class MyLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            lat = location.getLatitude();
            lng = location.getLongitude();

            myLoc.setLatitude(lat);
            myLoc.setLongitude(lng);
        }

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

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    }

在这个方法中,我正在调用locationmanager和listener并使用距离

创建listview
 public void getList(){
    locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
    locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);

//... creating the list with distance and so on
}

我希望你能给我一些提示,我可以如何实现这一点,我将按照上述方式工作,或者告诉我应该使用什么。 谢谢:))

1 个答案:

答案 0 :(得分:1)

1)。您可以使用LocationManager.NETWORK_PROVIDER

此提供商根据手机信号塔和WiFi接入点的可用性确定位置。通过网络查找检索结果。需要权限android.permission.ACCESS_COARSE_LOCATION或android.permission.ACCESS_FINE_LOCATION。

例如: - locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,500,50,locationListener);

2)。如果要使用后台任务,请使用此服务

public class LocationFinder extends Service {
    public static double lat, lng;

    LocationManager locationManager;

    public void onDestroy() {

        super.onDestroy();

        if (locationManager != null && locationListener != null) {
            locationManager.removeUpdates(locationListener);
        }

    }

    @Override
    public void onCreate() {
        Log.v("location", "===>location ed  onCreate " + lat);

        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        Log.v("location", "===>location ed  onStartCommand " + lat + "==>" + lng);
        new Handler().post(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                getLocation();

            }
        });
        return START_STICKY;
    }

    final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            updateWithNewLocation(location);
        }

        public void onProviderDisabled(String provider) {
            updateWithNewLocation(null);
        }

        public void onProviderEnabled(String provider) {
        }

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

    private void getLocation() {
        String context = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) getSystemService(context);

        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW);

        if (locationManager != null) {
            String provider = locationManager.getBestProvider(criteria, true);
            if (provider != null) {
                Location location = locationManager.getLastKnownLocation(provider);
                updateWithNewLocation(location);
                locationManager.requestLocationUpdates(provider, 500, 50, locationListener);
            } else {
                if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 500, 50, locationListener);

                } else if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 50, locationListener);
                } else if (locationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) {
                    locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 500, 50, locationListener);
                }
            }

        }
    }

    private void updateWithNewLocation(Location location) {
        if (location != null) {
            Log.v("location", "===>location ed  " + lat);

            lat = location.getLatitude();
            lng = location.getLongitude();

        }

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}