Fused 定位

        Android 我们熟知提供了这几种Provider:Gps、Network、Passive、Mock、Fused,在网上前几种资料很多,最后一个FusedProvider去查资料得到的几乎就是这样的回答:

        FusedProvider(融合位置提供者)是由谷歌(Google)的谷歌服务框架(Google Play Services)实现的。Google Play Services 是一个由谷歌提供的应用程序开发框架,它提供了许多与 Android 设备和服务相关的功能和 API。其中包括位置服务,其中融合位置提供者(Fused Location Provider)是其中一个组件。Fused Location Provider 提供了一种集成了多个位置传感器和提供者的位置获取解决方案。它可以融合来自 GPS、Wi-Fi、蜂窝网络和传感器等多个源的位置数据,以提供准确和高效的位置信息。通过使用 Fused Location Provider,开发人员可以方便地获取设备的位置信息,而无需直接与各种位置传感器和提供者进行交互。Fused Location Provider 还提供了一些额外的功能,如后台位置更新、位置监听、地理围栏等,以满足不同应用的需求。需要注意的是,为了使用 Fused Location Provider,开发人员需要将谷歌服务框架(Google Play Services)集成到他们的应用程序中,并在设备上安装相应的谷歌服务。这样才能使用 Fused Location Provider API 来获取位置信息。

        那不禁好奇国内没有谷歌框架为啥我调用时还有位置返回呢?难道没有谷歌框架我们也能使用?带着这个疑问,我们就去看下代码吧。

        首先代码位置:http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/packages/FusedLocation/

        Android.bp 文件比较简单,就是编译出一个app

       

         src 里面只有两个类,主要看下 FusedLocationProvider.java

        

        根据我们之前文章分析的定位流程可以知道,当应用层通过LocationManager提供的API,然后通过AIDL调用到LocationManagerService,在调用到各个Provider。所以这就是为啥我们主要看下FusedLocationProvider的原因。

发起定位调用如下方法:

    public void onSetRequest(ProviderRequestUnbundled request, WorkSource workSource) {
        synchronized (mLock) {
            mRequest = request;
            mWorkSource = workSource;
            updateRequirementsLocked();
        }
    }   
    private void updateRequirementsLocked() {
        long gpsInterval = Long.MAX_VALUE;
        long networkInterval = Long.MAX_VALUE;
        if (mRequest.getReportLocation()) {   ---> 这个地方为true,下面解释为啥
            for (LocationRequestUnbundled request : mRequest.getLocationRequests()) {
             //这个reques就是我们常见的,比如:Request[POWER_LOW fused interval=0 fastestInterval=0 expireIn=+30s0ms num=1]
                switch (request.getQuality()) {
                    case LocationRequestUnbundled.ACCURACY_FINE:
                    case LocationRequestUnbundled.POWER_HIGH:
                        if (request.getInterval() < gpsInterval) {
                            gpsInterval = request.getInterval();
                        }
                        if (request.getInterval() < networkInterval) {
                            networkInterval = request.getInterval();
                        }
                        break;
                    case LocationRequestUnbundled.ACCURACY_BLOCK:
                    case LocationRequestUnbundled.ACCURACY_CITY:
                    case LocationRequestUnbundled.POWER_LOW:  --->可以看上面贴的request是POWER_LOW
                        if (request.getInterval() < networkInterval) {
                            networkInterval = request.getInterval();
                        }
                        break;
                }
            }
        }

解释下为啥是true,在LMS调用各个provider的时候,会通过这个 manager.setRequest(providerRequest.build());  方法,再看下里面的参数,build的时候默认就是true:

 在继续回到 updateRequirementsLocked 方法看下面的部分:

        if (gpsInterval != mGpsInterval) {
            resetProviderRequestLocked(GPS_PROVIDER, mGpsInterval, gpsInterval, mGpsListener);
            mGpsInterval = gpsInterval;
        }
        if (networkInterval != mNetworkInterval) {  ---> 这时候就满足这个,发起网络位置
            resetProviderRequestLocked(NETWORK_PROVIDER, mNetworkInterval, networkInterval,
                    mNetworkListener);
            mNetworkInterval = networkInterval;
        }
    }

 后面就是老一套了,有位置就回调,最终处理的地方在:

    private void reportBestLocationLocked() {
        Location bestLocation = chooseBestLocation(mGpsLocation, mNetworkLocation);   ---> 选择一个最合适的位置,这里只有network的
        if (bestLocation == mFusedLocation) {
            return;
        }
        // 此时最好的就是networkLocation
        mFusedLocation = bestLocation;
        if (mFusedLocation == null) {
            return;
        }

        // copy NO_GPS_LOCATION extra from mNetworkLocation into mFusedLocation
        if (mNetworkLocation != null) {
            Bundle srcExtras = mNetworkLocation.getExtras();
            if (srcExtras != null) {
                Parcelable srcParcelable =
                        srcExtras.getParcelable(LocationProviderBase.EXTRA_NO_GPS_LOCATION);
                if (srcParcelable instanceof Location) {
                    Bundle dstExtras = mFusedLocation.getExtras();
                    if (dstExtras == null) {
                        dstExtras = new Bundle();
                        mFusedLocation.setExtras(dstExtras);
                    }
                    dstExtras.putParcelable(LocationProviderBase.EXTRA_NO_GPS_LOCATION,
                            srcParcelable);
                }
            }
        }
        //上报位置,这块就是很熟悉的流程了
        reportLocation(mFusedLocation);
    }

