以下的内容都是从网上找来的,拼拼凑凑然后整合了一下,把利用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 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

更多相关文章

  1. Android判断设备网络连接状态,并判断连接方式
  2. 解析URL,获取其参数值(总结一次与H5交互用到的)
  3. android 自定义状态栏和导航栏分析与实现
  4. 检测android的网络链接状态
  5. Android获取系统屏幕亮/灭屏状态

随机推荐

  1. Android中使用apache commons-net发送后
  2. Android联系人数据库全解析(4)
  3. android 报错java.io.IOException: Permi
  4. android 拨号盘Contact模块讲解(四)
  5. 使用NDK开发SQLite3
  6. Gphone Android和手机联盟
  7. Android RecyclerView使用(二) -给Item添加
  8. Android程序界面主题切换
  9. Android设置Settings实现:PreferenceActiv
  10. Android NDK 知识系列(五)