Android中LocationManager的简单使用03

Android基于位置的服务 Android基于位置的服务 1.基于位置的服务简介 基于位置的服务简称LBS,主要的工作原理是利用无线电通讯网络或GSP等定位方式来确定出移动设备所在的位置. GPS定位的工作原理是基于手机内置的GPS硬件直接和卫星交互来获取当前的经纬度信息,精确度高,只能在户外使用. 网络定位的工作原理是根据手机当前网络附近的三个基站进行测速,以此计算出手机和每个基站之间的距离,再通过三角形定位确定出一个大概的位置,精度一般,室内可用. 2.申请API Key https://lbsyun.baidu.com/inde 阅读详情

上接前两篇,要自己去读取什么CellId,LocationAreaCode, MobileCountryCode,MobileNetworkCode等参数,而且多数是针对GSM/UMTS。而自己使用的CDMA,跟上面的参数叫法不一样,还得自己一个一个去对应。虽然最后算是解决了,但是难道就没有更好的办法吗。

翻了翻Android Developer找到一个不错的东西LocationManager。LocationManager是通过listener的方式来告知调用者,而原来写好的模块是直接return的,于是得稍微改造一下:

首先定义一个Model:

  1. public class LocationData {  
  2.         String lat;  
  3.         String lon;  
  4.         String address;  
  5. }  

 

然后LBS的所有功能都封装到一个工具类里面:

首先在构造函数里面获取系统服务中的LocationManager:

  1. public class LBSTool {  
  2.     private Context mContext;  
  3.     private LocationManager mLocationManager;   
  4.     private LocationData mLocation;  
  5.     private LBSThread mLBSThread;  
  6.     private MyLocationListner mNetworkListner;  
  7.     private MyLocationListner mGPSListener;  
  8.     private Looper mLooper;  
  9.       
  10.     public LBSTool(Context context) {  
  11.         mContext = context;  
  12.         //获取Location manager  
  13.         mLocationManager = (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);  
  14.     }  
  15.   
  16. ......  
  17. }  

 

 然后是入口方法,这里会启动一个子线程去获取地理位置信息,并让主线程进入等待,时长通过timeout设置

  1. /**  
  2.  * 开始定位   
  3.  * @param timeout 超时设置  
  4.  * @return LocationData位置数据,如果超时则为null  
  5.  */  
  6. public LocationData getLocation(long timeout) {  
  7.     mLocation = null;  
  8.     mLBSThread = new LBSThread();  
  9.     mLBSThread.start();//启动LBSThread  
  10.     timeout = timeout > 0 ? timeout : 0;  
  11.       
  12.     synchronized (mLBSThread) {  
  13.         try {  
  14.             Log.i(Thread.currentThread().getName(), "Waiting for LocationThread to complete...");  
  15.             mLBSThread.wait(timeout);//主线程进入等待,等待时长timeout ms  
  16.             Log.i(Thread.currentThread().getName(), "Completed.Now back to main thread");  
  17.         }  
  18.         catch (InterruptedException e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22.     mLBSThread = null;  
  23.     return mLocation;  
  24. } 

子线程通过调用registerLocationListener开启位置服务的监听,并且讲监听器分配给指定looper

  1. private class LBSThread extends Thread {  
  2.     @Override  
  3.     public void run() {  
  4.         setName("location thread");   
  5.         Log.i(Thread.currentThread().getName(), "--start--");   
  6.         Looper.prepare();//给LBSThread加上Looper  
  7.         mLooper = Looper.myLooper();  
  8.         registerLocationListener();  
  9.         Looper.loop();  
  10.         Log.e(Thread.currentThread().getName(),  "--end--");  
  11.           
  12.     }  
  13. }  
  14.   
  15. private void registerLocationListener () {  
  16.     Log.i(Thread.currentThread().getName(), "registerLocationListener");          
  17.     if (isGPSEnabled()) {  
  18.         mGPSListener=new MyLocationListner();    
  19.   
  20.         //五个参数分别为位置服务的提供者,最短通知时间间隔,最小位置变化,listener,listener所在消息队列的looper  
  21.         mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, mGPSListener, mLooper);    
  22.     }  
  23.     if (isNetworkEnabled()) {  
  24.         mNetworkListner=new MyLocationListner();    
  25.  
  26.         mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, mNetworkListner, mLooper);    
  27.     }  
  28. } 

 isGPSEnabled和isNetworkEnabled分别为判断当前手机是否开启了GPS以及网络的状况(包含了是否开启wifi和移动网络),以决定使用哪一种服务提供者:GPS_PROVIDER或者NETWORK_PROVIDER。

  1. /**  
  2.  * 判断GPS是否开启  
  3.  * @return  
  4.  */  
  5. public boolean isGPSEnabled() {  
  6.     if(mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {  
  7.         Log.i(Thread.currentThread().getName(), "isGPSEnabled");  
  8.         return true;  
  9.     }   
  10.     else {  
  11.         return false;  
  12.     }  
  13. }  
  14.   
  15. /**  
  16.  * 判断Network是否开启(包括移动网络和wifi)  
  17.  * @return  
  18.  */  
  19. public boolean isNetworkEnabled() {  
  20.     return (isWIFIEnabled() || isTelephonyEnabled());   
  21. }  
  22.   
  23. /**  
  24.  * 判断移动网络是否开启  
  25.  * @return  
  26.  */  
  27. public boolean isTelephonyEnabled() {  
  28.     boolean enable = false;  
  29.     TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);  
  30.     if (telephonyManager != null) {  
  31.         if (telephonyManager.getNetworkType() != TelephonyManager.NETWORK_TYPE_UNKNOWN) {  
  32.             enable = true;  
  33.             Log.i(Thread.currentThread().getName(), "isTelephonyEnabled");  
  34.         }  
  35.     }  
  36.       
  37.     return enable;  
  38. }  
  39.   
  40. /**  
  41.  * 判断wifi是否开启  
  42.  */  
  43. public boolean isWIFIEnabled() {  
  44.     boolean enable = false;  
  45.     WifiManager wifiManager = (WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);  
  46.     if(wifiManager.isWifiEnabled()) {  
  47.         enable = true;  
  48.         Log.i(Thread.currentThread().getName(), "isWIFIEnabled");   
  49.     }   
  50.     return enable;  
  51. } 

