Android开发之实现Android原生定位

本文主要实现GPS定位的方式,通过Android原生API获取经纬度。

Android定位服务LocationManager

需要添加的权限

// 添加权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

获取定位服务

// 获取定位服务
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

检测GPS是否开启

以下是检测GPS定位是否开启的代码:

locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (!locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
   // 转到手机设置界面,用户设置GPS
   Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
   intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   context.startActivity(intent); 
} 

利用Criteria选择最优的位置服务

// 设置选择条件
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);//低精度,如果设置为高精度,依然获取不了location。
criteria.setAltitudeRequired(false);//不要求海拔
criteria.setBearingRequired(false);//不要求方位
criteria.setCostAllowed(true);//允许有花费
criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗

获取可用的位置提供器

// 下面两种方式任选一种
// 获取可用的位置提供器
List<String> providerList = locationManager.getProviders(true);
// 获取最好的定位方式
String provider = locationManager.getBestProvider(criteria, true);

位置提供器种类:
GPS_PROVIDER:
手机里有GPS芯片,然后利用该芯片就能利用卫星获得自己的位置信息。但是在室内,GPS定位基本没用,很难定位的到。
NETWORK_PROVIDER:
利用网络定位,通常是利用手机基站和WIFI节点的地址来大致定位位置,
这种定位方式取决于服务器,即取决于将基站或WIF节点信息翻译成位置信息的服务器的能力。由于目前大部分Android手机没有安装google官方的location manager库,大陆网络也不允许,即没有服务器来做这个事情,自然该方法基本上没法实现定位。
PASSIVE_PROVIDER:
动定位方式,用现成的位置信息,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了。比如如果系统中已经安装了百度地图,高德地图(室内可以实现精确定位),你只要使用它们定位过后,再使用这种方法在你的程序肯定是可以拿到比较精确的定位信息。

获取位置信息

// 获取位置信息
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

获得Location为null的原因:
Android在室内开发时,GPS方式无法获取到位置信息,获取位置的最佳方式是NETWORK_PROVIDER,但是此方式需要google的location manager官方库,国内网络不允许,固此方式无法使用。

监听位置变化

// 监听位置信息变化
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60 * 1000, 0, locationListener);
private LocationListener locationListener = new LocationListener() {
   /**
    * 位置信息变化时触发:当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
    * @param location
    */
   @Override
   public void onLocationChanged(Location location) {
   }

   /**
    * GPS状态变化时触发:Provider被disable时触发此函数,比如GPS被关闭
    * @param provider
    * @param status
    * @param extras
    */
   @Override
   public void onStatusChanged(String provider, int status, Bundle extras){
      switch (status) {
      	//GPS状态为可见时
      	case LocationProvider.AVAILABLE: 
      	break;
      	//GPS状态为服务区外时
      	case LocationProvider.OUT_OF_SERVICE:
      	break;
      	//GPS状态为暂停服务时
      	case LocationProvider.TEMPORARILY_UNAVAILABLE:
      	break;
      }
   }

   /**
    * 方法描述:GPS开启时触发
    * @param provider
    */
   @Override
   public void onProviderEnabled(String provider) {
   }

   /**
    * 方法描述: GPS禁用时触发
    * @param provider
    */
   @Override
   public void onProviderDisabled(String provider) {
   }
};

移除监听器

// 移除监听器
locationManager.removeUpdates(locationListener);

版权声明:本文为sojisubcha原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。