gps冷启动,温启动和热启动源码分析

GPS模块启动模式 记录学习GPS启动模式 阅读详情
  1. GpsLocationProvider.java 在全局定义了一个通往底层的方法,这个就是关联到flags是什么,通常做底层会封装好改接口,然后告诉你传递什么值对应着以什么方式启动,比如传入参数:冷启动:0XFFFF 暖启动:0X0001 热启动:0X0001
private native void native_delete_aiding_data(int flags);
  1. 看native_delete_aiding_data该方法被调用时,先判断传递的Bundle对象是否为空;a.为空对应着冷启动;b.创建Bundle对象时,bundle.putBoolean(“ephemeris”, true)时对应着温启动;c.同样创建Bundle对象,传入bundle.putBoolean(“almanac”, true);详细见5
//全局中定义到:
private static final int GPS_DELETE_ALL = 0xFFFF;
private static final int GPS_DELETE_EPHEMERIS = 0x0001;
private static final int GPS_DELETE_ALMANAC = 0x0002;
...
private boolean deleteAidingData(Bundle extras) {
    int flags;

    if (extras == null) {
        flags = GPS_DELETE_ALL;
    } else {
        flags = 0;
        if (extras.getBoolean("ephemeris")) flags |= GPS_DELETE_EPHEMERIS;
        if (extras.getBoolean("almanac")) flags |= GPS_DELETE_ALMANAC;
        if (extras.getBoolean("position")) flags |= GPS_DELETE_POSITION;
        if (extras.getBoolean("time")) flags |= GPS_DELETE_TIME;
        if (extras.getBoolean("iono")) flags |= GPS_DELETE_IONO;
        if (extras.getBoolean("utc")) flags |= GPS_DELETE_UTC;
        if (extras.getBoolean("health")) flags |= GPS_DELETE_HEALTH;
        if (extras.getBoolean("svdir")) flags |= GPS_DELETE_SVDIR;
        if (extras.getBoolean("svsteer")) flags |= GPS_DELETE_SVSTEER;
        if (extras.getBoolean("sadata")) flags |= GPS_DELETE_SADATA;
        if (extras.getBoolean("rti")) flags |= GPS_DELETE_RTI;
        if (extras.getBoolean("celldb-info")) flags |= GPS_DELETE_CELLDB_INFO;
        if (extras.getBoolean("all")) flags |= GPS_DELETE_ALL;
    }

    if (flags != 0) {
        native_delete_aiding_data(flags);
        return true;
    }

    return false;
}
  1. 继续看deleteAidingData方法:sendExtraCommand是在LocationProviderInterface里定义的,需要传递进去delete_aiding_data值和上面2中需要的Bundle对象
@Override
public boolean sendExtraCommand(String command, Bundle extras) {

    long identity = Binder.clearCallingIdentity();
    boolean result = false;

    if ("delete_aiding_data".equals(command)) {
        result = deleteAidingData(extras);
    } else if ("force_time_injection".equals(command)) {
        sendMessage(INJECT_NTP_TIME, 0, null);
        result = true;
    } else if ("force_xtra_injection".equals(command)) {
        if (mSupportsXtra) {
            xtraDownloadRequest();
            result = true;
        }
    } else {
        Log.w(TAG, "sendExtraCommand: unknown command " + command);
    }

    Binder.restoreCallingIdentity(identity);
    return result;
}
  1. LocationManagerService.java服务,是如何LocationProviderInterface里的sendExtraCommand:可以看出来要调用p.sendExtraCommand(command, extras)则要在远程中实现,使用ILocationManager对象调用sendExtraCommand()方法
