zoukankan      html  css  js  c++  java
  • android gps定位LocationManager

    android location provider有: 

        * LocationManager.GPS_PROVIDER:GPS,精度比较高,但是慢而且消耗电力,而且可能因为天气原因或者障碍物而无法获取卫星信息,另外设备可能没有GPS模块; 
        * LocationManager.NETWORK_PROVIDER:通过网络获取定位信息,精度低,耗电少,获取信息速度较快,不依赖GPS模块。 

    这种定位方式取决于服务器,即取决于将基站或WIF节点信息翻译成位置信息的服务器的能力。由于目前大部分Android手机没有安装google官方的location manager库,大陆网络也不允许,即没有服务器来做这个事情,自然该方法基本上没法实现定位。

    只有NETWORK_PROVIDER这种模式才是室内定位可靠的方式,只不过由于大陆的网络,且大部分厂商也不会用google的服务,这种定位方式默认是没法用的。那怎么办?好办,找个替代的服务商就可以了,百度的位置信息sdk就可以解决这个问题。它的基本原理在上面已经提到过了,就是搜集你的wifi节点信息和你的手机基站信息来定位。

     * LocationManager.PASSIVE_PROVIDER:

              被动定位方式,这个意思也比较明显,就是用现成的,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了。比如如果系统中已经安装了百度地图,高德地图(室内可以实现精确定位),你只要使用它们定位过后,再使用这种方法在你的程序肯定是可以拿到比较精确的定位信息。

    android有一个Criteria类可以直接判断当前适合用gps或者network 并且设置LocationListener监听器实时更新location

    private void getLocalAddress() {
             LocationManager locationManager;
                locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                
                Criteria criteria = new Criteria();
                criteria.setAccuracy(Criteria.ACCURACY_FINE);
                criteria.setAltitudeRequired(false);
                criteria.setBearingRequired(false);
                criteria.setCostAllowed(true);
                criteria.setPowerRequirement(Criteria.POWER_LOW);
                String provider = locationManager.getBestProvider(criteria, true);
                
                Location location = locationManager.getLastKnownLocation(provider);
                
                locationManager.requestLocationUpdates(provider, 2000, 10,
                                locationListener);
                updateWithNewLocation(location);
        }
    
    
    private final LocationListener locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                updateWithNewLocation(location);
            }
    
            public void onProviderDisabled(String provider) {
                updateWithNewLocation(null);
            }
    
            public void onProviderEnabled(String provider) {
            }
    
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
        };
    
    
    private void updateWithNewLocation(Location location) {
            String latLongString;
            TextView myLocationText;
            if (location != null) {
                double lat = location.getLatitude();
                double lng = location.getLongitude();
                latLongString = "纬度:" + lat + "
    经度:" + lng;
            } else {
                latLongString = "无法获取地理信息";
            }
            Toast.makeText(SearchActivity.this, latLongString,
                    Toast.LENGTH_LONG).show();
        }
  • 相关阅读:
    gdb调试的基本使用
    重构改善代码--代码的坏味道
    17级单片机期中测试题目
    左右固定,中间自适应的三栏式布局五种写法
    存一些可能会用得到的vue的UI框架
    vue父子组件传值
    [Vue warn]: Missing required prop: "title"
    js中的值类型和引用类型的区别
    vue+node+mongoDB 火车票H5(四)---完成静态页面
    vue+node+mongoDB 火车票H5(三)---git提交时忽略不想提交的文件
  • 原文地址:https://www.cnblogs.com/l2rf/p/5550079.html
Copyright © 2011-2022 走看看