当LocationManager在大于最短时间且检测到最小位置变化时,就会通知给监听器,然后我们就可以通过返回的经纬度信息去google服务器查找对应的地址,然后停止LocationManger的工作,解除LBSThread中的Looper,让LBSThread结束,最后通知主线程可以继续,整个流程结束。

  1. private class MyLocationListner implements LocationListener{    
  2.   
  3.     @Override  
  4.     public void onLocationChanged(Location location) {    
  5.         // 当LocationManager检测到最小位置变化时,就会回调到这里  
  6.         Log.i(Thread.currentThread().getName(), "Got New Location of provider:"+location.getProvider());  
  7.         unRegisterLocationListener();//停止LocationManager的工作  
  8.         try {  
  9.             synchronized (mLBSThread) {   
  10.                 parseLatLon(location.getLatitude()+"", location.getLongitude()+"");//解析地理位置  
  11.                 mLooper.quit();//解除LBSThread的Looper,LBSThread结束  
  12.                 mLBSThread.notify();//通知主线程继续  
  13.             }  
  14.         }  
  15.         catch (Exception e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.     }    
  19.  
  20.     //后3个方法此处不做处理 
  21.     @Override  
  22.     public void onStatusChanged(String provider, int status, Bundle extras) {}    
  23.  
  24.     @Override  
  25.     public void onProviderEnabled(String provider) {}    
  26.  
  27.     @Override  
  28.     public void onProviderDisabled(String provider) {}  
  29.   
  30. };  
  31.   
  32. /**  
  33.  * 使用经纬度从goole服务器获取对应地址   
  34.  * @param 经纬度  
  35.  */  
  36. private void parseLatLon(String lat, String lon) throws Exception {  
  37.     Log.e(Thread.currentThread().getName(),  "---parseLatLon---");  
  38.     Log.e(Thread.currentThread().getName(),  "---"+lat+"---");  
  39.     try {  
  40.         HttpClient httpClient = new DefaultHttpClient();  
  41.         HttpGet get = new HttpGet("http://ditu.google.cn/maps/geo?output=json&q="+lat+","+lon);  
  42.         HttpResponse response = httpClient.execute(get);  
  43.         String resultString = EntityUtils.toString(response.getEntity());  
  44.           
  45.         JSONObject jsonresult = new JSONObject(resultString);  
  46.         if(jsonresult.optJSONArray("Placemark") != null) {  
  47.             mLocation = new LocationData();  
  48.             mLocation.lat = lat;  
  49.             mLocation.lon = lon;  
  50.             mLocation.address = jsonresult.optJSONArray("Placemark").optJSONObject(0).optString("address");  
  51.         }  
  52.     }  
  53.     catch (Exception e) {  
  54.         e.printStackTrace();  
  55.     }  
  56. }  
  57.   
  58. /**  
  59.  * 注销监听器   
  60.  */  
  61. private void unRegisterLocationListener () {  
  62.     if(mGPSListener!=null){    
  63.         mLocationManager.removeUpdates(mGPSListener);    
  64.         mGPSListener=null;    
  65.     }   
  66.     if(mNetworkListner!=null){    
  67.         mLocationManager.removeUpdates(mNetworkListner);    
  68.         mNetworkListner=null;    
  69.     }   
  70. } 

 

接下来可以在界面上安放个button:

  1. locationBtn.setOnClickListener(new OnClickListener() {  
  2.               
  3.     @Override  
  4.     public void onClick(View v) {  
  5.         //return mode  
  6.         LBSTool lbs = new LBSTool(LBStestActivity.this);  
  7.         LocationData location = lbs.getLocation(120000);  
  8.         if (location != null) {  
  9.             Log.i("---lat---",location.lat);  
  10.             Log.i("---lon---",location.lon);  
  11.             Log.i("---address---",location.address);  
  12.             Toast.makeText(LBStestActivity.this, location.lat + " " + location.lon + " " + location.address, Toast.LENGTH_LONG).show();  
  13.  
  14.         }  
  15.           
  16.     }  
  17. }); 

最后别忘了加入权限:

  1. <uses-permission android:name="android.permission.INTERNET" />  
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
  4. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  5. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  

 

此外,LocationManager还有些高级的用法,比如设置一些关键参数,以及获取最后一次定位信息等等:

  1. Criteria criteria = new Criteria(); 
  2.         criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度 
  3.         criteria.setAltitudeRequired(false); 
  4.         criteria.setBearingRequired(false); 
  5.         criteria.setCostAllowed(true); 
  6.         criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗 
  7.          
  8.         String bestprovider = locationManager.getBestProvider(criteria, true); // 获取GPS信息 
  9.         Location location = locationManager.getLastKnownLocation(bestprovider); // 通过GPS获取位置 
  10.         Log.e("--bestprovider--", bestprovider); 
  11.         Log.e("--bestprovider--", location.getLatitude()+"");    

 

Android 添加LBS辅助定位 Android 添加LBS辅助定位,做一个小小的笔记,仅供大家参考和补充! 阅读详情

相关推荐

Welch 方法详解:一种经典而实用的功率谱密度估计方法

在信号处理领域,谱分析是用于分析信号频率内容的强大工具。Welch方法是现代谱分析中一种广泛使用的功率谱密度估计技术,由Peter D. Welch在1967年提出。它通过对信号进行分段、加窗和平均化处理,提供了一种平滑且稳定的频谱估计方法。Welch方法通过将信号分成多个重叠的段,每段应用窗函数,然后计算每段的周期图,最后对所有周期图进行平均化,得到平滑的功率谱密度估计。welch_psd函数接收信号x、采样频率fs、每段的样本数N、重叠样本数overlap和窗函数类型window。

DuHz的博客 7035

Android那些事儿之LBS定位

最近为了做LBS功能模块,到网上搜了一些资料,大多数介绍都是使用繁琐的基站定位,要自己去读取什么CellId,LocationAreaCode, MobileCountryCode,MobileNetworkCode等参数,而且多数是针对GSM/UMTS。而自己使用的CDMA,跟上面的参数叫法不一样,还得自己一个一个去对应。虽然最后算是解决了,但是难道就没有更好的办法吗。 ...

weixin_34404393的博客 262

台达PLC使用RS485Modbus指令通信

台达PLC,RS485,Modbus RTU,从站梯形图,0X01,0X02,0X05,CRC校验

lilililimu的博客 1万+

Android 通过基站进行定位

这是百度百科对基站定位的定义:基站定位一般应用于手机用户,手机基站定位服务又叫做移动位置服务(LBS——Location Based Service),它是通过电信移动运营商的网络(如GSM网)获取移动终端用户的位置信息(经纬度坐标),在电子地图平台的支持下,为用户提供相应服务的一种增值业务,例如目前中国移动动感地带提供的动感位置查询服务等。我的理解就是如果你的手机插了手机卡,我就可以实时知道你的位

ShoppingChen的博客 1万+

deepseek本地部署及应用部署指南

如果你找到的日志是[send] via NET/IB/0,则表示网络通信是通过IB网络的,但是没有开启GDRDMA技术,则会有大致5%的性能损耗(网传,未实测)。新增的环境变量配置,主要用于启用IB网络通信,而非使用以太网进行通信,详细的每一个参数的具体含义,可以在英伟达NCCL的官方网站上找到说明。下一步,我会对已经完成部署的模型进行压测,来探索系统的性能极限在哪里,以及如何在生产环境中何如进行进一步的性能优化,期待你的关注。

weixin_39797121的博客 2623

《探秘 BME680温度湿度气压气体传感器模块:环境感知的卓越之选》:此文为AI自动生成

BME680 是一款由博世公司推出的集成环境传感器模块,在环境监测和物联网等领域中发挥着重要作用。它能够同时测量温度、湿度、气压和气体浓度等多个环境参数,为各种应用提供准确可靠的环境数据。该模块采用小巧的封装形式,便于集成到各种设备中,无论是智能家居、可穿戴设备还是工业监测系统,都能轻松适配。例如,在智能家居系统中,BME680 模块可以监测室内环境参数,如温度、湿度、气压和空气质量等。通过与智能家居控制器或智能手机应用程序的连接,用户可以实时了解室内环境状况,并根据需要进行调整。

zheng_ruiguo的专栏 1865

Android中LocationManager的简单使用,获取当前位置

Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置;注册/注销来自某个 LocationProvider的周期性的位置更新;以及注册/注销接近某个坐标时对一个已定义Intent的触发等。今天我们就来看看Android 中LocatinManager的简单使用,以获取当前所在的位置为例。首先,我们需要获取LocationManager的一个实例,这里需要注意的是他的实例只能通过下面这种方式来获取,直接实例化LocationManager是不被允许的

魔戒 1005

Android中LocationManager学习笔记(1)

LocationManager   该类可以提供给上层位置服务,我们可以通过它获得地理位置等信息。获得LocationManager对象的方法如下:   LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);   要使用位置服务需要添加下面的权限:

doctorq 2892

假新闻检测论文分享(25)L-DefenseExplainable Fake News Detection With Large Language Model

现有的假新闻检测工作主要集中在通过深度网络结合多种信息来学习假新闻的潜在特征,如可信度、立场、传播模式、额外知识、域外数据等。尽管他们在探测上取得了成功,但受限于他们的黑箱性质,他们无法提供任何对公众至关重要的理由。为解决这一问题,一些研究致力于可解释假新闻检测(EFND),旨在同时生成准确性预测和解释。许多工作通过注意力机制在相关报道中注意突出特别的单词、短语或句子来提供可解释性。然而,这些工作只发现了对最终预测有高贡献的区域,缺乏直观和可信的解释。

weixin_41964296的博客 730

51单片机入门指南-基于STC89C52(持续更新)

一、环境介绍 编程IDE: keil5 单片机型号: STC89C51/52 开发板: 普中科技的开发板 完整PDF资源下载地址:https://download.youkuaiyun.com/download/xiaolong1126626497/19785856 二、51单片机开发手册介绍 2.1 前言 51单片机是对所有兼容Intel 8031指令系统的单片机的统称。 该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最.

8796

Mars Android视频学习笔记——03_03/04_用户定位

地图的使用,一般包括两方面的基本知识:一是定位;二是显示地图和在地图上显示相应的图层,包括定位到的位置。Mars老师在这两节中主要讲解了定位方面的;至于在地图上显示其它图层可参照转载的另一篇文章:http://blog.youkuaiyun.com/sam_zhang1984/archive/2011/04/26/6364186.aspxAndroid中的定位,主要涉及到两个重要的API:Location Manager和Location Providers。Location Manager是用于管理Android的用