public class LocationManagerService extends ILocationManager.Stub {
    ...
    @Override
    public boolean sendExtraCommand(String provider, String command, Bundle extras) {
        if (provider == null) {
            // throw NullPointerException to remain compatible with previous implementation
            throw new NullPointerException();
        }
        checkResolutionLevelIsSufficientForProviderUse(getCallerAllowedResolutionLevel(),
                provider);

        // and check for ACCESS_LOCATION_EXTRA_COMMANDS
        if ((mContext.checkCallingOrSelfPermission(ACCESS_LOCATION_EXTRA_COMMANDS)
                != PackageManager.PERMISSION_GRANTED)) {
            throw new SecurityException("Requires ACCESS_LOCATION_EXTRA_COMMANDS permission");
        }

        synchronized (mLock) {
            LocationProviderInterface p = mProvidersByName.get(provider);
            if (p == null) return false;

            return p.sendExtraCommand(command, extras);
        }
    }
  1. 再从调用方出发出发,看LocationManagerService(也就是父类ILocationManager)中的sendExtraCommand方法何时被调用:
LocationManager mLm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//冷启动
Bundle bundle = null;
mLm.sendExtraCommand("gps", "force_xtra_injection", bundle); //command
mLm.sendExtraCommand("gps", "force_time_injection", bundle);
boolean b1 = mLm.sendExtraCommand("gps", "delete_aiding_data", bundle);

//温启动
Bundle bundleWarm = new Bundle();
bundleWarm.putBoolean("ephemeris", true);
mLm.sendExtraCommand("gps", "force_xtra_injection", bundleWarm); //command
mLm.sendExtraCommand("gps", "force_time_injection", bundleWarm);
boolean b2 = mLm.sendExtraCommand("gps", "delete_aiding_data", bundleWarm);

//热启动
Bundle bundleHot = new Bundle();
bundleHot.putBoolean("almanac", true);
mLm.sendExtraCommand("gps", "force_xtra_injection", bundleHot); //command
mLm.sendExtraCommand("gps", "force_time_injection", bundleHot);
boolean b3 = mLm.sendExtraCommand("gps", "delete_aiding_data", bundleHot);
  1. LocationManager.java中的sendExtraCommand,这里的provider要求的其实就是”gps”字符串,其中mService就是4中的ILocationManager,所以4中的sendExtraCommand方法就在这里执行了。
private final ILocationManager mService;
...
/**
 * Sends additional commands to a location provider.
 * Can be used to support provider specific extensions to the Location Manager API
 *
 * @param provider name of the location provider.
 * @param command name of the command to send to the provider.
 * @param extras optional arguments for the command (or null).
 * The provider may optionally fill the extras Bundle with results from the command.
 *
 * @return true if the command succeeds.
 */
public boolean sendExtraCommand(String provider, String command, Bundle extras) {
    try {
        return mService.sendExtraCommand(provider, command, extras);
    } catch (RemoteException e) {
        throw e.rethrowFromSystemServer();
    }
}
Android源码分析(十五)----GPS冷启动实现原理分析 一:原理分析 主要sendExtraCommand方法中传递两个参数, 根据如下源码可以知道第一个参数传递delete_aiding_data,第二个参数传递null即可。 @Override public boolean sendExtraCommand(String command, Bundle extras) { long identity = Bin... 阅读详情

相关推荐

GPS冷启动、热启动和温启动之间的区别及其在嵌入式系统中的应用

冷启动、热启动和温启动是在嵌入式系统中使用GPS功能时经常遇到的三种启动方式。温启动介于冷启动和热启动之间,利用部分保存的卫星信息来缩短启动时间。然而,在使用GPS之前,我们需要进行不同类型的启动,包括冷启动、热启动和温启动。在温启动过程中,GPS接收器尝试利用之前保存的一些卫星信息来加快获取卫星信号和计算位置的速度。以上是对GPS冷启动、热启动和温启动的区别的详细解释,并提供了相应的源代码示例,希望能帮助读者更好地理解和应用这些启动方式。GPS冷启动、热启动和温启动之间的区别及其在嵌入式系统中的应用。

CyberSphinx的博客 819

Android GPS 冷 热 温 启动,以及相关数据的清除

热启动:就是在上一次GPS定位到的情况下。关掉GPS,然后再打开,然后打开GPS去定位。一般3秒左右。 温启动:就是在上一次GPS定位到的情况下。关掉GPS,然后清除星历数据,然后打开GPS去定位。一般30秒左右。 冷启动:就是在上一次GPS定位到的情况下。关掉GPS,然后清除所有数据,然后重启手机(有的手机需要),然后打开GPS去定位。时间最长。 清除数据的代码如下,都是通过send...

Aaron121314的博客 2514

PCB设计必看:铜皮厚度与载流量的黄金比例(附实用对照表)

本文深入探讨了PCB设计中铜皮厚度与载流量的关键关系,提供了实用的对照表和设计技巧。通过分析基础原理、标准选择策略及常见误区,帮助工程师优化PCB设计,确保电路板的可靠性和安全性。特别适用于需要处理大电流或高频应用的电子设计场景。

milk8的博客 511

gps的冷启动

android gps的冷启动方法: LocationManager locMan; locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE);         locMan.reque

aresyangzz的专栏 3830

Echats-wordcloud 文字云图的踩坑点【Unknown series wordCloud】

一直都是报 【ECharts Unknown series wordCloud】这玩意可能要刷脸,祝你好运吧~

Sky_Bug的博客 2418

【微信小程序开发与设计】垃圾智能分类小程序

垃圾分类是将来生活可持续发展的必需项。但是很多人由于缺乏垃圾分类知识,或是因为垃圾分类困难,费时费力,所以没有好好贯彻垃圾分类政策,此时设计一款方便于群众进行智能化垃圾识别分类的微信小程序就显得尤为必要。

Markelle_Fultz的博客 8244

android gps 冷启,热启,温启 及gps相关信息的清理

热启动:就是在上一次GPS定位到的情况下。关掉GPS,然后再打开,然后打开GPS去定位。一般3秒左右。 温启动:就是在上一次GPS定位到的情况下。关掉GPS,然后清除星历数据,然后打开GPS去定位。一般30秒左右。 冷启动:就是在上一次GPS定位到的情况下。关掉GPS,然后清除所有数据,然后重启手机(有的手机需要),然后打开GPS去定位。时间最长。 清除数据的代码如下,都是通过sendExtraCommand来实现的,只是带的bundle不一样而已。 private LocationMana..

mawei7510的博客 1810

【视频编码学习】AVS3参考软件HPM-4.1简单配置运行

1、用Visual Studio2017打开HPM-4.1文件夹 2、找到文件夹目录下x86_windows文件夹,因为是在win上运行该代码 3、然后找到对应vs版本(我当时2017版)的解决方案sln文件,双击打开可以看到该解决方案下的全部项目。 4、重新生成解决方案时发现提示sdk版本问题,所以右键点击所有的项目,选择重定向项目,修改一下sdk版本。 ...

谦虚勤奋诚实感恩 3100

Android GPS开发总结

Android GPS开发总结

汽车以太网和SOA 7082

[SWPUCTF 2018]SimplePHP--一道简单的Phar反序列化题目

题目就不贴了,直接给出利用链①:echo会触发__toString魔术方法,所以这里的$this->test应该是Show类实例化的对象show②:这里应该使$this->str['str']为Test类实例化后的对象test,然后test->source会触发__get魔术方法(因为Test类没有名为source的成员变量,所以会触发get魔术方法,并且$key=source)③④:调用get方法,$...

Dream' 1258

Android TV开发:RecyclerView焦点控制实践与优化

在Android TV应用开发中,焦点控制是提升用户体验的关键技术。不同于移动端触摸交互,TV端通过遥控器方向键导航,需要精确的焦点管理机制。RecyclerView作为动态列表的核心组件,其焦点控制涉及视图复用、导航逻辑和视觉反馈等核心技术点。通过合理配置focusable属性、自定义焦点查找算法以及优化动画性能,开发者可以解决TV端常见的焦点跳转异常、视觉反馈延迟等问题。特别是在视频点播、智能家居控制等场景中,良好的焦点控制能显著提升操作效率。本文结合网格布局焦点环绕、分页加载焦点保持等实战案例,深入解

weixin_34195142的博客 469

android 注入gps,android – 协助数据注入GPS

我正在尝试开发一个使用GPS的应用程序,我想将XTRA数据和时间参考注入GPS,以便更快地修复.我的代码如下:Bundle bundle = new Bundle();boolean xtraInjection=locationmanager.sendExtraCommand(LocationManager.GPS_PROVIDER,"force_xtra_injection",bundle);b...

weixin_42318712的博客 468

vscode+latex+bib文献管理

下载vscode 安装插件`` 在setting.json中配置 在.tex文件中编写论文内容,然后左侧TEX侧边栏中编译,如下图所示,中文用xelatex,英文用pdflatex;编译成功后,就可以查看pdf版本的论文了,我一般在浏览器显示。 涉及到文献编译:XXX.bib中存储文献管理内容;XXX.tex是文章内容,使用xelatex编译后会生成XXX.aux,ctrl+⋅ctrl+·ctrl+⋅打开命令行窗口,输入bibtex XXX(可以对aux文件进行编译,不需要加后缀),然后再xelatex.

小卜妞的博客 2547

GPS接收机的三种启动方式

冷启动是指GPS接收机在没有任何有用信息的情况下启动。

weixin_47421800的博客 2394

量化策略分享之ST股弱转强,回测年化123%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强,弱转强的认定标准是前日涨停但昨日不涨停,昨日收盘价大于前一日最低价,昨日收盘价大于10日线,昨日成交量大于前一日的成交量但小于前一日成交量的10倍,股价大于1;这类股票强势,有资金介入,能获得超额收益。

qq_29301281的博客 1268

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android GPS ——AGPS源码分析及配置

Android Framework GPS ——AGPS源码分析及配置 1:冷启动指令:         locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "delete_aiding_data", null); 2:获取GPS 时间:         locationManager

