`
jacky-zhang
  • 浏览: 316008 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

位置服务的封装

 
阅读更多
/**
 * Retrieve accurate location from GPS or network services. 
 * 
 *
 * Class usage example:
 * 
 * public void onCreate(Bundle savedInstanceState) {
 *      ...
 *      my_location = new MyLocation();
 *      my_location.init(main.this, locationResult);
 * }
 * 
 * 
 * public LocationResult locationResult = new LocationResult(){
 *      @Override
 *      public void gotLocation(final Location location){
 *          // do something
 *          location.getLongitude();
 *          location.getLatitude();
 *      }
 *  };
 */
public class MyLocations{

    /**
     * If GPS is enabled. 
     * Use minimal connected satellites count.
     */
    private static final int min_gps_sat_count = 5;

    /**
     * Iteration step time.
     */
    private static final int iteration_timeout_step = 500;

    LocationResult locationResult;
    private Location bestLocation = null;
    private Handler handler = new Handler();
    private LocationManager myLocationManager; 
    public Context context;

    private boolean gps_enabled = false;

    private int counts    = 0;
    private int sat_count = 0;

    private Runnable showTime = new Runnable() {

         public void run() {
            boolean stop = false;
            counts++;
            System.out.println("counts=" + counts);

            //if timeout (1 min) exceeded, stop tying
            if(counts > 120){
                stop = true;
            }

            //update last best location
            bestLocation = getLocation(context);

            //if location is not ready or don`t exists, try again
            if(bestLocation == null && gps_enabled){
                System.out.println("BestLocation not ready, continue to wait");
                handler.postDelayed(this, iteration_timeout_step);
            }else{
                //if best location is known, calculate if we need to continue to look for better location
                //if gps is enabled and min satellites count has not been connected or min check count is smaller then 4 (2 sec)  
                if(stop == false && !needToStop()){
                    System.out.println("Connected " + sat_count + " sattelites. continue waiting..");
                    handler.postDelayed(this, iteration_timeout_step);
                }else{
                    System.out.println("#########################################");
                    System.out.println("BestLocation finded return result to main. sat_count=" + sat_count);
                    System.out.println("#########################################");

                    // removing all updates and listeners
                    myLocationManager.removeUpdates(gpsLocationListener);
                    myLocationManager.removeUpdates(networkLocationListener);    
                    myLocationManager.removeGpsStatusListener(gpsStatusListener);
                    sat_count = 0;

                    // send best location to locationResult
                    locationResult.gotLocation(bestLocation);
                }
            }
         }
    };

    /**
     * Determine if continue to try to find best location
     */
    private Boolean needToStop(){

        if(!gps_enabled){
                          return true;
                     }
          else if(counts <= 4){
                return false;
            }
            if(sat_count < min_gps_sat_count){
                //if 20-25 sec and 3 satellites found then stop
                if(counts >= 40 && sat_count >= 3){
                    return true;
                }
                return false;
            }
//        }
        return true;
    }

    /**
     * Best location abstract result class
     */
    public static abstract class LocationResult{
         public abstract void gotLocation(Location location);
     }

    /**
     * Initialize starting values and starting best location listeners
     * 
     * @param Context ctx
     * @param LocationResult result
     */
    public void init(Context ctx, LocationResult result){
        context = ctx;
        locationResult = result;

        myLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        gps_enabled = (Boolean) myLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        bestLocation = null;
        counts = 0;

        // turning on location updates
        myLocationManager.requestLocationUpdates("network", 0, 0, networkLocationListener);
        myLocationManager.requestLocationUpdates("gps", 0, 0, gpsLocationListener);
        myLocationManager.addGpsStatusListener(gpsStatusListener);

        // starting best location finder loop
        handler.postDelayed(showTime, iteration_timeout_step);
    }

    /**
     * GpsStatus listener. OnChainged counts connected satellites count.
     */
    public final GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() {
        public void onGpsStatusChanged(int event) {

             if(event == GpsStatus.GPS_EVENT_SATELLITE_STATUS){
                try {
                    // Check number of satellites in list to determine fix state
                     GpsStatus status = myLocationManager.getGpsStatus(null);
                     Iterable<GpsSatellite>satellites = status.getSatellites();

                     sat_count = 0;

                     Iterator<GpsSatellite>satI = satellites.iterator();
                     while(satI.hasNext()) {
                         GpsSatellite satellite = satI.next();
                         System.out.println("Satellite: snr=" + satellite.getSnr() + ", elevation=" + satellite.getElevation());                         
                         sat_count++;
                     }
                } catch (Exception e) {
                    e.printStackTrace();
                    sat_count = min_gps_sat_count + 1;
                }

                 System.out.println("#### sat_count = " + sat_count);
             }
         }
    };

    /**
     * Gps location listener.
     */
    public final LocationListener gpsLocationListener = new LocationListener(){
        public void onLocationChanged(Location location){

        }
         public void onProviderDisabled(String provider){}
         public void onProviderEnabled(String provider){}
         public void onStatusChanged(String provider, int status, Bundle extras){}
    }; 

    /**
     * Network location listener.
     */
    public final LocationListener networkLocationListener = new LocationListener(){
        public void onLocationChanged(Location location){

        }
         public void onProviderDisabled(String provider){}
         public void onProviderEnabled(String provider){}
         public void onStatusChanged(String provider, int status, Bundle extras){}
    }; 


    /**
     * Returns best location using LocationManager.getBestProvider()
     * 
     * @param context
     * @return Location|null
     */
    public static Location getLocation(Context context){
        System.out.println("getLocation()");

        // fetch last known location and update it
        try {
            LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
             criteria.setAltitudeRequired(false);
             criteria.setBearingRequired(false);
             criteria.setCostAllowed(true);
             String strLocationProvider = lm.getBestProvider(criteria, true);

             System.out.println("strLocationProvider=" + strLocationProvider);
             Location location = lm.getLastKnownLocation(strLocationProvider);
             if(location != null){
                return location;
             }
             return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
分享到:
评论

相关推荐

    HarmonyOS位置服务(Location Kit)封装

    数字化飞速发展的今天,我们所拥有的智能设备中各种各样的应用程序,其中的位置服务功能正悄然改变着我们的生活方式。比如外卖订餐App可根据我们所在位置推荐周边商家和外卖小哥,短视频App可根据我们所在位置推荐...

    用Java 和WebServices 技术实现移动位置服务

    通过使用WebServices技术,可以将特定的位置服务封装为Web服务,并在J2ME终端进行调用。Web服务具有松散耦合的特点,非常适合跨系统跨平台的信息交换,允许任何一方更改执行机制而不影响应用程序的正常运行。 #####...

    Wrapper将Java Application程序封装为Windows下面的服务

    总结来说,Wrapper提供了一种简单有效的方法,将Java应用程序封装为Windows服务,使得Java应用能够在Windows环境中稳定、高效地运行。通过正确配置`wrapper.conf`文件,我们可以轻松地管理Java应用的服务生命周期,...

    立创商城PCB标准封装库

    - PcbLib文件包含了所有封装的定义,每个封装都是一个独立的记录,包括焊盘的尺寸、形状、位置以及相关的3D模型信息。 3. **元器件封装种类**: - 立创商城的封装库涵盖了各种常见的电子元器件,如电阻、电容、...

    MINI_PCIE封装库.zip

    "MINI_PCIE.PcbLib"是Altium Designer的PCB库文件,它存储了Mini PCIe相关组件的详细信息,包括元件的尺寸、引脚位置、形状以及连接方式等。这个文件可能包含了Mini PCIe插槽(座子)和PCI Express接口板的封装模型...

    FPC插座0.5mm间距PCB封装库(AD库,封装带3D视图)

    在电子设计中,封装是指元件在电路板上的物理布局和连接方式,它决定了元件在实际电路板上的位置和焊盘分布。 描述中提到,这个库是“湾贴封装”,这意味着插座的形状设计为弯角形,这种设计通常是为了适应电路板的...

    立创的pcb封装

    标题“立创的pcb封装”提及的立创,通常指的是立创电子商城,这是一个知名的电子元器件采购与设计服务平台。立创提供的PCB封装库是为设计师提供的一系列预设的元器件模型,便于他们在设计电路板时快速、准确地进行...

    常用PCB封装库,3D库

    嘉立创是一家知名的PCB制造服务商,其提供的封装标准被广泛接受和使用,因此这个封装库对于使用嘉立创服务的设计师来说,尤其具有实用性。 “封装可以直接用嘉立创表贴”意味着这个库中的元器件封装符合嘉立创的SMT...

    触控弹簧PCB封装库(AD库,封装带3D视图)

    1. 封装外形:这是元器件在PCB板上的物理形状,包括引脚的位置和尺寸。 2. 引脚定义:定义了每个引脚的电气性质,如功能、信号类型等。 3. 3D模型:提供元器件的立体形状,用于模拟实际装配。 4. 焊盘和丝印:描述...

    嘉立创PCB封装规范.pdf

    而对于两端阻容器件,尽管这类器件本身没有极性,但封装时必须水平放置,两个焊盘按左右位置摆放,不能按上下位置进行摆放。 这些标准的目的在于确保在嘉立创进行SMT贴片时,每个器件都能正确放置,以避免器件极性...

    基于腾讯位置服务 JavaScript API 封装的 React 版地图组件库

    【作品名称】:基于腾讯位置服务 JavaScript API 封装的 React 版地图组件库 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目...

    esim-2X2mm封装图.zip

    描述中提到的“中国移动NB-IoT卡eSIM卡(具体尺寸为2*2毫米)PCB封装图(AD封装图)”指出了这个eSIM卡是专为中国移动的窄带物联网(NB-IoT)服务设计的。NB-IoT是一种低功耗广域网络技术,适用于需要长时间电池寿命...

    嘉立创元器件封装库(常用元件库)

    封装定义了元件在PCB上的占位空间、焊盘位置和大小,以及连接到电路的引脚数量和排列。正确选择和使用元器件封装对于确保电路板的正确焊接和功能至关重要。 2. **嘉立创**:嘉立创是一家知名的电子制造服务提供商,...

    嘉立创的封装,包含原理图和pcb图

    1. PCB封装库:封装库是电路设计软件中的一个重要组成部分,它存储了各种电子元件的外形尺寸、引脚位置和焊盘形状等信息。这些信息对于绘制原理图和PCB布局至关重要,因为它们确保了实际元件能够正确地安装到PCB上。...

    ESP8266-12原理图和3D封装库,AD封装库

    这款芯片由Espressif Systems公司设计,它提供了强大的无线连接功能,支持TCP/IP协议栈,可以实现Wi-Fi连接到各种网络服务。在电路设计中,了解其原理图和封装库是非常重要的。 首先,我们要讨论的是ESP8266-12的...

    中移物联网 NBIOT eSIM卡 原理图及PCB封装

    AD封装图包含了元件的电气连接、物理尺寸以及焊盘位置等信息,是制造PCB板的重要依据。在NBIOT eSIM卡的设计中,AD封装图确保了eSIM卡与主板之间的正确连接。 5. **esim-5X6mm封装和esim-2X2mm封装**: 这两个文件...

    FastAPI封装YOLO目标检测模型

    在IT行业中,模型封装和部署是机器学习项目落地的关键步骤,尤其当涉及到实时或在线服务时。本项目“FastAPI封装YOLO目标检测模型”旨在将YOLO(You Only Look Once)目标检测算法与FastAPI相结合,以创建一个高效、...

    高德地图常用方法封装

    "高德地图常用方法封装"是一个关于如何高效地利用高德地图JavaScript API进行开发的实践项目,通常包括对地图初始化、标记、信息窗口、路径规划、地理编码、事件监听等常见功能的封装,以提高代码复用性和易维护性。...

    百度定位封装

    在移动应用开发中,地理位置信息的获取是一项关键功能,它能帮助用户了解自身位置,提供导航、周边服务查询等便利。百度地图API提供了强大的定位服务,而"百度定位封装"则是在此基础上进行的一层抽象,旨在简化...

    LED封装数据库.pdf

    在全球范围内,2009年,日本的日亚化继续保持全球第一的位置,而Samsung LED凭借其快速成长成为全球第四大LED封装厂。 总体来看,LED封装行业的发展趋势表明,技术优势和垂直整合是企业生存和发展的关键。面对全球...

Global site tag (gtag.js) - Google Analytics