Android 地理位置定位

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");
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值