Android 网络定位流程

        上一篇我们记录了 GPS 的定位流程,这一篇记录下 NLP(Network Location Provider)的定位流程,因为在国内,无法使用谷歌提供的NLP,所以国内我们一般会使用三方提供的NLP,比如:百度、高德、腾讯等。

        这里我们假设一个app发起 NLP 定位,首先调用 LocationManager 接口,通过AIDL最终调用到 LocationManagerService 里面的  requestLocationUpdates 方法:

http://androidxref.com/9.0.0_r3/xref/frameworks/base/location/java/android/location/LocationManager.java#requestLocationUpdates

554    public void requestLocationUpdates(String provider, long minTime, float minDistance,
555            LocationListener listener) {
556        checkProvider(provider);
557        checkListener(listener);
558
559        LocationRequest request = LocationRequest.createFromDeprecatedProvider(
560                provider, minTime, minDistance, false);
561        requestLocationUpdates(request, listener, null, null);
562    }

到这里我们就知道了,不管是GPS还是NLP,调用的都是这个接口,区别就是传进去的参数不一样,例如:provider,在Android 里面我们有以下几种provider:

Gps_provider、Network_provider、Passive_provider、Fused_provider、Mock_provider,其中前三种比较常用,Fused_provider依赖三方,比如谷歌GMS包。Mock_provider就是我们常说的伪造位置,一些虚拟定位软件就是基于这个开发的,这里我们暂时不记录,需要的后续单独详细讲。

继续看流程调用:

http://androidxref.com/9.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/LocationManagerService.java#requestLocationUpdates

2061    public void requestLocationUpdates(LocationRequest request, ILocationListener listener
Android系统网络定位主要依赖于基站信息和Wi-Fi信息来确定设备的位置,其具体流程如下: #### 1. 权限检查与请求 在进行网络定位之前,应用需要检查并请求相应的权限。Android 6.0(API 级别 23)及以上版本引入了运行时权限机制,需要在代码中动态请求 `ACCESS_COARSE_LOCATION` 权限。以下是一个简单的权限检查与请求的代码示例: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION); } ``` #### 2. 获取定位服务 应用需要获取 `LocationManager` 实例,它是 Android 系统中用于管理位置服务的核心类。可以通过 `Context.getSystemService(Context.LOCATION_SERVICE)` 方法来获取该实例: ```java LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ``` #### 3. 注册定位监听器 应用需要创建一个 `LocationListener` 实例,并将其注册到 `LocationManager` 中,以便接收位置更新信息。以下是一个简单的注册示例: ```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) {} }; locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); ``` #### 4. 收集网络信息 当注册了定位监听器后,Android 系统会开始收集网络信息,主要包括基站信息和 Wi-Fi 信息: - **基站信息**:设备会与附近的基站进行通信,获取基站的 ID、信号强度等信息。这些信息可以帮助定位系统确定设备与基站之间的相对位置。 - **Wi-Fi 信息**:设备会扫描附近的 Wi-Fi 热点,获取热点的 SSID、BSSID 和信号强度等信息。由于 Wi-Fi 热点的位置通常是固定的,通过收集多个 Wi-Fi 热点的信息,可以更精确地确定设备的位置。 #### 5. 发送网络请求 收集到网络信息后,Android 系统会将这些信息发送到 Google 或其他定位服务提供商的服务器。服务器会根据这些信息,结合其数据库中存储的基站和 Wi-Fi 热点的位置信息,计算出设备的大致位置。 #### 6. 接收并处理定位结果 服务器处理完请求后,会将定位结果返回给 Android 设备。`LocationListener` 的 `onLocationChanged` 方法会被调用,应用可以在该方法中获取到最新的位置信息: ```java @Override public void onLocationChanged(Location location) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); // 处理位置信息 } ``` #### 7. 停止定位服务 当应用不再需要定位服务时,应该及时停止定位更新,以节省设备的电量。可以通过调用 `LocationManager.removeUpdates` 方法来停止更新: ```java locationManager.removeUpdates(locationListener); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值