GPS获取经纬度并解析,10分钟上报一次功能

通过GPS获取android 手机经纬度并每十分钟上传一次,地理位置解析是通过高德地图方法进行。由于需要长时间运行,写在服务中。

public class PushGPSService extends Service {
    private LocationManager locationManager;
    private GeocodeSearch geocodeSearch;
    private LocationParam locationParam;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        getGPSLocation();
        //地理搜索类,高德地图提供
        geocodeSearch = new GeocodeSearch(this);
        geocodeSearch.setOnGeocodeSearchListener(onGeocodeSearchListener);
        return super.onStartCommand(intent, flags, startId);
    }

    private void getGPSLocation(){
        locationManager = (LocationManager) Context.getSystemService(Context.LOCATION_SERVICE);
        //判断GPS是否开启

        if (locationManager != null){
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10*60*1000, 0, locationListener);
            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
               //未打开操作
            }
        }
    }
    GeocodeSearch.OnGeocodeSearchListener onGeocodeSearchListener = new GeocodeSearch.OnGeocodeSearchListener() {
        @Override
        public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
            RegeocodeAddress regeocodeAddress = regeocodeResult.getRegeocodeAddress();//根据经纬度解析后的信息
            LogWriter.write("push GPS Location locationParam");
            //根据自己的接口使用。
        }

        @Override
        public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
        }
    };
    LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
            getLocationCity(location,latLng);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            switch (status){
                //GPS状态为可见时
               case LocationProvider.AVAILABLE:
                   break;
                //GPS状态为服务区外时
                case LocationProvider.OUT_OF_SERVICE:
                    break;
                //GPS状态为暂停服务时
                case LocationProvider.TEMPORARILY_UNAVAILABLE:
                    break;
            }
        }
        //GPS开启时触发
        @Override
        public void onProviderEnabled(String provider) {//每次打开GPS进行一次上报
            Location onProviderEnabled=locationManager.getLastKnownLocation(provider);
            if (onProviderEnabled == null){ //部分机型获取上一次信息需要点时间
                try {
                    Thread.sleep(5000);
                    onProviderEnabled=locationManager.getLastKnownLocation(provider);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //针对部分机型无法获取getLastKnownLocation问题,获取的值为null
            if (onProviderEnabled == null){
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10*60*1000, 0, locationListener);
            }
            if (onProviderEnabled != null){
                LatLng latLng = new LatLng(onProviderEnabled.getLatitude(),onProviderEnabled.getLongitude());
                getLocationCity(onProviderEnabled,latLng);
            }
        }
        //GPS关闭时触发
        @Override
        public void onProviderDisabled(String provider) {
            //关闭GPS时操作
        }
    };

    @Override
    public void onDestroy() {
        locationManager.removeUpdates(locationListener);
        super.onDestroy();
    }
    private void getAddressByLatlng(LatLng latLng) {
        //逆地理编码查询条件:逆地理编码查询的地理坐标点、查询范围、坐标类型。
        LatLonPoint latLonPoint = new LatLonPoint(latLng.latitude, latLng.longitude);
        RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 500f, GeocodeSearch.AMAP);
        //异步查询
        geocodeSearch.getFromLocationAsyn(query);
    }


    private void getLocationCity(Location location,LatLng latLng){
            getAddressByLatlng(latLng);
        }
}

猜你喜欢

转载自blog.csdn.net/Lemon_husky/article/details/80483912
今日推荐