Android 地理位置定位

来源:互联网 发布:video.js兼容ie8 编辑:程序博客网 时间:2024/05/16 05:12

Android官方提供的定位SDK

1.先在Manifest.xml中申请权限(targetSdkVersion 为23或者更高的需要动态申请权限)

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.INTERNET" /> <!-- 使用网络定位作为定位信息提供者时需要访问网络的权限 -->

2.调用Context的getSystemService()方法来获得LocationManager

    LocationManager = mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE)

3.获取定位服务提供者LocationProvider

大体上,LocationManager有三种常用方法获得LocationProvider

1.获取所有Provider

List<String> providers = mLocationManager.getProviders(true);

2.根据指定条件来获取最接近的Provider,Criteria是过滤条件。

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);// 设置对电源的需求String provider = mLocationManager.getBestProvider(crite, true);

3.LocationProvider getProvider(String name); 根据名称来直接获取指定的LocationProvider

    String provider = mLocationManager.getProvider(LocationManager.GPS_PROVIDER);

有三种常用的provider是:

1. GPS_PROVIDER:
这个就是手机里有GPS芯片,然后利用该芯片向卫星请求定位当前的地理位置。但是对请求信号强度要求比较高,在室内GPS定位基本没用,百分之就是的可能获取的是null。
2. NETWORK_PROVIDER:
网络定位,通常是利用手机基站和WIFI节点的地址来大致定位位置。这种定位方式取决于将基站或WIFI节点信息翻译成位置信息的服务器的能力。但由于目前发部分Android手机没有安装google官方的location manager库,大陆网络也无法访问到google的服务器,自然该方法基本上没法实现定位。
3. PASSIVE_PROVIDER:
被动定位方式,读取其他应用保存的定位信息。当其它应用使用定位更新定位信息后,系统会被保存下来,被动定位就是读取的这些信息。如果系统中已经安装了百度地图、高德地图之类的应用,你只要使用他们定位过后,使用被动定位就可以拿到比较精确的定位信息了。局限性很大,依赖于别的应用。

4.获取provider提供的位置信息(注意:可能会返回null)

Location location = mLocationManager.getLocation(provider);

LocationManager还有几个常用方法:

Location getLastKnownLocation(String Provider)

根据provider获取最近的一个Location,如果本次定位失败,则返回上次定位成功时的位置信息,如果从未成功过则返回null

void requstLocationUpdates(String Provider,long minTime,long minDistance,LocationListener listener)

//绑定监听,有4个参数    //参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种//参数2,位置信息更新周期,单位毫秒    //参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息    //参数4,监听    //备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新   // 1秒更新一次,或最小位移变化超过1米更新一次;//注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);

LocationListener 位置监听器

    LocationListener locationListener = new LocationListener(){        // 当位置发生变化时触发        public void onLocationChanged(Location location) {             Log.i(TAG, "时间:"+location.getTime());             Log.i(TAG, "经度:"+location.getLongitude());             Log.i(TAG, "纬度:"+location.getLatitude());             Log.i(TAG, "海拔:"+location.getAltitude());         }          // 当GPS关闭时触发        public void onProviderDisabled(String arg0) {        }          // 当GPS开启时触发        public void onProviderEnabled(String arg0) {         }          // 当位置状态改变时触发        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {             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;            }        }              }; 

可以通过一段代码遍历比较三种provider提供的位置信息,并返回精度较高的结果

List<String> providers = mLocationManager.getProviders(true);Location location = null;// 遍历三种定位方式的信息for (String provider : providers) {    // 获取定位信息 如果不为空则比较精度    Location l = mLocationManager.getLastKnownLocation(provider);    Log.d(TAG,"provider:" + provider + ",location == null:" + (l == null));    if (l == null) {        continue;    }    Log.d(TAG,"provider:" + provider + ",经度:" + l.getLongitude() + ",纬度:" + l.getLatitude());    // 返回精度更高的定位信息    if (location == null || l.getAccuracy() < location.getAccuracy()) {        // Found best last known location: %s", l);        location = l;    }}return location;

LocationManager可以使用isProviderEnabled方法判断是否打开了gps

if(!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){    Log.i(TAG, "当前未打开GPS");}
0 0
原创粉丝点击