• Android源码分析(十五)----GPS冷启动实现原理分析


    一:原理分析
    1. 主要sendExtraCommand方法中传递两个参数, 根据如下源码可以知道第一个参数传递delete_aiding_data,第二个参数传递null即可。
        @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;
        }
    
    
        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;
        }
    
    

    根据flags值GPS_DELETE_ALL清除数据

    static void android_location_GpsLocationProvider_delete_aiding_data(JNIEnv* /* env */,
                                                                        jobject /* obj */,
                                                                        jint flags)
    {
        if (sGpsInterface)
            sGpsInterface->delete_aiding_data(flags);
    }
    
        /**
         * Specifies that the next call to start will not use the
         * information defined in the flags. GPS_DELETE_ALL is passed for
         * a cold start.
         */
        void  (*delete_aiding_data)(GpsAidingData flags);
    
    二:实现方式

    java层主要代码如下:

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Bundle bundle = null;
    locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "force_xtra_injection", bundle);
    locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "force_time_injection", bundle);
    //GPS cold start
    locationManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "delete_aiding_data", bundle);
    

    所需权限配置如下, 6.0版本可能需要动态申请权限。

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    

    喜欢源码分析系列可参考其他文章:
    Android源码分析(一)-----如何快速掌握Android编译文件
    Android源码分析(二)-----如何编译修改后的framework资源文件
    Android源码分析(三)-----系统框架设计思想
    Android源码分析(四)-----Android源码编译及刷机步骤
    Android源码分析(五)-----如何从架构师的角度去设计Framework框架

  • 相关阅读:
    silverlight 跨域文件位置
    Asp.net弹出新窗口,获得返回值
    开通CNblog咯。
    访问IIS元数据库失败
    li可以显示多列
    [转]vs2005 sp1 下载地址、安装方法更新非常慢
    英特尔未来教育核心课程
    很好用的软键盘
    CMD里显示彩色文字
    将输入的中文按要求翻译成拼音
  • 原文地址:https://www.cnblogs.com/ljx646566715/p/10893959.html
Copyright © 2020-2023  润新知