qq_29333911的博客 4548

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android agps,Android应用开发Android GPS ——AGPS源码分析及配置

本文将带你了解Android应用开发Android GPS ——AGPS源码分析及配置,希望本文对大家学Android有所帮助。"Android Framework GPS ——AGPS源码分析及配置1:冷启动指令:locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER,""delete_aiding_data"", null);...

weixin_42196750的博客 1158

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

GPS接收机热启动、温启动、冷启动三种启动方式的区别

众所周知GPS接收机定位的时候,需要两种基本信息,一种卫星星历和卫星的观测数据(伪距、载波相位、测距码)。定位的条件星历和卫星的观测数据,缺一不可。 卫星星历是用来描述卫星轨道的参数,用这些参数可以计算出卫星,在地心地固坐标系中的坐标。卫星在向外发射的无线信号有三层,第一层是载波、第二次是测距码、第三层则是广播星历。星历以每秒50bit往外播发(北斗geo卫星除外),星历参数300bit是一个子帧,接收到完整的卫星电文需要12min30s。星历直接从是中频信号中剥离,一般不受接收机的特性影...

gp18391818575的博客 9118

GPS 启动方式

<br />启动GPS<br /> GPS开机定位分为冷启动、温启动和热启动三种: <br /><br /> 冷启动:以下几种情况开机均属冷启动。初次使用时;电池耗尽导致星历信息丢失时;关机状态下将接收机移动1000公里以上距离。 <br /><br /> 温启动:距离上次定位的时间超过两个小时的启动。 <br /><br /> 热启动:距离上次定位的时间小于两个小时的启动。

