android定位

开头

此文档主要介绍在android中的基本定位方式。

如何偷偷打开GPS

偷偷把GPS打开,这样就可以用GPS定位了。

当然不用GPS也可以通过网络或者基站信息等定位。

/*** Toggles the state of GPS. Actually turn on the gps** @param context*/private void toggleGps(Context context, boolean flag) {ContentResolver resolver = context.getContentResolver();boolean enabled = getGpsState(context);if (enabled ^ flag) {Settings.Secure.setLocationProviderEnabled(resolver,LocationManager.GPS_PROVIDER, flag);}}/*** get the state of GPS location.** @param context* @return true if enabled.*/private static boolean getGpsState(Context context) {ContentResolver resolver = context.getContentResolver();boolean open = Settings.Secure.isLocationProviderEnabled(resolver,LocationManager.GPS_PROVIDER);if (originGpsState == null) {originGpsState = open ? "open" : "close";}return open;}

监听地理位置变化

这里主要介绍使用GPS和NET的方式。

这两种方式基本是一样的。

LocationManager locationManager;locationManager = (LocationManager) mContext.getSystemService(contextService);String provider = LocationManager.GPS_PROVIDER;// 5000: every 5 seconds// 1: every 1 meters change.locationManager.requestLocationUpdates(provider, 5000, 1,gpsLocationListener, Looper.myLooper());// Add NETWORK_PROVIDERprovider = LocationManager.NETWORK_PROVIDER;locationManager.requestLocationUpdates(provider, 5000, 1,netLocationListener, Looper.myLooper());Looper.loop();

通过LocationManager的requestLocationUpdates进行监听。

如果看过一些网络攻略,可能会了解到使用Criteria和LocationManager的getBestProvider方法来获取最优provider。我们这里直接两种定位方式同进行。简单粗暴!

private final LocationListener gpsLocationListener = new LocationListener() {@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}@Overridepublic void onLocationChanged(Location location) {updateNewLocation(location);}};private final LocationListener netLocationListener = new LocationListener() {@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}@Overridepublic void onLocationChanged(Location location) {Log.d(TAG, "newLocationListener > onLocationChanged");updateNewLocation(location);}};

将经纬度转为地址信息

通过LocationListener中的onLocationChanged获取到位置信息。

private static final String LOCATION_URI_PART1 ="http://maps.googleapis.com/maps/api/geocode/json?latlng=";private static final String LOCATION_URI_PART2 = "&sensor=false&language=";private void updateNewLocation(Location location) {if (location != null) {double lat = location.getLatitude();double lng = location.getLongitude();String lan = Locale.getDefault().getLanguage();String locationUriStr = LOCATION_URI_PART1 + lat + "," + lng+ LOCATION_URI_PART2 + lan;if (mCm.getActiveNetworkInfo() == null) {} else {new ReadHttpGet().execute(locationUriStr);}}}

方法一:

拿到Location中的经纬度信息,通过google地图api转换为具体的位置信息。

