安卓中实现LocationManager定位服务

一. LocationManager:

LocationManager系统服务是位置服务的核心组件,它提供了一系列方法来处理与位置相关的问题,比如查询上一个已知位置,定期更新设备的地理位置,或者当设备进入给定地理位置附近时,触发应用指定意图等;

(A). 使用LocationManager需要以下过程;

1.获取LocationManager,它不能直接实例化:

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

2.了解LocationProvider:它是位置信息提供者,系统一般提供三种方式获取地理位置信息:

(1)GPS_PROVIDER:通过 GPS 来获取地理位置的经纬度信息;
优点:获取地理位置信息精确度高;
缺点:只能在户外使用,获取经纬度信息耗时,耗电;

(2)NETWORK_PROVIDER:通过移动网络的基站或者 Wi-Fi 来获取地理位置;
优点:只要有网络,就可以快速定位,室内室外都可;
缺点:精确度不高;

(3)PASSIVE_PROVIDER:被动接收更新地理位置信息,而不用自己请求地理位置信息。 PASSIVE_PROVIDER 返回的位置是通过其他 providers 产生的,可以查询 getProvider() 方法决定位置更新的由来,需要 ACCESS_FINE_LOCATION 权限,但是如果未启用 GPS,则此 provider 可能只返回粗略位置匹配;

获取provider的方法有getProviders,getAllProviders,getBestProvider(根据一组条件来返回合适的provider)

List<String> list = locationManager.getProviders(true);

        if (list != null) {

            for (String x : list) {

                Log.e("gzq", "name:" + x);

            }

        }

 

        LocationProvider lpGps = locationManager.getProvider(LocationManager.GPS_PROVIDER);

        LocationProvider lpNet = locationManager.getProvider(LocationManager.NETWORK_PROVIDER);

        LocationProvider lpPsv = locationManager.getProvider(LocationManager.PASSIVE_PROVIDER);

 

 

        Criteria criteria = new Criteria();

        // Criteria是一组筛选条件

        criteria.setAccuracy(Criteria.ACCURACY_FINE);

        //设置定位精准度

        criteria.setAltitudeRequired(false);

        //是否要求海拔

        criteria.setBearingRequired(true);

        //是否要求方向

        criteria.setCostAllowed(true);

        //是否要求收费

        criteria.setSpeedRequired(true);

        //是否要求速度

        criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);

        //设置电池耗电要求

        criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH);

        //设置方向精确度

        criteria.setSpeedAccuracy(Criteria.ACCURACY_HIGH);

        //设置速度精确度

        criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);

        //设置水平方向精确度

        criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);

        //设置垂直方向精确度

      

        //返回满足条件的当前设备可用的provider,第二个参数为false时返回当前设备所有provider中最符合条件的那个provider,但是不一定可用

        String mProvider = locationManager.getBestProvider(criteria, true);

        if (mProvider != null) {

            Log.e("gzq", "mProvider:" + mProvider);

        }

}

打印出来的结果就是passive,gps,network;

3.声明权限
(1)ACCESS_FINE_LOCATION是精确位置,如果使用GPS_PROVIDER或者同时使用GPS_PROVIDER和NETWORK_PROVIDER,需声明该权限,它对于这两个provider都是有效的;
(2)ACCESS_COARSE_LOCATION是粗略位置,该权限只针对NETWORK_PROVIDER。

4.注册一个位置监听器来接受结果

private final class MyLocationListener implements LocationListener{

    public void onLocationChanged(Location location) {

        Log.e("gzq", "onLocationChanged" + location.toString());

    }

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

        Log.e("gzq", "onStatusChanged" + status);

    }

    public void onProviderEnabled(String provider) {

        Log.e("gzq", "onProviderEnabled");

    }

    public void onProviderDisabled(String provider) {

        Log.e("gzq", "onProviderDisabled");

    }

}

这个回调里面有4个方法;

(1)onLocationChanged:当位置发生改变后就会回调该方法,经纬度相关信息存在Location里面;

(2)onStatusChanged:我们所采用的provider状态改变时会回调,该状态有3种;

LocationProvider.OUT_OF_SERVICE = 0:无服务

LocationProvider.AVAILABLE = 2:provider可用

LocationProvider.TEMPORARILY_UNAVAILABLE = 1:provider不可用

(3)onProviderEnabled:当provider可用时被触发,比如定位模式切换到了使用精确位置时GPSProvider就会回调该方法;

(4)onProviderDisabled:当provider不可用时被触发,比如定位模式切换到了使用使用网络定位时GPSProvider就会回调该方法;

5.获取位置信息,调用监听方法,不过在获取位置前先判断一下要调用的provider是否可用;

if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5,10, locationListener);

}

这个方法表明要跟踪GPS位置的变化,并且每5秒刷新一次,同时两次的位置的间隔要超过10米;

在不需要位置的时候解注册监听:

locationManager.removeUpdates(locationListener);

关于requestLocationUpdates有一些问题需要注意:

(1)刚才我们传入的是Listener,其实也可以用PendingIntent来代替Listener,当位置更新时会通过广播回调,使用2个键KEY_LOCATION_CHANGED和Location来接收位置变化;

