Android基于位置的服务LBS
在Android中确定位置并不困难,主要借助LocationManager这个类就可以实现。
LocationManager的基本用法:
获得LocationManager实例:
LocationManager lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
接着我们需要一个位置提供器来确定当前设备的位置。Android中一般有三种位置提供器可供选择GPS_PROVIDER、NETWORK_PROVIDER、PASSIVE_PROVIDER.其中前两种用的较多,分别是GPS定位和网络定位。GPS定位的精准度比较高但是非常耗电;而网络定位的精准度稍差,但耗电量比较少。
选择好位置提供器传入到getLastKnownLocation();方法中:
String provider=lm.NETWORK_PROVIDER;Location location=lm.getLastKnownLocation(provider);
如果不确定有哪些位置提供器可以用,先获得启用的位置提供器,在进行判断:
List<String> providerList=lm.getProviders(true);
调用getLastKnownLocation()方法虽然能够获取到设备的当前位置信息,但是用户完全有可能带着设备随时移动的,怎样才能在设备位置改变的时候获取到最新的位置信息呢?LocationManager还提供了一个requestLocationUpdates()方法,该方法需要4个参数:第一个参数是位置提供其的类型,第二个参数是监听位置变化的间隔时间(毫秒),第三个参数是监听位置变化的距离间隔(米),第四个参数则是LocationListener监听器。监听器的onLocationChanged()方法在每次位置变化的时候就会执行。
通过Location实例对象获得当前位置的经纬度:
location.getLatitude();location.getLongitude();
移除位置监听器:
lm.removeUpdates(locationListener);
记得添加权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
反地理编码:
通过反地理编码,将经纬度值转换成看得懂的位置信息。
其实Android本身就提供了地理编码的API,主要是使用GeoCoder这个类实现的,可以非常简单的完成正向和反向的地理编码,但是,非常遗憾,GeoCoder长期存在一些严重的bug,因此我们不得不寻找GeoCoder的替代方案。
还算幸运,google提供了一套Gedcoding API,可以完成反地理编码。用法如下:
private void showLocation(final Location location){ new Thread(new Runnable() { @Override public void run() { try { StringBuilder strUrl=new StringBuilder(); strUrl.append("http://maps.googleapis.com/maps/api/geocode/json?latlng="); strUrl.append(location.getLatitude()).append(","); strUrl.append(location.getLongitude()); strUrl.append("&sensor=false"); URL url=new URL(strUrl.toString()); HttpURLConnection conn= (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.setRequestProperty("Accept-Language", "zh-CN"); InputStream in=conn.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(in)); StringBuilder sb=new StringBuilder(); String line=null; while((line=reader.readLine())!=null){ sb.append(line); } JSONObject jsonObject=new JSONObject(sb.toString()); JSONArray jsonArray=jsonObject.getJSONArray("results"); if (jsonArray.length()>0){ JSONObject subObject=jsonArray.getJSONObject(0); String address=subObject.getString("formatted_address"); handler.sendMessage(handler.obtainMessage(0,address)); } } catch (Exception e) { e.printStackTrace(); } } }).start();}private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case 0: tv.setText((String)(msg.obj)); break; } }}
这种方法实际就是将定位服务获取的经纬度信息拼接到Geocoding API的url上,通过解析返回的数据获得地理信息。
为避免中文乱码问题,需要在http请求头设置:
conn.setRequestProperty("Accept-Language", "zh-CN");
更多相关文章
- Android(安卓)Studio 默认debug证书位置在哪里(Mac os)
- FileProvider无法获取外置SD卡问题解决方案 | Failed to find co
- Android(安卓)GPS (当前位置 & GPS信息更新)
- android 将RecyclerView当成ViewPager用的一系列问题
- Android(安卓)内容提供器---创建内容提供器(元素)
- 在Android的c/c++代码中使用LOG
- unity3d开发一:入门知识+导入模型+旋转脚本
- Android中LocationManager的简单使用,获取当前位置
- 谈谈Android的so