ReadHttpGet extends AsyncTask<Object, Object, Object> {@Overrideprotected Object doInBackground(Object... params) {HttpGet httpRequest = new HttpGet(params[0].toString());try {HttpClient httpClient = new DefaultHttpClient();HttpResponse httpResponse = httpClient.execute(httpRequest);if (httpResponse.getStatusLine().getStatusCode()== HttpStatus.SC_OK) {Log.d(TAG, "HttpStatus.SC_OK");String strResult = EntityUtils.toString(httpResponse.getEntity());return strResult;} else {return "request error";}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}@Overrideprotected void onCancelled(Object result) {super.onCancelled(result);}@Overrideprotected void onPostExecute(Object result) {super.onPostExecute(result);try {if (result != null) {JSONObject jsonObject = new JSONObject(result.toString());JSONArray jsonArray = jsonObject.getJSONArray("results");JSONObject placemarkObj = jsonArray.getJSONObject(0);JSONArray adressArray = placemarkObj.getJSONArray("address_components");locationStr = adressArray.getJSONObject(3).getString("long_name")+ adressArray.getJSONObject(2).getString("long_name")+ adressArray.getJSONObject(1).getString("long_name")+ adressArray.getJSONObject(0).getString("long_name");// locationStr 位置信息} else {}} catch (JSONException e) {e.printStackTrace();}}@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected void onProgressUpdate(Object... values) {super.onProgressUpdate(values);}}

方法二:

这里也可以直接用Geocoder的getFromLocation拿到Address列表。

通过解析Address内容来实现。

private Geocoder mGeocoder;
mGeocoder = new Geocoder(this, Locale.getDefault());public class ReverseGeocoderTask extends AsyncTask<Void, Void, String> {@Overrideprotected String doInBackground(Void... arg0) {try {android.util.Log.i(TAG,"1");List<Address> address = mGeocoder.getFromLocation(31.22, 121.48, 1);android.util.Log.i(TAG,"address:" + address.size());StringBuilder sb = new StringBuilder();for (Address addr : address) { android.util.Log.i(TAG,"addr:" + addr);                  sb.append(addr.getAdminArea());}android.util.Log.i(TAG,"sb:" + sb.toString());Bundle data = new Bundle();data.putString("address", sb.toString());Message msg = mHandler.obtainMessage();msg.setData(data);mHandler.sendMessage(msg);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}
}

最后

用好之后把资源释放。

如果实现过程中用到其他东西也别忘记释放了。

if (locationManager != null) {locationManager.removeUpdates(gpsLocationListener);locationManager.removeUpdates(netLocationListener);locationManager = null;}

android 定位相关推荐

  1. android 定位的几种方式介绍

    [地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络 ...

  2. android 定位服务 耗电吗,关于Android的定位服务

    今天因为工作须要,把以前编写的一个GPS测试法度榜样拿出来从新修改了一下.这个法度榜样说起来竽暌剐些汗青了,是我11年编写的,那时刻学了Android开辟没多久,算是一个实验性的作品.如今工作须要,从 ...

  3. 定位 android8.1.0,8.1.2 实现Android定位(2)

    8.1.2  实现Android定位(2) (3)实现定位管理器 可以使用Context.getSystemService()方法实现定位管理器功能,并传入Context.LOCATION_ SERV ...

  4. android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...

    如何触发广播接收器在GPS开启/关闭? 问题描述 投票:35回答:5 public class BootReceiver extends BroadcastReceiver { @Override p ...

  5. 利用百度地图Android定位SDK获取经纬度

    环境的搭建(参考上一次的文章) 百度地图Android定位SDK的使用 2.在Android studio里设计程序来获取经纬度 界面布局activity_main.xml文件的源代码: <?x ...

  6. 基于百度地图实现Android定位功能实现(详解+教程)

    基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...

  7. Android定位功能(二)

    在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息.但是前文是基于Criteria定制了一个标准,通过getBestProvide ...

  8. 七、Android定位与拨打电话、发送短信

    Android定位与拨打电话.发送短信 前言 项目目录 1.定位 (1)代码LocationActivity.activity_location (2)权限 2.拨打电话.发送短信 3.MainAct ...

  9. Android定位方式和测试方法,定位方式(d16)

    一,回顾, ①selector和xpath的区别,selector是解析的html,xpth是解析的xml,所以使用selector比使用xpath快, ②定位元素的单数和复数,当使用单数定位不到元素 ...

  10. android定位:获取当前位置的经纬度

    Android定位主要使用的是基于位置服务(Location Based Service)技术,有了 Android 系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操作,比如定位城市,根据我 ...

最新文章

  1. 如何批量给数字前面加半角单引号[转]
  2. Android Studio vs Eclipse:你需要知道的那些事
  3. css3 卡片亮光_利用css3实现文字亮光特效的代码
  4. java docx4j 合并word_利用docx4j来处理word的合并与拆分
  5. 了解播放过滤器API
  6. 跟着阿里大牛捞干货:2019这5本书带你玩转大数据
  7. springcloud记录篇6-分布式配置中心
  8. (转)Spring+JDBC组合开发
  9. 华为应用市场AppGallery Connect研习社·直播:百万开发者打造优质应用的奥秘
  10. 防备电脑死机故障技巧的8个方法
  11. c语言 可以得什么软件下载,用C语言的软件哪可以下载啊?
  12. SSD选购扫盲指南M.2接口硬盘选择:NVMe于sata3
  13. iOS应用内付费(In-App Purchase,IAP,内购)实现要点总结
  14. 立创eda学习笔记十七:铺铜
  15. 十年匠心,让国漫精致到羽翼丰满!《老鹰抓小鸡》幕后制作分享
  16. 关于IE、Firefox、Opera页面呈现异同 (转于纯蓝)
  17. 从B树、B+树、B*树谈到R 树
  18. 苹果电脑安装java_mac系统 安装 JDK 并配置环境
  19. 有哪些适合练手的爬虫小项目?
  20. 从书法中窥测字体的演变

热门文章

  1. JAVA万年历(函数实现)
  2. try java 的用法,java中try的用法
  3. 震惊!树梅派Linux(Ubuntu)还能制作windows7系统启动u盘(成功)
  4. 干涉测量技术的应用_百篇科普系列(71)—激光干涉的精密测量技术
  5. Uncaught (in promise) 的解决方法,可能原因
  6. Rust中的关键字Some、Option
  7. python 类型检查工具_pyre check-用于符合PEP 484的Python的高性能类型检查器
  8. unity 简单AI巡逻
  9. 基于51单片机的倒车雷达设计
  10. vue 实现多个空白占位符