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 优先于提供者