Android之LocationManager

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之LocationManager相关的知识,希望对你有一定的参考价值。

  定位服务是移动设备上最常用的服务之一,在android系统中同样提供了这样的核心服务。其API主要在android.location包下,具体如下:

技术分享

       在上面截图中我们可以看出android平台中涉及的定位服务的API,现针对常用的几个类与接口做简单描述。

1、LocationManager:核心类,用于获取和调用定位服务。

2、LocationProvider:真正用于获取位置信息的组件,主要分为两类,一种依赖GPS设备,一种依赖网络。

3、Location:用于描述地址位置信息,包括经度,维度,海拔、方向等信息。

4、Geocode:用于处理地址为的编码。

5、Criteria:用于查询选择LocationProvider。

6、Address:用于描述地址信息。

7、LocationListener:用于接收位置信息改变时的监听器。

  LocationManager是整个位置服务入口,其实例的获取和其他Manager一样,通过Context.getSystem(Context.LOCATION_SERVICE)获取。其最重要的方法就是注册和注销服务的重载方法:

1、requestLocationUpdates :注册服务监听

2、removeUpdate:取消服务监听

3、getAllProviders:获取所有的LocationProvider

  LocationListener:用于接收从LocationManager的位置发生变化时的通知,在注册服务时,调用LocationManager的requestLocationUpdates(String, long, float, LocationListener)。接口中的方法如下:

1、public abstract void onLocationChanged (Location location):该方法在在位置发生变化时进行调用。参数location代表新位置。

2、public abstract void onStatusChanged (String provider, int Status, Bundle extras):该方法在Provider的状态发生变化时进行调用,状态有可用、不可用、无服务。

3、public abstract void onProviderDisabled(String provider):该方法在Provider被用户关闭时调用。

4、public abstract void onPorviderEnabled (Location location):该方法在Provider被用户打开是调用。

  Location类中封装了位置信息,包括经度、维度、海拔、速度、时间等,可用通过调用的他的如下方法进行获取:

1、getLongitude():经度

2、getLatitude():维度

3、getAccuracy():精度

4、getSpeed():速度

  Geocoder用于在街道地址和经纬度之间进行转换,它提供了对两种地理编码功能的方法:查找某个地址的经纬度和查找一个给定的经纬度所对应的街道地址。        

1、getFromLocation(double latitude,double longitude,int maxResults)

2、getFromLocationName(String locationName,int maxResults)

  下面我们通过一个案例来展示定位服务的具体用法

public class LocationManagerActivity extends ActionBarActivity {

    private LocationManager locationManager;
    private JreduLocationListener listener;
    private Geocoder geocoder;
    private TextView show;
    private TextView locationShow;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location_manager);
        locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
        show=(TextView)findViewById(R.id.show);
        locationShow=(TextView)findViewById(R.id.showLocation);
        listener = new JreduLocationListener();
        geocoder = new Geocoder(this);
    }

    public void getLocationProvider(View v){
        List<String> providers = locationManager.getAllProviders();
        StringBuilder sb = new StringBuilder();
        for(String p:providers){
            sb.append(p).append("\\n");
        }
        show.setText(sb.toString());


    }

    public void getLocation(View v){
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE); //设置定位精度
        criteria.setAltitudeRequired(true); //海拔
        criteria.setBearingRequired(true); //
        criteria.setCostAllowed(false);   //
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        criteria.setSpeedRequired(false);

        //根据上述设置获取合适的定位方式
        String providerName= locationManager.getBestProvider(criteria,true);

        //注册
        locationManager.requestLocationUpdates(providerName,0,0,listener);
    }

    private class JreduLocationListener implements LocationListener{

        /**
         * 位置发生变化时
         * @param location
         */
        @Override
        public void onLocationChanged(Location location) {
            final double latitude=location.getLatitude();      //维度
            final double longitude = location.getLongitude();  //经度

            StringBuilder sb = new StringBuilder();
            sb.append("经度:").append(longitude).append("\\n");
            sb.append("维度:").append(latitude).append("\\n");
            sb.append("精度:").append(location.getAccuracy()).append("\\n");
            sb.append("Speed:").append(location.getSpeed()).append("\\n");
            sb.append("Bearing:").append(location.getBearing()).append("\\n");
            sb.append("Time:").append(location.getTime()).append("\\n");
            locationShow.setText(sb.toString());

            //启动子线程进行地理位置编码解析
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                       List<Address> addresses=
                               geocoder.getFromLocation(latitude, longitude, 1);

                       Message msg = handler.obtainMessage(1);
                        msg.obj = addresses;
                        handler.sendMessage(msg);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();

        }


        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    }

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==1){
                StringBuilder sb = new StringBuilder();
                List<Address> addresses = (List<Address>)msg.obj;
                if(addresses.size()>0){
                    Address address = addresses.get(0);
                    StringBuilder sbAddress = new StringBuilder("Address:");
                    for(int i=0;i<address.getMaxAddressLineIndex();i++){
                        sbAddress.append(address.getAddressLine(i)).append("\\t");
                    }

                    sbAddress.append("\\n");
                    sbAddress.append("CountryName:").append(address.getCountryName()).append("\\n");
                    sbAddress.append("CountryCode:").append(address.getCountryCode()).append("\\n");
                    sbAddress.append("SubLocality:").append(address.getLocality()).append("\\n");
                    sbAddress.append("SubLocality:").append(address.getSubLocality()).append("\\n");

                    String old = locationShow.getText().toString();
                    locationShow.setText(old + "\\n" + sbAddress.toString());
                }

            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        locationManager.removeUpdates(listener);
    }
}

案例效果图如下:

技术分享

 

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:技术分享
 

以上是关于Android之LocationManager的主要内容,如果未能解决你的问题,请参考以下文章

Android - 使用 LocationManager 不会提供地理修复

当我得到 LocationManager 时发生异常。(Android)

android -LocationManager 为纬度和经度返回 0.0

在 Android 中使用 LocationManager 优先于提供者

LocationManager 在 Android 中使用 getLastKnownLocation 返回空经度

Android:locationManager GPS_provider VS Network_provider