AndroidGPS和基站定位

最近项目中需要实现一个简单的定位功能,网上搜索了一大堆文章,最后只总结了两种定位方式。一种是GPS定位,另一种是基站定位。下面分别说说这两种定位的优缺点以及具体实现。
一:GPS定位
优点:定位准确、并且在没有网络的情况下也可以定位。
缺点:有遮盖物的时候定不到位,亲测有时候在室内定位不到。
代码部分:
`locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            //位置信息变化时触发
            Log.e(TAG, "纬度:"+location.getLatitude());
            Log.e(TAG, "经度:"+location.getLongitude());
            Log.e(TAG, "海拔:"+location.getAltitude());
            Log.e(TAG, "时间:"+location.getTime());
        }

        @Override
        public void onStatusChanged(String provider, int status,Bundle extras) {
            //GPS状态变化时触发
        }

        @Override
        public void onProviderEnabled(String provider) {
            //GPS禁用时触发
        }

        @Override
        public void onProviderDisabled(String provider) {
            //GPS开启时触发
        }
    };
    /**
     * 绑定监听
     * 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位
     * 参数2,位置信息更新周期.单位是毫秒
     * 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
     * 参数4,监听
     * 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
     */
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);`

二:基站定位
优点:有网络就能定位,受覆盖物影响较小。
缺点:定位没有GPS准确。
代码部分:

locationListener = new LocationListener() {

            @Override
            public void onLocationChanged(Location location) {
                //位置信息变化时触发
                Log.e(TAG, "纬度:"+location.getLatitude());
                Log.e(TAG, "经度:"+location.getLongitude());
                Log.e(TAG, "海拔:"+location.getAltitude());
                Log.e(TAG, "时间:"+location.getTime());
                tv_gps_longitude.setText(location.getLongitude() + "");
                tv_gps_latitude.setText(location.getLatitude() + "");
            }

            @Override
            public void onStatusChanged(String provider, int status,Bundle extras) {
                //GPS状态变化时触发
            }

            @Override
            public void onProviderEnabled(String provider) {
                //GPS禁用时触发
            }

            @Override
            public void onProviderDisabled(String provider) {
                //GPS开启时触发
            }
        };
        /**
         * 绑定监听
         * 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位
         * 参数2,位置信息更新周期.单位是毫秒
         * 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
         * 参数4,监听
         * 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
         */
        locationManager.requestLocationUpdates(LocationManager.LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

最后附上在网上搜到的个人感觉封装的很好的一个定位的工具类:

public class LocationUtil{

    private static final String TAG = "LocationUtil";

    private static LocationUtil instance;
    private static Activity mActivity;
    private static LocationManager locationManager;
    private static LocationListener locationListener;

    public static LocationUtil getInstance(Activity activity){
        mActivity = activity;
        if(instance==null){
            instance = new LocationUtil();
        }
        locationManager = (LocationManager)mActivity.getSystemService(Context.LOCATION_SERVICE);
        return instance;
    }

    /**
     * 判断GPS导航是否打开.
     * false:弹窗提示打开,不建议采用在后台强行开启的方式。
     * true:不做任何处理
     * @return
     */
    public static void isOpenGPS(){

        if (!locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){
            AlertDialog.Builder dialog = new AlertDialog.Builder(mActivity);
            dialog.setMessage("GPS未打开,是否打开?");
            dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    // 设置完成后返回到原来的界面
                    mActivity.startActivityForResult(intent, 0);
                }
            });
            dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            dialog.show();
        }
    }

    /**
     * 通过LocationListener来获取Location信息  GPS定位
     */
    public static void formListenerGetLocation(final TextView tv_gps_longitude, final TextView tv_gps_latitude){

        locationListener = new LocationListener() {

            @Override
            public void onLocationChanged(Location location) {
                //位置信息变化时触发
                Log.e(TAG, "纬度:"+location.getLatitude());
                Log.e(TAG, "经度:"+location.getLongitude());
                Log.e(TAG, "海拔:"+location.getAltitude());
                Log.e(TAG, "时间:"+location.getTime());
                tv_gps_longitude.setText(location.getLongitude() + "");
                tv_gps_latitude.setText(location.getLatitude() + "");
            }

            @Override
            public void onStatusChanged(String provider, int status,Bundle extras) {
                //GPS状态变化时触发
            }

            @Override
            public void onProviderEnabled(String provider) {
                //GPS禁用时触发
            }

            @Override
            public void onProviderDisabled(String provider) {
                //GPS开启时触发
            }
        };
        /**
         * 绑定监听
         * 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位
         * 参数2,位置信息更新周期.单位是毫秒
         * 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
         * 参数4,监听
         * 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
         */
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    }

    /**
     * 主动获取Location,通过以下方法获取到的是最后一次定位信息。
     * 注意:Location location=new Location(LocationManager.GPS_PROVIDER)方式获取的location的各个参数值都是为0。 基站
     */
    public static void getLocation(final TextView tv_jizhan_longitude, final TextView tv_jizhan_latitude){

        Location location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        Log.e(TAG, "纬度:"+location.getLatitude());
        Log.e(TAG, "经度:"+location.getLongitude());
        Log.e(TAG, "海拔:"+location.getAltitude());
        Log.e(TAG, "时间:"+location.getTime());
        tv_jizhan_longitude.setText(location.getLongitude() + "");
        tv_jizhan_latitude.setText(location.getLatitude() + "");

    }

    /**
     * 获取GPS状态监听,包括GPS启动、停止、第一次定位、卫星变化等事件。
     */
    public static void getStatusListener(){

        GpsStatus.Listener listener = new GpsStatus.Listener(){

            @Override
            public void onGpsStatusChanged(int event) {
                if(event==GpsStatus.GPS_EVENT_FIRST_FIX){
                    //第一次定位
                }else if(event==GpsStatus.GPS_EVENT_SATELLITE_STATUS){
                    //卫星状态改变
                    GpsStatus gpsStauts= locationManager.getGpsStatus(null); // 取当前状态
                    int maxSatellites = gpsStauts.getMaxSatellites(); //获取卫星颗数的默认最大值
                    Iterator<GpsSatellite> it = gpsStauts.getSatellites().iterator();//创建一个迭代器保存所有卫星
                    int count = 0;
                    while (it.hasNext() && count <= maxSatellites) {
                        count++;
                        GpsSatellite s = it.next();
                    }
                    Log.e(TAG, "搜索到:"+count+"颗卫星");
                }else if(event==GpsStatus.GPS_EVENT_STARTED){
                    //定位启动
                }else if(event==GpsStatus.GPS_EVENT_STOPPED){
                    //定位结束
                }
            }
        };
        //绑定
        locationManager.addGpsStatusListener(listener);
    }

    /**
     * 获取所有卫星状态
     * @return
     */
    public static List<GpsSatellite> getGpsStatus(){
        List<GpsSatellite> result = new ArrayList<GpsSatellite>();
        GpsStatus gpsStatus = locationManager.getGpsStatus(null); // 取当前状态
        //获取默认最大卫星数
        int maxSatellites = gpsStatus.getMaxSatellites();
        //获取第一次定位时间(启动到第一次定位)
        int costTime=gpsStatus.getTimeToFirstFix();
        Log.e(TAG, "第一次定位时间:"+costTime);
        //获取卫星
        Iterable<GpsSatellite> iterable=gpsStatus.getSatellites();
        //一般再次转换成Iterator
        Iterator<GpsSatellite> itrator=iterable.iterator();
        int count = 0;
        while (itrator.hasNext() && count <= maxSatellites){
            count++;
            GpsSatellite s = itrator.next();
            result.add(s);
        }
        return result;
    }

    /**
     * 某一个卫星的信息.
     * @param gpssatellite
     */
    public static void getGpsStatelliteInfo(GpsSatellite gpssatellite){

        //卫星的方位角,浮点型数据
        Log.e(TAG, "卫星的方位角:"+gpssatellite.getAzimuth());
        //卫星的高度,浮点型数据
        Log.e(TAG, "卫星的高度:"+gpssatellite.getElevation());
        //卫星的伪随机噪声码,整形数据
        Log.e(TAG, "卫星的伪随机噪声码:"+gpssatellite.getPrn());
        //卫星的信噪比,浮点型数据
        Log.e(TAG, "卫星的信噪比:"+gpssatellite.getSnr());
        //卫星是否有年历表,布尔型数据
        Log.e(TAG, "卫星是否有年历表:"+gpssatellite.hasAlmanac());
        //卫星是否有星历表,布尔型数据
        Log.e(TAG, "卫星是否有星历表:"+gpssatellite.hasEphemeris());
        //卫星是否被用于近期的GPS修正计算
        Log.e(TAG, "卫星是否被用于近期的GPS修正计算:"+gpssatellite.hasAlmanac());
    }
    }

