Android定位相关

以下的内容都是从网上找来的,拼拼凑凑然后整合了一下,把利用Android定位API实现的一些方法封装成一个工具类,使用的时候直接new个对象,传进去context对象就可以了。还有就是关于手机定位模式的设置。

首先是手机定位模式的设置
Android手机一般有三种定位方式:“高精确度”、“节电”、跟“仅限设备”。区别在于使用的定位模块种类跟数量,三种模式定位精确度依次从高到低。
不同手机可能默认的值不一样,我现在做的项目默认是“仅限设备”,就是指使用GPS去确定位置,精度是比较低的,而项目需要把定位精确度设置得高一点。以下是实现步骤:
首先这个东西需要系统权限…

1、在包名后面添多这个属性:

android:sharedUserId="android.uid.system"

声明下权限:

<!-- 设置定位模式权限-->
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

2、关键代码就这两句:

//设置高精度定位模式
        Settings.Secure.putInt(MainActivity.this.getContentResolver(), Settings.Secure.LOCATION_MODE,
                android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY);

下面是定位的工具类:


/**
 * 获取经度纬度等位置信息、以及卫星数
 * Created by Jim斌 on 2017/9/15.
 */

public class GPSstate {
    public static LocationManager lm;
    private Context mcontext;
    private static final String TAG = "aaaGPSstate";

    GPSstate(Context context) {
        mcontext = context;
        init();
    }

    private void init() {
        lm = (LocationManager) mcontext.getSystemService(Context.LOCATION_SERVICE);

        // 判断GPS是否正常启动
        if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Toast.makeText(mcontext, "请开启GPS导航...", Toast.LENGTH_SHORT).show();
            return;
        }

        // 为获取地理位置信息时设置查询条件
        String bestProvider = lm.getBestProvider(getCriteria(), true);
        // 如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER
        Location location = lm.getLastKnownLocation(bestProvider);
        updateView(location);
        // 监听状态
        lm.addGpsStatusListener(listener);
        if (ActivityCompat.checkSelfPermission(mcontext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(mcontext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        // 绑定监听,有4个参数
        // 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种
        // 参数2,位置信息更新周期,单位毫秒
        // 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
        // 参数4,监听
        // 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);
    }

    // 位置监听
    private LocationListener locationListener = new LocationListener() {
        /**
         * 位置信息变化时触发
         */
        public void onLocationChanged(Location location) {
            updateView(location);
            Log.i(TAG, "时间:" + location.getTime());
            Log.i(TAG, "经度:" + location.getLongitude());
            Log.i(TAG, "纬度:" + location.getLatitude());
            Log.i(TAG, "海拔:" + location.getAltitude());
        }

        /**
         * GPS状态变化时触发
         */
        public void onStatusChanged(String provider, int status, Bundle extras) {
            switch (status) {
                // GPS状态为可见时
                case LocationProvider.AVAILABLE:
                    Log.i(TAG, "当前GPS状态为可见状态");
                    break;
                // GPS状态为服务区外时
                case LocationProvider.OUT_OF_SERVICE:
                    Log.i(TAG, "当前GPS状态为服务区外状态");
                    break;
                // GPS状态为暂停服务时
                case LocationProvider.TEMPORARILY_UNAVAILABLE:
                    Log.i(TAG, "当前GPS状态为暂停服务状态");
                    break;
            }
        }

        /**
         * GPS开启时触发
         */
        public void onProviderEnabled(String provider) {
            if (ActivityCompat.checkSelfPermission(mcontext,
                    Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(mcontext,
                    Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            Location location = lm.getLastKnownLocation(provider);
            updateView(location);
        }

        /**
         * GPS禁用时触发
         */
        public void onProviderDisabled(String provider) {
            updateView(null);
        }

    };

    // 状态监听、从这里获取卫星个数
    GpsStatus.Listener listener = new GpsStatus.Listener() {
        public void onGpsStatusChanged(int event) {
            switch (event) {
                // 第一次定位
                case GpsStatus.GPS_EVENT_FIRST_FIX:
                    Log.i(TAG, "第一次定位");
                    break;
                // 卫星状态改变
                case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                    Log.i(TAG, "卫星状态改变");
                    // 获取当前状态
                    if (ActivityCompat.checkSelfPermission(mcontext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    GpsStatus gpsStatus = lm.getGpsStatus(null);
                    // 获取卫星颗数的默认最大值
                    int maxSatellites = gpsStatus.getMaxSatellites();
                    // 创建一个迭代器保存所有卫星
                    Iterator<GpsSatellite> iters = gpsStatus.getSatellites()
                            .iterator();
                    int count = 0;
                    while (iters.hasNext() && count <= maxSatellites) {
                        GpsSatellite s = iters.next();
//                        count++;
                        if(s.getSnr()!=0)//只有信躁比不为0的时候才算搜到了星
                        {
                            count++;
                        }
                    }
                    Toast.makeText(mcontext,"搜索到:" + count + "颗卫星",Toast.LENGTH_SHORT).show();
                    break;
                // 定位启动
                case GpsStatus.GPS_EVENT_STARTED:
                    Log.i(TAG, "定位启动");
                    break;
                // 定位结束
                case GpsStatus.GPS_EVENT_STOPPED:
                    Log.i(TAG, "定位结束");
                    break;
            }
        };
    };

    /**
     * 获取经度纬度信息
     * @param location
     */
    private void updateView(Location location) {
        if (location != null) {
            Log.d(TAG, "设备经度:"+String.valueOf(location.getLongitude()));
            Log.d(TAG, "设备纬度:"+String.valueOf(location.getLatitude()));
            Toast.makeText(mcontext,"设备经度:"+String.valueOf(location.getLongitude())+
                    "设备位纬度:"+String.valueOf(location.getLatitude()),Toast.LENGTH_SHORT).show();
        } else {
        }
    }

    /**
     * 返回查询条件
     * @return
     */
    private Criteria getCriteria() {
        Criteria criteria = new Criteria();
        // 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        // 设置是否要求速度
        criteria.setSpeedRequired(false);
        // 设置是否允许运营商收费
        criteria.setCostAllowed(false);
        // 设置是否需要方位信息
        criteria.setBearingRequired(false);
        // 设置是否需要海拔信息
        criteria.setAltitudeRequired(false);
        // 设置对电源的需求
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        return criteria;
    }
}

资料来源:
http://blog.csdn.net/goumiaoqiong/article/details/52135810
http://www.zuidaima.com/code/file/2099825152902144.htm?dir=/mygps/src/com/sxt/mygps/GpsActivity.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值