更踪设备的地理位置(LocationManager)

2024-04-28 11:08

本文主要是介绍更踪设备的地理位置(LocationManager),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

地理位置与LocationManager

Android系统中的地理位置数据是由LocationManager系统服务提供的。该系统服务向所有需要地理数据的应用提供数据更新。更新数据的传送通常采用两种方式。

其中,使用LocationListener接口可能是最直接的一种方式。通过onLocationChanged(Location)方法,该接口提供的信息有:地理位置数据更新、状态更新以及定位服务提供者启动状态的通知消息。

如只需将地理位置数据发送给应用中的单个组件,使用LocationListener接口会很方便。提供LocationListener接口实现给LocationManager的requestLocationUpdates(…)或requestSingleUpdate(…)方法即可。

然而,若不管用户界面是否存在(如应用在后台运行),应用都需要持续定位用户地理位置。当然,我们也可以使用stickyService,但stickyService本身复杂难用,而且这种方式也不够轻量级。因此,我们使用自Android 2.3开始引入的PendingIntent。

使用PendingIntent获取地理位置信息更新,我们实际是要求LocationManager在将来某个时点帮忙发送某种类型的Intent。这样,即使应用组件。甚至是整个应用进程都销毁了,LocationManager仍会一直发送Intent,直到要求停止并按需启动新组件响应它们。利用这种优势,即使持续进行设备定位,也可以避免应用消耗过多的资源。

为管理与LocationManager的通讯,创建一个名为RunManager的单例类:

package com.huangfei.runtracker;import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;public class RunManager {public static final String TAG = "RunManager";public static final String ACTION_LOCATION = "com.huangfei.runtracker.ACTION_LOCATION";private static RunManager sRunManager;private Context mAppContext;private LocationManager mLocationManager;private RunManager(Context appContext) {mAppContext = appContext;mLocationManager = (LocationManager) mAppContext.getSystemService(Context.LOCATION_SERVICE);}public static RunManager get(Context context) {if (sRunManager == null) {sRunManager = new RunManager(context.getApplicationContext());}return sRunManager;}private PendingIntent getLocationPeindingIntent(boolean shouldcCreate) {Intent broadcast = new Intent(ACTION_LOCATION);int flags = shouldcCreate ? 0 : PendingIntent.FLAG_NO_CREATE;//flags参数告诉 PendingIntent.getBroadcast方法是否应该在系统中创建新的PendingIntentreturn PendingIntent.getBroadcast(mAppContext, 0, broadcast, flags);}/*** 启动地理位置更新*/public void startLocationupdates() {// 要求LocationManager通过GPS定位装置提供实时的定位数据更新String provider = LocationManager.GPS_PROVIDER;/*** 利用LocationManager的最近一次地理位置(使用于各种定位方式,如GPS、WIFE网络、手机基站等),* 来消除免用户开启定位时的长时间等待。* * 也可向LocationManager请求来自不同定位服务提供者的最近一次地理位置信息,或使用getAllProviders()方法* 获知协同工作的定位服务提供者。如遍历查看所有最近一次地理位置信息,应查看其准确性,并确定是否为比较新的时间戳。如较为久远,* 可不采用这些数据信息。*/Location lastKnownLocation = mLocationManager.getLastKnownLocation(provider);if(lastKnownLocation != null){lastKnownLocation.setTime(System.currentTimeMillis());broadcastLocation(lastKnownLocation);}PendingIntent pi = getLocationPeindingIntent(true);/*** requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)* 四个参数中,最小等待时间(以毫秒为单位)以及最短移动距离(以米为单位)可用与决定发送下一次定位数据更新要移动的距离和要等待的时间*/mLocationManager.requestLocationUpdates(provider, 0, 0, pi);}/*** 发送最近一次地理位置信息的广播*/private void broadcastLocation(Location lastKnownLocation) {Intent intent = new Intent(ACTION_LOCATION);intent.putExtra(LocationManager.KEY_LOCATION_CHANGED, lastKnownLocation);mAppContext.sendBroadcast(intent);}/*** 停止地理位置更新* */public void stopLocationUpdates() {PendingIntent pi = getLocationPeindingIntent(false);if (pi != null) {mLocationManager.removeUpdates(pi);pi.cancel();}}/*** 判断地理位置是否更新*/public boolean isTrackRun() {return getLocationPeindingIntent(false) != null;}
}

接收定位数据更新broadcast

package com.huangfei.runtracker;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.util.Log;public class LocationReceiver extends BroadcastReceiver {public static final String TAG = "LocationReceiver";@Overridepublic void onReceive(Context context, Intent intent) {/*** LocationManager打包了附加额外信息的intent* LocationManager.KEY_LOCATION_CHANGED键值可指定一个表示最新更新的Location实例*/Location location = (Location) intent.getParcelableExtra(LocationManager.KEY_LOCATION_CHANGED);if (location != null) {onLocationReceived(context, location);return;}if (intent.hasExtra(LocationManager.KEY_PROVIDER_ENABLED)) {boolean enabled = intent.getBooleanExtra(LocationManager.KEY_PROVIDER_ENABLED, false);onProviderEnabledChanged(enabled);}}protected void onProviderEnabledChanged(boolean enabled) {Log.d(TAG, "Provider " + (enabled ? "enabled" : "disabled"));}protected void onLocationReceived(Context context, Location location) {Log.d(TAG, this + " Got location from " + location.getProvider() + ": "+ location.getLatitude() + ", " + location.getLongitude());}
}
<!-- 添加定位的权限以及GPS硬件uses-feature节点的添加 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-feature
        android:name="android.hardware.location.gps"android:required="true" /><receiver
            android:name="com.huangfei.runtracker.LocationReceiver"android:exported="false" ><intent-filter><action android:name="com.huangfei.runtracker.ACTION_LOCATION" /></intent-filter></receiver>

使用定位数据刷新UI显示

package com.huangfei.runtracker;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;public class RunFragment extends Fragment {private BroadcastReceiver mLocationReceiver = new LocationReceiver(){protected void onLocationReceived(Context context, Location location) {mLastLocation = location;if(isVisible())updateUI();}protected void onProviderEnabledChanged(boolean enabled) {//GPS服务提供者启动或停止时,消息提示int toastText = enabled ? R.string.gps_enabled : R.string.gps_disabled;Toast.makeText(getActivity(), toastText, Toast.LENGTH_LONG).show();}};private RunManager mRunManager;private Run mRun;private Location mLastLocation;private Button mStartButton, mStopButton;private TextView mStartedTextView, mLatitudeTextView, mLongitudeTextView,mAltitudeTextView, mDurationTextView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setRetainInstance(true);mRunManager = RunManager.get(getActivity());}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_run, container, false);mStartedTextView = (TextView) view.findViewById(R.id.run_startedTextView);mLatitudeTextView = (TextView) view.findViewById(R.id.run_latitudeTextView);mLongitudeTextView = (TextView) view.findViewById(R.id.run_longitudeTextView);mAltitudeTextView = (TextView) view.findViewById(R.id.run_altitudeTextView);mDurationTextView = (TextView) view.findViewById(R.id.run_durationTextView);mStartButton = (Button) view.findViewById(R.id.run_startButton);mStartButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mRunManager.startLocationupdates();mRun = new Run();updateUI();}});mStopButton = (Button) view.findViewById(R.id.run_stopButton);mStopButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mRunManager.stopLocationUpdates();updateUI();}});return view;}@Overridepublic void onStart() {super.onStart();getActivity().registerReceiver(mLocationReceiver, new IntentFilter(RunManager.ACTION_LOCATION));}@Overridepublic void onStop() {super.onStop();getActivity().unregisterReceiver(mLocationReceiver);}private void updateUI(){boolean started = mRunManager.isTrackRun();if(mRun != null){mStartedTextView.setText(mRun.getSartDate().toString());}int durationSenconds = 0;if(mRun != null && mLastLocation != null){durationSenconds = mRun.getDurationSeconds(mLastLocation.getTime());mLatitudeTextView.setText(Double.toString(mLastLocation.getLatitude()));mLongitudeTextView.setText(Double.toString(mLastLocation.getLongitude()));mAltitudeTextView.setText(Double.toString(mLastLocation.getAltitude()));}mDurationTextView.setText(Run.formatDuration(durationSenconds));mStartButton.setEnabled(!started);mStopButton.setEnabled(started);}
}

代码地址

这篇关于更踪设备的地理位置(LocationManager)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943101

相关文章

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

海鲜加工污水处理设备处理效果高

诸城市鑫淼环保小编带大家了解一下海鲜加工污水处理设备处理效果高   海鲜加工污水处理设备通常采用物理、化学和生物处理相结合的方法,对废水中的污染物进行高xiao去除。设备设计紧凑,占地面积小,操作简便,适用于不同规模的海鲜加工厂。   设备特点   高xiao性:采用先进的处理工艺和技术,确保废水处理效果稳定可靠。   占地面积小:设备设计紧凑,占地面积小,适合在有限的空间内安装。

集运系统需要与哪些硬件设备集成?

随着电商和跨境贸易的不断发展,集运服务越来越受到海外用户的青睐。集运系统作为一种高效的跨境物流管理工具,可以协调各个环节之间的物流流程,提高物流效率和管理水平,被越来越多的集运企业采用。而集运系统作为集运服务的重要组成部分,也需要配套相应的硬件设备才能更好地支持跨境集运业务。下面就来介绍一下集运系统需要哪些硬件设备支持呢? 1.PDA:是一种便携式电子设备,可以轻松地进行数据采集和处理,具有移

3.门锁_STM32_矩阵按键设备实现

概述 需求来源: 门锁肯定是要输入密码,这个门锁提供了两个输入密码的方式:一个是蓝牙输入,一个是按键输入。对于按键输入,采用矩阵按键来实现。矩阵按键是为了模拟触摸屏的按键输入,后续如果项目结束前还有时间就更新为触摸屏按键输入。 矩阵按键开发整体思路: 由于矩阵按键就是GPIO的控制,所以不进行芯片和设备的分层编写,控制写在同一个文件中,最终向应用层提供一个接口。 代码层级关系:

Anroid BLE蓝牙(手机分别作为中心设备和外围设备)

蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙。  BLE蓝牙模块主要应用领域     1、移动扩展设备     2、汽车电子设备     3、健康医疗用品:心跳带、血压计等     4、定位应用:室内定位、井下定位等     5、近距离数据采集:无线

RS在不同设备间同步文件

参考: 1. Resilio(BtSync)搭建 2. 使用Resilio Sync共享文件【附操作指南】 4. Linux 下挂载新硬盘方法 5. Partition 1 does not start on physical sector boundary. 6. Ubuntu 16.04添加开机启动脚本的方法 7. Ubuntu 16.04以普通用户身份开机启动 8. Ubunt

如何编写Linux PCI设备驱动器 之一

如何编写Linux PCI设备驱动器 之一 PCI寻址PCI驱动器使用的APIpci_register_driver()pci_driver结构pci_device_id结构 如何查找PCI设备存取PCI配置空间读配置空间APIs写配置空间APIswhere的常量值共用部分类型0类型1 PCI总线通过使用比ISA更高的时钟速率来实现更好的性能;它是时钟运行在 25 或 33 M