这里面还有个WIFI定位,亲测用不了,就是谷歌的这个http://www.google.com/loc/json接口停止使用的问题,如果大家有好的关于WIFI定位的demo请私信我~互相学习!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用GPS 定位,首先,需要在清单文件(AndroidManifest.xml)中注册获取定位的权限: **1.获取位置管理器对象LocationManager** ``` import android.location.LocationManager; LocationManager lm; // lm =(LocationManager) this.getSystemService(Context`.LOCATION_SERVICE); // ``` **2.一般使用LocationManager的getLastKnownLocation(LocationManager.GPS_PROVIDER);方法获取Location对象** ``` String provider = LocationManager.GPS_PROVIDER;// 指定LocationManager的定位方法 Location location = locationManager.getLastKnownLocation(provider);// 调用getLastKnownLocation()方法获取当前的位置信息 ``` 不过不建议用这种方法,有几点原因: 一,在很多提供定位服务的应用程序中,不仅需要获取当前的位置信息,还需要监视位置的变化,在位置改变时调用特定的处理方法 ,其中LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),可以根据位置的距离变化和时间间隔设定,产生位置改变事件的条件,这样可以避免因微小的距离变化而产生大量的位置改变事件 。 二,当你开启GPS,provider的值为GPS。这时的定位方式为GPS,由于GPS定位慢,所以它不可能立即返回你一个Location对象,所以就返回null了。 **3.推荐locationManager.requestLocationUpdates();方法** LocationManager中设定监听位置变化的代码如下: ``` lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10,new MyLocationListener()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值