zoukankan      html  css  js  c++  java
  • Android 使用LocationManger进行定位

    在Android应用中,往往有获取当前地理位置的需求,比如微信获取附近的人需要获取用户当前的位置,不多说,直接上例子。

        public Location getLocation() {
            LocationManager locManger = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            List<String> providers_list = locManger.getAllProviders();
            for (String item : providers_list) {
                Location loc = locManger.getLastKnownLocation(item);
                if (loc != null) {
                    return loc;
                }
            }
            String str1 = LocationManager.GPS_PROVIDER;
            String str2 = LocationManager.PASSIVE_PROVIDER;
            String str3 = LocationManager.NETWORK_PROVIDER;
            return null;
        }
      // 上面providers_list中的三个子项一般就为str1,str2,str3,这是常见的几种手机支持的定位,需要注意的是有的手机好像只支持PASSIVE_PROVIDER{我在一个项目
      就是因为只写了另外两种而查不到地理位置}
      // 当没有得到位置信息时,可以通过请求更新位置信息看是否能够获取位置信息
      loc.requestLocationUpdates(provider, minTime, minDistance, listener);// 四个参数分别为:provider名称,请求间隔时间,更新最小距离,位置监听器

    Location的一些简单用法

    public void LocationMethod() {// Location常用方法简介
            Location loc = getLocation();
            // loc.distanceTo(Location dest);float
            // loc.getAltitude();double 海拔高度
            // loc.getLatitude();double
            // loc.getLongitude();double
            // loc.getSpeed();float
        }

    要想使用Location服务,还必须添加Location的权限:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    ---------------------------------------------------修改-----------------------------------------------------------------------------
    最近在项目中遇到一个问题,用上述的方法并不能很好的解决定位的问题,大多数手机用上述方法可以实现定位,但在有的手机上,仍然无法定位,最后只得使用百度定位SDK进行定位才得以解决;
    一、添加一个百度定位服务及权限

    <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
    </service>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET" />
    

    二、编写实现代码

    public class LocationManger {
        private LocationClient mLocClient;
        private BDLocationListener listener;
        private Context context;
    
        public LocationManger(Context context) {
            super();
            this.context = context;
        }
    
        public void getLocation() {
            mLocClient = new LocationClient(context);
            listener = new BDLocationListener() {
                @Override
                public void onReceivePoi(BDLocation arg0) {
                }
    
                @Override
                public void onReceiveLocation(BDLocation location) {
                    if (location != null) {
                        Log.e("" + location.getLatitude(),
                                "" + location.getLongitude());
                        mLocClient.unRegisterLocationListener(listener);
                    }
                }
            };
            mLocClient.registerLocationListener(listener);
            LocationClientOption option = new LocationClientOption();
            option.setOpenGps(true);
            option.setAddrType("all");// 返回的定位结果包含地址信息
            option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
            option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
            option.disableCache(true);// 禁止启用缓存定位
            option.setPoiNumber(5); // 最多返回POI个数
            option.setPoiDistance(1000); // poi查询距离
            option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息
            mLocClient.setLocOption(option);
            mLocClient.start();
            if (mLocClient != null && mLocClient.isStarted()) {
                mLocClient.requestLocation();
            }
        }
    }

    BDLocationListener接口
    BDLocationListener接口有2个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。 2.接收异步返回的POI查询结果,参数是BDLocation类型参数。在一般的程序中,只需要重写第一个方法即可,里面返回的BDLocationo类型参数包含了经纬度信息; 

  • 相关阅读:
    02
    springmvc根据请求uri获取handlermapping源码
    springmvc零xml配置原理
    maven使用tomcat插件出现Failed to start component [StandardService[Tomcat]]: Failed to start component [StandardEngine[Tomcat]]: A child container failed during startd错误
    zipkin以JAR文件启动以Mysql作为持久化方式
    OAuth2AuthenticationProcessingFilter资源认证服务器过滤器
    OAuth2中四种授权模式以及相应操作
    JVM双亲委派机制
    springcloud对应springboot版本【如果版本依赖不对,则会出现一堆神奇的问题】
    python实现一元二次表达式求值
  • 原文地址:https://www.cnblogs.com/a284628487/p/3023556.html
Copyright © 2011-2022 走看看