Yasin Lee 1900

GPS定位冷启动和热启动的区别

GPS定位冷启动和热启动的区别GPS模块一般支持冷启动(Cold start)和热启动(Hot start)两种模式(注:暖启动warm-start不讨论)1,    一般冷启动比热启动时间要长很多,以信号足够好为例,SirFIII的热启动为15秒以内,冷启动则需要42秒以内;在信号弱的情况下则需要更长时间; 热启动条件如下:    (1)上次关机前的位置信息(经纬度,高度)已知(所以在车库内关机...

zhangbijun1230的专栏 7875

GPS冷启动 温启动 热启动

首先普及两个概念:    星历(Ephemeris)与历书(Almanac)    为了缩短卫星锁定时间,GPS接收机需利用历书、当地位置的时间来预报卫星运行状态。    历书与星历都是表示卫星运行的参数。历书包括全部卫星的大概位置,用于卫星预报;星历只是当前接收机观测到的卫星的精确位置,用于定位。    1)cold(冷启动):没有之前的位置信息,没有星历,没有时间的估算。这种情况发生在

Horsdy123的专栏 4335

和菜鸟一起学android4.0.3源码之硬件gps简单移植

关于android定位方式 android 定位一般有四种方法,这四种方式分别是GPS定位、WIFI定位、基站定位、AGPS定位。 1、 Android GPS 需要GPS硬件支持直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块现在大部分的智能机应该都有了。通过GPS方式准确度是最高的但是它的缺点也非常明显。 1、 比较耗电 2、 绝大部分用户默认不开启GPS模块 3、

东月之神 2万+

GPS模块启动模式说明

1.启动方式GPS开机定位分为冷启动、温启动和热启动三种:  1、冷启动:以下几种情况开机均属冷启动。初次使用时;电池耗尽导致星历信息丢失时;关机状态下将接收机移动1000公里以上距离。   2、温启动:距离上次定位的时间超过两个小时的启动。  3、热启动:距离上次定位的时间小于两个小时的启动。2.启动时间MG2217S2模块标称时间如下:‍ 转载于:https://www.cnblogs.c...

weixin_30463341的博客 587

GPS入门 3 —— GPS的热启动、冷启动和温启动 [转]

GPS入门 3 —— GPS的热启动、冷启动和温启动 [转] (2008-10-11 18:41:10) var $tag=gps; var $tag_code=a43037eb9788e3f69c365354a2341e81; 标签:gps  分类:GPS.our.life启动

asdfasdfhhh的专栏 1491
上一篇: 5.0绑定远程服务的两种方式
下一篇: MySql常用命令总结
秦城季
博客等级 码龄10年 46粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值