2950

STM32+FreeRTOS环境下LwIP协议栈移植详解

本文详细介绍了在STM32F407ZGT6平台上移植轻量级TCP/IP协议栈LwIP的过程。使用FreeRTOS操作系统和LAN8720A以太网PHY芯片,通过STM32CubeMX生成基础工程配置。重点包括LwIP源码的获取与工程集成、关键配置文件的编写(如lwipopts.h)、操作系统适配层sys_arch.c的实现,以及以太网接口驱动ethernetif.c的移植。文章特别强调内存管理、中断优先级、硬件校验和等关键配置项的注意事项,为基于STM32和LwIP的嵌入式网络开发提供了实用参考。

电脑管家 751

【Android】18.1 利用安卓内置的定位服务实现位置跟踪

分类:C#、Android、VS2015; 创建日期:2016-03-04 一、安卓内置的定位服务简介 通常将各种不同的定位技术称为位置服务或定位服务。这种服务是通过电信运营商的无线电通信网络(如GSM网、CSMA网等)或外部定位方式(如GPS)来实现的。 Android提供了对移动数据(cell tower,也叫蜂窝发射塔)、无线网络(Wi-fi)、全球定位系统(GPS)等多种定位技术的访问。 ...

weixin_33694172的博客 915

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android 虚拟经纬度_03. Android原生获取经纬度

