android 定位
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 定位相关推荐
- android 定位的几种方式介绍
[地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络 ...
- android 定位服务 耗电吗,关于Android的定位服务
今天因为工作须要,把以前编写的一个GPS测试法度榜样拿出来从新修改了一下.这个法度榜样说起来竽暌剐些汗青了,是我11年编写的,那时刻学了Android开辟没多久,算是一个实验性的作品.如今工作须要,从 ...
- 定位 android8.1.0,8.1.2 实现Android定位(2)
8.1.2 实现Android定位(2) (3)实现定位管理器 可以使用Context.getSystemService()方法实现定位管理器功能,并传入Context.LOCATION_ SERV ...
- android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...
如何触发广播接收器在GPS开启/关闭? 问题描述 投票:35回答:5 public class BootReceiver extends BroadcastReceiver { @Override p ...
- 利用百度地图Android定位SDK获取经纬度
环境的搭建(参考上一次的文章) 百度地图Android定位SDK的使用 2.在Android studio里设计程序来获取经纬度 界面布局activity_main.xml文件的源代码: <?x ...
- 基于百度地图实现Android定位功能实现(详解+教程)
基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...
- Android定位功能(二)
在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息.但是前文是基于Criteria定制了一个标准,通过getBestProvide ...
- 七、Android定位与拨打电话、发送短信
Android定位与拨打电话.发送短信 前言 项目目录 1.定位 (1)代码LocationActivity.activity_location (2)权限 2.拨打电话.发送短信 3.MainAct ...
- Android定位方式和测试方法,定位方式(d16)
一,回顾, ①selector和xpath的区别,selector是解析的html,xpth是解析的xml,所以使用selector比使用xpath快, ②定位元素的单数和复数,当使用单数定位不到元素 ...
- android定位:获取当前位置的经纬度
Android定位主要使用的是基于位置服务(Location Based Service)技术,有了 Android 系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操作,比如定位城市,根据我 ...
最新文章
- 如何批量给数字前面加半角单引号[转]
- Android Studio vs Eclipse:你需要知道的那些事
- css3 卡片亮光_利用css3实现文字亮光特效的代码
- java docx4j 合并word_利用docx4j来处理word的合并与拆分
- 了解播放过滤器API
- 跟着阿里大牛捞干货:2019这5本书带你玩转大数据
- springcloud记录篇6-分布式配置中心
- (转)Spring+JDBC组合开发
- 华为应用市场AppGallery Connect研习社·直播:百万开发者打造优质应用的奥秘
- 防备电脑死机故障技巧的8个方法
- c语言 可以得什么软件下载,用C语言的软件哪可以下载啊?
- SSD选购扫盲指南M.2接口硬盘选择:NVMe于sata3
- iOS应用内付费(In-App Purchase,IAP,内购)实现要点总结
- 立创eda学习笔记十七:铺铜
- 十年匠心,让国漫精致到羽翼丰满!《老鹰抓小鸡》幕后制作分享
- 关于IE、Firefox、Opera页面呈现异同 (转于纯蓝)
- 从B树、B+树、B*树谈到R 树
- 苹果电脑安装java_mac系统 安装 JDK 并配置环境
- 有哪些适合练手的爬虫小项目?
- 从书法中窥测字体的演变
热门文章
- JAVA万年历(函数实现)
- try java 的用法,java中try的用法
- 震惊!树梅派Linux(Ubuntu)还能制作windows7系统启动u盘(成功)
- 干涉测量技术的应用_百篇科普系列(71)—激光干涉的精密测量技术
- Uncaught (in promise) 的解决方法,可能原因
- Rust中的关键字Some、Option
- python 类型检查工具_pyre check-用于符合PEP 484的Python的高性能类型检查器
- unity 简单AI巡逻
- 基于51单片机的倒车雷达设计
- vue 实现多个空白占位符