Gps定位

Posted 阿Hai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gps定位相关的知识,希望对你有一定的参考价值。

取得定位数据

1.取得LocationManager
  private LocationManager mLocationManager;
  mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
2.注册监听事件

    try {
        if (mLocationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null)
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);
        if (mLocationManager.getProvider(LocationManager.GPS_PROVIDER) != null)
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
    } catch(SecurityException e) {

    }

3.定义监听事件,处理数据

    private LocationListener mLocationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            Geocoder geocoder = new Geocoder(MainAcy.this);
            try {
                List<Address> addrs = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                Log.d(TAG, "" + addrs);
            } catch (IOException e) {
                Log.e(TAG, "", e);
            }
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };

4.取消注册

        try {
            mLocationManager.removeUpdates(mLocationListener);
        } catch(SecurityException e) {

        }

5.配置权限

  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

 

Geocoder

地图定位必须根据经纬度来完成,其包含两个概念。
  地址解析:把普通的用户能看见的字符串表示的地址转换为经纬度
  反向地址解析:将经纬度转变为字符串地址
Android 中使用 Geocoder 类来完成。但是很明显,Android 手机中不可能把所有的经纬度与地址都保存起来,因此这个类需要依赖于网络上的地图服务。
Geocoder类使用下面的方法执行地址解析,把经度、纬度值转换为字符串地址
  public List<Address> getFromLocation(double latitude, double longitude, int maxResults)
  public List<Address> getFromLocationName(String locationName, int maxResults)
  public List<Address> getFromLocationName(String locationName, int maxResults, double lowerLeftLatitude, double lowerLeftLongitude, double upperRightLatitude, double upperRightLongitude)

 

权限配置说明

1.GPS定位,使用GPS卫星进行定位
  <uses-permission android:name="android.permission.ACCESS_FIND_LOCATION" />
2.Network定位,使用信号接收塔和WIFI接入点进行定位,
  <uses-permission android:name="android.permission.ACCESS_FIND_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

 

核心api

LocationManager类常用的方法

获取所有的LocationProvider列表
public List<String> getAllProviders();
获取满足条件的LocationProvider列表
List<String> getProviders(Criteria criteria, boolean enabledOnly)
获取可用的LocationProvider列表
List<String> getProviders(boolean enabledOnly)
取得指定的LocationProvider
public LocationProvider getProvider(String name)
周期性的获取定位信息,并触发相应的事件
public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
public void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)
public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper)
public void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, LocationListener listener, Looper looper)
public void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, PendingIntent intent)
public void removeUpdates(LocationListener listener)
public void removeUpdates(PendingIntent intent)

判断指定的Provider是否可用
boolean isProviderEnabled(String provider)
根据条件取得最优的Provider
public String getBestProvider(Criteria criteria, boolean enabledOnly)
取得最近一次已知的Location
public Location getLastKnownLocation(String provider)

监听Gps状态
public boolean addGpsStatusListener(GpsStatus.Listener listener)
public void removeGpsStatusListener(GpsStatus.Listener listener)
获取Gps状态
public GpsStatus getGpsStatus(GpsStatus status)

添加或删除一个临近警告
public void addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent)
public void removeProximityAlert(PendingIntent intent)


LocationProvider类常用的方法

名称
public String getName()
是否支持高度信息
public boolean supportsAltitude()
是否支持方向信息
public boolean supportsBearing()
是否支持速度信息
public boolean supportsSpeed()
精度
public int getAccuracy()
是否收费
public boolean hasMonetaryCost()
是否需要访问网络基站
public boolean requiresCell()
是否需要访问网络数据
public boolean requiresNetwork()
是否需要访问基于卫星的定位系统
public boolean requiresSatellite()
判断该LocationProvider是否满足Criteria条件
public boolean meetsCriteria(Criteria criteria)


Location类常用的方法

获取提供该定位信息的LocationProvider
public String getProvider()
是否有精度信息
public boolean hasAccuracy()
是否有高度信息
public boolean hasAltitude()
是否有方向信息
public boolean hasBearing()
是否有速度信息
public boolean hasSpeed()
精度
public float getAccuracy()
高度
public double getAltitude()
方向
public float getBearing()
经度
public double getLongitude()
纬度
public double getLatitude()
速度
public float getSpeed()
定位信息的时间
public long getTime()

Criteria

为了实现取得符合指定条件的LocationProvider,需要使用Criteria进行过滤.Criteria常用的方法如下:
设置方向的要求
public void setBearingRequired(boolean bearingRequired)
public void setBearingAccuracy(int accuracy)
设置是否允许收费
public void setCostAllowed(boolean costAllowed)
设置要求能提供高度信息
public void setAltitudeRequired(boolean altitudeRequired)
设置耗电级别要求
public void setPowerRequirement(int level)
设置精度的要求
public void setAccuracy(int accuracy)
设置垂直精度
public void setVerticalAccuracy(int accuracy)
设置水平精度
public void setHorizontalAccuracy(int accuracy)
设置速度的要求
public void setSpeedRequired(boolean speedRequired)
public void setSpeedAccuracy(int accuracy)

 

以上是关于Gps定位的主要内容,如果未能解决你的问题,请参考以下文章

《第一行代码》Android特色开发,基于位置服务,出现的问题

如何在后台线程中启动 GPS 定位?

GPS伪距单点定位中的TOC和TOE有啥区别?很急

启用 GPS 定位后,AlertDialog 没有被禁用

Android GPS定位精度问题

如何用一张照片进行GPS定位?—最好的语言Java实现起来就这么简单!手把手教程+完整代码