前言最近项目中需要获取经纬度,没有严格要求精准度,所以不想集成第三方的。用Android原生的就可以满足需求,应该是个很简单的需求,但是过程还是花费了好长时间。添加权限全部代码(注释很详细)public class MainActivity extends AppCompatActivity {private TextView mLocation;private LocationManager l...

weixin_34194829的博客 255

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android位置模拟源码,android 模拟定位app 源码

【实例简介】需要在android手机的 开发者模式中 开启 【允许模拟位置】即可,开启允许模拟位置的方法详见:https://jingyan.baidu.com/article/870c6fc306f1f4b03ee4be7f.html【实例截图】【核心代码】package com.xd.mockposition;import android.app.Activity;import android...

weixin_31062007的博客 5702

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ANDROID_MARS学习笔记_S03_003_LocationManager、LocationListener

一、简介 二、代码1.xml (1)AndroidManifest.xml 增加 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_CO...

weixin_30765475的博客 140

android之location03

private class ButtonListener implements OnClickListener { @Override public void onClick(View v) { //得到LocationManager对象 LocationManager locationMa...

weixin_30617737的博客 75

Android Framework 视频教程(一)

极力推荐文章:欢迎收藏Android 干货分享和您一起终身学习,这里是程序员Android回复关键字“framework”,即可获取完整 Framework 视频教程。...

程序员Android 906

android获取gps坐标

转自:http://blog.youkuaiyun.com/beihai1212/archive/2011/03/31/6291344.aspx Android的强大表现在各个方面,在这里介绍一下其中的一个自动获取所在地理位置坐标的功能。Android中通过LocationManager来获取地理位置等相关信息的。  首先,需要获取LocationManager实例。  //获得当前位置的坐标  Lo

521

Android之用户定位(一)

    User Location主要用于获取用户的位置和追踪用户的移动     关键API:     Location Manager用于管理Android的用户定位服务;Location Provider提供多种定位方式供开发者使用     定位方式的分类:     1. 使用GPS卫星进行定位,需要在AndroidManifest当中声名权限android.permissi...

166

android定位和地图开发实例

在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便。              首先介绍一下地图包中的主要类:              MapController :  主要控制地图移动,伸缩,以某个GPS坐标为中心,控制MapView中的view组件,管理Overlay,提供View的基本功能。使用多种地图模式(地图模式(某些城市可实时对交

u011115507的专栏 913
上一篇: android DialogFragment简单应用
下一篇: [转]Android 程序框架设计
geekcoder
博客等级 码龄14年 78粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值