至此,我们就知道了,在原生框架里,我们使用Fused,其实就是在获取一个框架认为的 BestLocation(GPS or Network)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 融合 Lasso(fused lasso)是一种用于信号处理和统计学中的回归方法,它可以在保持预测变量的稀疏性的同时,对连续变量进行平滑处理。它的主要思想是将相邻的变量进行组合,以便在模型中考虑它们之间的相关性。这种方法在许多领域中都有广泛的应用,例如图像处理、基因组学和金融学。 ### 回答2: Fused Lasso是一种基于L1范数惩罚的正则化技术,是对Lasso算法的一种拓展。Fused Lasso最初被提出解决数据处理中的信号分段问题,常被用于基因芯片分析、图像分割以及语音信号处理等领域。 L1范数惩罚是一种稀疏性控制方法,可以将某些特征的系数压缩为0,从而简化模型。Fused Lasso是对L1范数惩罚的一种进一步拓展,能够利用模型中特征之间的相关性,实现更为精细的分割效果。 具体来说,Fused Lasso通过对相邻特征之间的差值进行惩罚,实现了对信号分段的细致调控。在处理序列数据时,Fused Lasso可以识别出信号的断层点,并将信号分段处理;在图像分割中,Fused Lasso可以自动检测物体边缘,并将图像分割为大小相等的块;在语音信号处理中,则能够区分各个音节,以实现更高效精准的语音识别。 总之,Fused Lasso是一种常用于信号分段的正则化技术,通过L1惩罚和特征相邻差值的优化,能够在多个数据处理场景下实现高效、准确的分割效果。 ### 回答3: Fused Lasso算是一个非常有用的降维技巧和L1正则化的一种扩展方式。具体来说,对于一个高维数据而言,Fused Lasso方法能够在一定程度上将相关的特征进行合并,实现降维的效果。 Fused Lasso方法中,采用的是L1和L2两种正则化的组合,通过优化算法对特征向量进行降维,将其转化为一组相关的coefficient向量。在这个向量中,相邻的元素之间存在一定的共性,这种共性可以通过采用coefficient向量的导数来展现。也就是说,在Fused Lasso方法中,对于一段相邻的coefficient向量,它们之间的区别仅仅取决于其导数的大小。 在实际应用中,Fused Lasso方法可以被广泛用于信号降噪、基因表达等领域当中,具有非常好的效果。与其他的降维方法相比,Fused Lasso方法在处理一些高维稀疏矩阵数据的时候能够收到非常好的效果,可以大大减少计算复杂度和处理时间。 最后,需要说明的是,尽管Fused Lasso方法在很多领域中都表现出非常好的效果,但是该方法也存在一些缺点和限制。例如,在某些非代数非线性的数据类型上,其降维效果并不尽如人意,需要配合其他算法才能达到更好的效果。但总体而言,Fused Lasso方法作为一种高效有效的降维算法,还是值得广泛应用的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值