(2)参数这里里可以传递一个Looper,如果不指定的话,则调用线程必须已经是一个Looper线程,比如调用Activity的主线程,如果指定了Looper,则在提供的Looper线程上进行回调;

(B). LocationManager还提供了一些其他有用的方法:

 

1.获取缓存中的位置信息getLastKnownLocation

Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

该方法不会发起监听,返回的是上一次的位置信息,但此前如果没有位置更新的话,返回的位置信息可能是错误的;

2.获取一次定位结果requestSingleUpdate

locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,locationListener,null);


如果不想一直监听位置信息,那么可以用requestSingleUpdate来实现只请求一次定位,该方法也要在主线程上执行;

3.发送辅助指令sendExtraCommand

mLocationManager.sendExtraCommand("LOC","NOTIFY_DOWNLOAD", extras);

可以通过Bundle参数来发送相关信息;

4.判断provider是否可用

mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

5.添加地理围栏

locationManager.addProximityAlert(38.234, 114.234, 5, -1, PendingIntent.getBroadcast(this, 1, new Intent(), 3));

可以设置一个区域,当进入或离开这个区域的时候会收到通知,前两个参数指定一个点,第三个参数是半径,第四个参数是超时时间,设置为-1表示不存在超时,最后一个是广播接收器。
触发的Intent将使用键KEY_PROXIMITY_ENTERING,如果值为true,则设备进入邻近区域,如果是false,说明设备离开该区域。

### 回答1: 好的,我会用文回答你关于AndroidLocationManager的问题。 LocationManagerAndroid系统提供的一个用于获取设备位置信息的类。它可以用来访问位置提供者(例如GPS、网络等)的数据,以获取设备的当前位置。 要使用LocationManager,你需要在你的Android应用程序添加访问位置信息的权限,并在代码使用LocationManager类的实例来请求位置信息。以下是一些使用LocationManager的示例代码: 1. 获取LocationManager实例: ``` LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ``` 2. 请求位置更新: ``` locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); ``` 其,第一个参数指定要使用的位置提供者,第二个和第三个参数指定位置更新的最小时间间隔和最小距离间隔,最后一个参数是一个LocationListener对象,它将在位置更新时被调用。 3. 获取最后一次已知位置: ``` Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); ``` 这将返回最后一次已知的GPS位置。 请注意,使用LocationManager获取设备位置信息可能需要一定的时间,并且需要保持设备的定位服务(例如GPS或网络)已启用。 ### 回答2: LocationManagerAndroid的一个系统类,用于获取设备的位置信息。 首先,我们需要在AndroidManifest.xml文件添加相应的权限: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 然后,在Java代码,我们可以通过LocationManager类进行位置信息的获取。可以通过下面的方式实例化一个LocationManager对象: LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 接下来,我们可以使用LocationManager提供的各种方法获得位置信息。例如,可以通过getLastKnownLocation()方法获取设备的最后已知位置: Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 另外,可以使用requestLocationUpdates()方法来注册位置更新的监听器,以获取设备的实时位置信息: locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10, locationListener); 其,10000表示更新的时间间隔(单位为毫秒),10表示更新的最小距离(单位为米),locationListener是一个实现了LocationListener接口的对象,用于处理位置更新的回调方法。 除了GPS_PROVIDER之外,还可以使用NETWORK_PROVIDER来获取基于网络的位置信息。 需要注意的是,在使用LocationManager时,需要根据需要适配不同的Android版本,并处理相关的权限请求和运行时权限检查。 总而言之,通过使用LocationManager类,我们可以方便地获取并处理设备的位置信息,实现各种与位置相关的功能,如定位、导航、地理围栏等。 ### 回答3: LocationManagerAndroid 系统的一个类,用于获取设备的位置信息。通过 LocationManager,我们可以获取设备的经纬度、海拔、速度等位置相关的数据。下面将详细介绍一些关键点。 首先,要使用 LocationManager,我们需要先获取系统服务: ```java LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ``` 接下来,我们可以调用 `requestLocationUpdates()` 方法来注册一个位置监听器,从而获取设备的实时位置信息。该方法接收四个参数:位置提供器参数、最小更新时间、最小更新距离以及位置监听器对象。 ```java locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener); ``` 其,`LocationManager.GPS_PROVIDER` 表示使用 GPS 定位提供器,也可以使用 `LocationManager.NETWORK_PROVIDER` 来使用网络定位提供器。 位置更新时间和距离可以控制频率,以节省电池和网络资源。在这个例子,设定为每秒获取新位置。 最后,需要实现自定义的位置监听器 `LocationListener`,它包含四个方法:`onLocationChanged()`、`onStatusChanged()`、`onProviderEnabled()` 和 `onProviderDisabled()`。我们可以根据需要来处理这些回调方法。 ```java LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // 当获取到新的位置信息时进行处理 } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // 当位置提供器的状态发生变化时进行处理 } @Override public void onProviderEnabled(String provider) { // 当位置提供器被启用时进行处理 } @Override public void onProviderDisabled(String provider) { // 当位置提供器被禁用时进行处理 } }; ``` 通过上述步骤,我们可以在 Android 设备上使用 LocationManager 来获取设备的位置信息,并根据自己的需要进行相应的处理,比如显示位置信息、导航、附近搜索等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值