首页
论坛
课程
招聘
[系统相关] [源码分析] [分享]安卓10源码开发定制(21)修改GPS定位数据测试gps定位代码
2021-2-6 14:35 2494

[系统相关] [源码分析] [分享]安卓10源码开发定制(21)修改GPS定位数据测试gps定位代码

2021-2-6 14:35
2494

一、测试gps定位功能的方法探讨

在安卓App gps定位开发过程中,往往需要进行GPS定位的测试。由于室内gps信号被挡住了,所以如果需要测试gps定位的代码,要么跑到室外去等待gps定位更新或者使用安卓sdk中提供的"MOCK_LOCATION"功能编写额外的测试代码来模拟gps位置更新。如果从系统定制的角度出发,也可以根据gps上报的流程来模拟gps上报的逻辑实现模拟gps 的定位数据。

二、修改系统实现模拟gps数据上报

2.1 安卓系统上报gps数据流程总结

在之前的文章安卓10源码开发定制(21)GPS定位研究(2)gps位置改变监听源码分析中已经分析安卓系统中gps数据上报的大概流程:

 

1. 当gps位置改变更新,com_android_server_location_GnssLocationProvider.cpp中通过反射调用GnssLocationProvider.java中的reportLocation方法将gps数据上报到安卓系统java层。

 

2. GnssLocationProvider.java中使用LocationProvider.java提供的onReportLocation方法将gps数据上报到GPS 位置管理器。

 

3. GPS位置管理器LocationProvider.java调用LocationManagerService.java提供的方法handleLocationChangedLocked将gps数据传到LocationManagerService.java中。

 

4. LocationManagerService.java中通过GPS_PROVIDER关键字获取缓存的注册监听器Receiver列表,然后遍历每一个监听器并调用监听的callLocationChangedLocked方法来通知客户端位置更新。

2.2 修改GPS数据的方案构想

参考以上gps上报的流程,可以在LocationManagerService中使用定时器。定时获取设置的gps坐标,然后通过名称GPS_PROVIDER获取缓存的GPS位置提供管理器对象,然后调用onReportLocation方法达到模拟上报的目的。

2.3 实现参考代码

基于以上构想,通过修改系统测试高德地图验证成功。以下是验证的核心参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
///ADD START
    //LocationManagerService中添加模拟上报位置的接口
   //主动上报GPS位置信息
   private void  reportLocation()
   {
 
       Timer time=new Timer();
       TimerTask timerTask=new TimerTask() {
           @Override
           public void run() {
               Location location=new Location(LocationManager.GPS_PROVIDER);
               location.setLongitude(117.27127064678953);
               location.setLatitude(39.138059417665445);
 
               location.setElapsedRealtimeNanos(System.nanoTime());
               location.makeComplete();
               LocationProvider mylocProvider=getLocationProviderLocked(LocationManager.GPS_PROVIDER);
               if(mylocProvider!=null)
               {
                   mylocProvider.onReportLocation(location);
                   XLog.d("LocationManagerService","onReportLocation success");
               }else{
                   XLog.d("LocationManagerService","mylocProvider is NULL");
               }
 
           }
       };
       time.schedule(timerTask,10*1000,5*1000);
   }
   ///ADD END

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

最后于 2021-4-12 22:10 被蟑螂一号编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回