Newer
Older
dxcgt / app / src / main / java / com / smartdot / cgt / util / GpsManager.java
wangxitong on 6 Apr 2021 8 KB first commit
package com.smartdot.cgt.util;

import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;

import com.smartdot.cgt.R;

public class GpsManager {
    private static final Object gpsStartLock = new Object();

//    private int notInPostCount = 0;

    private static GpsManager gpsSingerton;

    public static GpsManager getGpsSingerton() {
        synchronized (gpsStartLock) {
            if (gpsSingerton == null) {
                gpsSingerton = new GpsManager();
            }
            return gpsSingerton;
        }
    }

    private static LocationManager locationManager;

    public Location getLocation() {
        Location location = null;
        if (locationManager != null) {
            boolean isGpsOpened = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            if (isGpsOpened) {
                location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            }
            if (location == null) {
                if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                } else {
                    location = null;
                }
            }
        }
        return location;
    }

    private GpsManager() {
    }

    public void startGps(final Context context) {
        String locationServiceName = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) context.getSystemService(locationServiceName);
        boolean isGpsOpened = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        // boolean isNetworkOpened =
        // locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (!isGpsOpened) {// || !isNetworkOpened) {

            Msg.confirm(context, "GPS或无线网络定位尚未打开,是否进入设置页面进行设置?", "设置定位", new MsgCallback() {
                @Override
                public void callBack(Boolean result) {
                    if (result.booleanValue()) {
                        context.startActivity(new Intent("android.settings.LOCATION_SOURCE_SETTINGS"));
                    }
                }
            }, "设置", "取消");

        }
        int reportLength = ApplicationMain.getInstance().getCgtConfig().getGpsReportLength();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, reportLength, locationListenerGps);
//        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, reportLength * 2,
//            locationListenerNetwork);
       // LogSD s=new LogSD(getApplicationContext());
    }

    public void stopGps() {
        locationManager.removeUpdates(locationListenerGps);
        locationManager.removeUpdates(locationListenerNetwork);
    }

    private final LocationListener locationListenerGps = new LocationListener() {
        private Location lastLocation = null;
        private int reportTime = ApplicationMain.getInstance().getCgtConfig().getGpsReportTimer() * 1000;

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            if (arg1 == LocationProvider.OUT_OF_SERVICE
                    && !NotificationCreater.isNotificationAvailable(R.drawable.map_case_marker)) {
                NotificationCreater.createNotification(ApplicationMain.getInstance(), R.drawable.map_case_marker,
                    "GPS不可用", "城管通", "当前GPS不可用!");
            }
        }

        @Override
        public void onLocationChanged(Location location) {
//            if (location.getAccuracy() < 40
//                    || (lastLocation != null && (location.getAccuracy() - lastLocation.getAccuracy()) < 20)) {
//                if (lastLocation == null || (location.getTime() - lastLocation.getTime()) > reportTime / 2
//                        || location.getAccuracy() <= lastLocation.getAccuracy()) {
//                    lastLocation = location;
//
//                   // final String phoneNumber = null;
//                    double x = location.getLongitude(), y = location.getLatitude();
//                 //   final String longitude = Double.toString(x);
//                 //   final String latitude = Double.toString(y);
//                //    final String userId = ApplicationMain.getInstance().getUserModel().getBgAdminId();
//                    int isInPost = -1;
//                    PointD[] bgPoints = ApplicationMain.getInstance().getUserModel().getBgPoints();
//                    if (bgPoints != null && bgPoints.length > 3) {
//                        isInPost = GisUtil.isPointInPolygon(new PointD(x, y), bgPoints) ? 1 : 0;
//                    }
//                    if (isInPost == 0) {
//                        notInPostCount++;
//                        if (notInPostCount > 5) {
//                            if (!NotificationCreater.isNotificationAvailable(R.drawable.btnmylocation)) {
//                                NotificationCreater.createNotification(ApplicationMain.getInstance(),
//                                    R.drawable.btnmylocation, "未在岗警告", "城管通", "您已离开责任网格!", false);
//                            }
//                        }
//                    } else {
//                        notInPostCount = 0;
//                        NotificationCreater.closeNotification(ApplicationMain.getInstance(), R.drawable.btnmylocation);
//                    }
//                    final int inPost = isInPost;
//                    Handler handler = new Handler() {
//                        public void handleMessage(Message msg) {
//                            if (msg.arg1 == 0) {
//                                Log.d("ReportGPSLocation", "上报失败");
//                            } else if (msg.arg1 == -1) {
//                                Log.d("ReportGPSLocation", "上报出错");
//                            }
//                        };
//                    };
//                    BaseThread thread = new BaseThread(handler) {
//                        @Override
//                        public void runThread() {
//                            Message message = this.obtainMessage();
//                            try {
//                               // message.arg1 = Request.getRequest().reportGpsPosition(phoneNumber, longitude, latitude,
//                               //    userId, inPost) ? 1 : 0;
//                            } catch (Exception e1) {
//                                message.arg1 = -1;
//                            }
//                            this.sendMessage(message);
//                        }
//                    };
//                    thread.start();
//                }
//            } else {
//                Log.d("ReportGPSLocation", "当前误差为" + location.getAccuracy() + ",上次误差为"
//                        + (lastLocation != null ? lastLocation.getAccuracy() : "空"));
//            }
        }

        @Override
        public void onProviderDisabled(String arg0) {
            if (!NotificationCreater.isNotificationAvailable(R.drawable.map_case_marker)) {
                NotificationCreater.createNotification(ApplicationMain.getInstance(), R.drawable.map_case_marker,
                    "GPS已关闭", "城管通", "当前GPS已关闭,请重新配置!");
            }
        }

        @Override
        public void onProviderEnabled(String arg0) {
        }
    };

    private final LocationListener locationListenerNetwork = new LocationListener() {
        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        }

        @Override
        public void onLocationChanged(Location arg0) {
            //locationManager.removeUpdates(this);
        }

        @Override
        public void onProviderDisabled(String arg0) {
        }

        @Override
        public void onProviderEnabled(String arg0) {
        }
    };

	public static LocationManager getLocationManager() {
		return locationManager;
	}

	public void setLocationManager(LocationManager locationManager) {
		this.locationManager = locationManager;
	}

    
}