GPSInfoProvider定位

public class GPSInfoProvider
{
        private static GPSInfoProvider gpsInfoProvider;
        private static Context context;
        private static MyLocationListener listener;
        private LocationManager locationManager;
        private GPSInfoProvider()
        {
        }
        /**
         * 为了让这个方法一定执行完,所以我们加入了synchronized来修饰
         * @return
         */
        public static synchronized GPSInfoProvider getInstance(Context context)
        {
                if(gpsInfoProvider == null)
                {
                        gpsInfoProvider = new GPSInfoProvider();
                        GPSInfoProvider.context = context;
                }
                return gpsInfoProvider;
        }
        /**
         * 获取位置
         * @return
         */
        public String getLocation()
        {
                locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                String provider = getBestProvider();
                //这个方法是位置更新的的操作,有四个参数
                //第一个参数就是使用的定位设备啊,如gps,基站定位啊
                //第二个参数就是多长时间更新一次定位信息,太频繁了会很耗电,根据自己程序的实际需要来进行确定
                //第三个参数就是用户位移了多少米之后,就重新获取一次定位信息,太频繁了会很耗电,根据自己程序的实际需要来进行确定
                //最后一个参数就是在位置发生变化的回调方法
                locationManager.requestLocationUpdates(provider, 60000, 50, getListener());
                //locationManager.getAllProviders();//它会把所以支持的定位方式都打列出来,这样就可以知道手机所支持的定位啦
                SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
                String location = sp.getString("lostLocation", "");
                return location;
        }
        //停止gps
        public void stopGPSListener()
        {
                if(locationManager != null)
                {
                        locationManager.removeUpdates(getListener());
                }
        }
        private String getBestProvider()
        {
                Criteria criteria = new Criteria();
                //这个是定义它的定位精度的
                //Criteria.ACCURACY_COARSE  这个是一般的定位
                //Criteria.ACCURACY_FINE  这个是精准定位
                criteria.setAccuracy(Criteria.ACCURACY_FINE);
                //设置是不是对海拔敏感的
                criteria.setAltitudeRequired(false);
                //设置对手机的耗电量,定位要求越高,越耗电
                criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
                //设置对速度变化是不是敏感
                criteria.setSpeedRequired(true);
                //设置在定位时,是不是允许与运营商交换数据的开销
                criteria.setCostAllowed(true);
                //这个方法是用来得到最好的定位方式的,它有两个参数,一个是Criteria(类似于Map集合),就是一些条件,比如说对加速度敏感啊,什么海拔敏感这些的
                //第二个参数就是,如果我们置为false,那么我们得到的也有可能是已经关掉了的设备,如果是true那么,就只会得到已经打开了的设备
                return locationManager.getBestProvider(criteria, true);
        }
        //做成单例模式
        private synchronized MyLocationListener getListener()
        {
                if(listener == null)
                {
                        listener = new MyLocationListener();
                }
                return listener;
        }
        //=========================================================================
        private class MyLocationListener implements LocationListener
        {
                @Override
                public void onLocationChanged(Location location)
                {
                        //手机位置发生改变时调用的方法
                        String latitude = "纬度:" + location.getLatitude();//纬度
                        String longitude = "经度:" + location.getLongitude();//经度
                        SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
                        Editor editor = sp.edit();
                        editor.putString("lastLocation", latitude + " - " + longitude);
                        editor.commit();
                }
                @Override
                public void onStatusChanged(String provider, int status, Bundle extras)
                {
                        //定位设备的状态发生改变的时候调用的方法,比如说用户把设备打开,或关闭,第二个参数就是设备的状态啦
                }
                @Override
                public void onProviderEnabled(String provider)
                {
                        //设备打开的时候调用的方法
                }
                @Override
                public void onProviderDisabled(String provider)
                {
                        //设备关闭的时候调用的方法
                }
        }
}



转载于:https://my.oschina.net/oppo4545/blog/199004

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值