Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息



1.位置服务,英文翻译为Location-Based Services,简称LBS,又称为定位服务或基于位置的服务,融合了GPS定位、移动通信、导航等多种技术,提供与空间位置相关的综合应用服务,基于位置的服务发展很迅速,涉及商务、医疗、工作和生活的各个方面,为用户提供定位、追踪和敏感区域警告等一系列服务。比如谷歌地图,百度地图,都需要通过位置服务。

2.Android平台下支持提供位置服务的API,在开发过程中主要用到LocationManager和LocationProviders对象:

(1).LocationManager可以用来获取当前的位置,追踪设备的移动路线,或设定敏感区域,在进入或离开敏感区域时设备会发出特定警报 。

(2).LocationProviders则是提供定位功能的组件集合,集合中的每种组件以不同的技术提供设备的当前位置,区别在于定位的精度、速度和成本等方面 。

3.接下来将讲述一个如何实现获取位置的经纬度,并且如果位置改变,如何通过位置的改变,经纬度也发生变化的例子,这里以LocationManager对象为例:

(1).首先,第一步,获取LocationManager对象,可以通过调用android.app.Activity.getSystemService()函数获取,代码如下:

String serviceString = Context.LOCATION_SERVICE;// 获取的是位置服务
LocationManager locationManager = (LocationManager) getSystemService(serviceString);// 调用getSystemService()方法来获取LocationManager对象

其中的LOCATION_SERVICE是Android支持的系统级服务,控制位置等设备的更新。

(2).在获取到LocationManager对象后,还需要指定LocationManager的定位方法 ,然后才能够调用LocationManager.getLastKnowLocation()方法获取当前位置 ,目前LocationManager主要有两种定位方法

GPS定位:可以提供更加精确的位置信息,但定位速度和质量受到卫星数量和环境情况的影响,需要android.permissions.ACCESS_FINE_LOCATION用户权限。

网络定位:提供的位置信息精度差,但速度较GPS定位要迅速 ,利用基站或WiFi访问的提供近似的位置信息,需要具有如下权限:android.permission.ACCESS_COARSE_LOCATION 或 android.permission.ACCESS_FINE_LOCATION。

注:(使用GPS定位和网络定位的LocationManager类的静态常量不一样,GPS定位的LocationManager类的静态常量为:GPS_PROVIDER,网络定位的LocationManager类的静态常量为:NETWORK_PROVIDER,这两个静态常量在获取当前位置时要用到。)

下面以使用GPS定位为例,获取位置信息代码如下:

String provider = LocationManager.GPS_PROVIDER;// 指定LocationManager的定位方法
Location location = locationManager.getLastKnownLocation(provider);// 调用getLastKnownLocation()方法获取当前的位置信息

(3).通过调用Location中的getLatitude()和getLonggitude()方法可以分别获取位置信息中的纬度和经度,代码如下:

double lat = location.getLatitude();//获取纬度
double lng = location.getLongitude();//获取经度

(4).在很多提供定位服务的应用程序中,不仅需要获取当前的位置信息,还需要监视位置的变化,在位置改变时调用特定的处理方法 ,其中LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),可以根据位置的距离变化和时间间隔设定,产生位置改变事件的条件,这样可以避免因微小的距离变化而产生大量的位置改变事件 ,LocationManager中设定监听位置变化的代码如下:

locationManager.requestLocationUpdates(provider, 2000, 10,locationListener);// 产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒,设定监听位置变化

接下来介绍上面这行代码的各个参数,第一个参数是我们之前指定LocationManager的定位方法,GPS定位或网络定位,第二个参数指的是产生位置改变事件的时间间隔,单位为微秒,第三个参数指的是距离条件,单位为米,第四个参数是回调函数,用于处理位置改变事件,即设置LocationListener监听器。总的来说,那一行代码将产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒。

(5).实现locationListener的代码如下:

private final LocationListener locationListener = new LocationListener() {

		@Override
		public void onLocationChanged(Location location) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onProviderDisabled(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onProviderEnabled(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
			// TODO Auto-generated method stub

		}

	};

接下来对上面实现LocationListener的代码下的四个方法进行简单介绍:

onLocationChanged()这个方法在位置改变时被调用,onProviderDisabled()这个方法在用户禁用具有定位功能的硬件时被调用,onProviderEnabled()这个方法在用户启用具有定位功能的硬件时被调用,onStatusChanged()这个方法在定位功能硬件状态改变时被调用,例如,从不可获取位置信息状态到可以获取位置信息的状态,反之亦然 。

(6).为了使GPS定位功能生效,还需要在AndroidManifest.xml文件中加入用户许可,即加入下面这行代码,加入用户权限:

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

4.接下来附上完整代码,首先新建一个Android项目,项目名称为LocationManagerTest,新建完成后:

(1).打开activity_main.xml文件,进行布局,布局代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/location"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

(2).接下来打开MainActivity.java文件,通过LocationManager对象来获取当前位置,代码如下:

package xg.locationmanagertest;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		String serviceString = Context.LOCATION_SERVICE;// 获取的是位置服务
		LocationManager locationManager = (LocationManager) getSystemService(serviceString);// 调用getSystemService()方法来获取LocationManager
		String provider = LocationManager.GPS_PROVIDER;// 指定LocationManager的定位方法
		Location location = locationManager.getLastKnownLocation(provider);// 调用getLastKnownLocation()方法获取当前的位置信息
		getLocationInfo(location);// 获得经度和纬度的方法
		locationManager.requestLocationUpdates(provider, 2000, 10,
				locationListener);// 产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒,设定监听位置变化

	}

	private void getLocationInfo(Location location) {
		String latLongInfo;
		TextView locationText = (TextView) findViewById(R.id.location);//获取到布局文件里的TextView组件

		if (location != null) {
			double lat = location.getLatitude();//获取纬度
			double lng = location.getLongitude();//获取经度
			latLongInfo = "纬度为: " + lat + "\n经度为: " + lng;
		} else {
			latLongInfo = "没有发现到当前位置";
		}
		locationText.setText("你当前的位置是:\n" + latLongInfo);//为TextView文本视图赋值
	}

	/*
	 * LocationListener监听器
	 * 当位置发生改变时,会将最新的位置信息显示在界面上
	 */
	private final LocationListener locationListener = new LocationListener() {

		@Override
		public void onLocationChanged(Location location) {
			// TODO Auto-generated method stub
			getLocationInfo(location);
		}

		@Override
		public void onProviderDisabled(String arg0) {
			// TODO Auto-generated method stub
			getLocationInfo(null);
		}

		@Override
		public void onProviderEnabled(String arg0) {
			// TODO Auto-generated method stub
			getLocationInfo(null);
		}

		@Override
		public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
			// TODO Auto-generated method stub

		}

	};
}

(3).接下来再AndroidManifest.xml文件中加入用户权限,代码便完成了,AndroidManifest.xml文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xg.locationmanagertest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="xg.locationmanagertest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

这样即完成了代码,就可以显示当前位置信息,并能够监视设备的位置变化 。

(4).位置服务一般都需要使用设备上的硬件,最理想的调试方式是将程序上传到物理设备上运行,但在没有物理设备的情况下,也可以使用Android模拟器提供的虚拟方式模拟设备的位置变化,调试具有位置服务的应用程序,这个Android模拟器提供的虚拟方式设备在哪里呢?

在Window菜单栏下的Show View菜单下,选择子菜单other,弹出下图,选择打开下图红色箭头指向处即可打开来:

打开DDMS中的模拟器控制,开启Android模拟器后,在Location Controls中的Longitude和Latitude部分输入设备当前的经度和纬度,然后点击Send按钮,就将虚拟的位置信息发送到Android模拟器中,如下图所示 :

运行这个项目之后,点击上图的send按钮,发送经纬度到Android模拟器上,效果如下:

如果我们把经纬度改了,改成下图的数据,点击send按钮:

然后会发现该项目里面的经纬度变了,变成我们设备上输入的0和0了,如下图所示:

5.以上内容仅供大家爱学习参考,这个也是我通教材上的PPT里面学的,希望对大家有用,谢谢!

时间: 2024-10-14 03:48:44

Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息的相关文章

Android——使用Volley+fastJson在新线程中读取网络接口获取天气信息

一,关于Volley 其实最初对于网络数据的访问,我是没想到要用框架的,使用HttpURLConnection或者HttpGet or HttpPost都可以实现.但是why? why I have to use Volley?   Before Volley: class HttpURLConnection_post extends Thread{ @Override public void run() { //设置请求的路径 String strUrl="http://api.qingyun

17.(转) Android之四大基本组件介绍与生命周期

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. 典型的动作类型有:M AIN(activity的门户).V

Android 定位服务(Location-Based Services)

Android定位服务融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综合应用服务.近些年来,基于位置的服务发展更为迅速,涉及商务.医疗.工作和生活的各个方面,为用户提供定位.追踪和敏感区域警告等一系列服务. Android平台支持提供位置服务的API,在开发过程中主要使用LocationManager和LocationProviders对象. - LocationManager: 用来获取当前位置,追踪设备的移动路线,或设定敏感区域,在进入或离开敏感区域时设备会发出特定警报.

Android 定位服务(转载)

今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整.同时发现我对android的GPS服务了解并不深,所以今天特意阅读了有关GPS服务的一些资料,把相关知识点记录下来. 本人做了GPS相关的嵌入式软件已经几年了,所以说起要做个测试GPS定位模块的程序,第一反应就是串口读取GPS模块的数据,然后解析GPS的NMEA格式数据.NMEA是一种标准化数据格

android使用百度地图SDK获取定位信息

本文使用Android Studio开发. 获取定位信息相对简单,我们只需要如下几步: 第一步,注册百度账号,在百度地图开放平台新建应用.生成API_KEY.这些就不细说了,请前往这里:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/key 第二步,下载sdk,地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download

Android 位置服务

原文来自:http://developer.android.com/guide/topics/location/strategies.html 位置策略 注意: 本指南仅限android.location位置API.Google Play Services中的google位置API提供更强大更高级的框架,自动处理位置provider.用户移动和位置安全.它也依据电池消耗情况调整位置更新策略.在大多数情况下,使用Location Services API,你将获得更好的电池性能,更合适的精度. 更

Android位置服务开发

1. 使用LocationManager获取地理位置信息 代码如下: private TextView positiontext; private String provider; private LocationManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act

Android系统性能调优工具介绍

经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优工具介绍 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是: 测评:对系统进行大量有针对性的测试,以得到合适的测试数据. 分析系统瓶颈:分析测试数据,找到其中的hotspot(热点,即bottleneck). 性能优化:对hotspot相关的代码进行优化. 由上述步骤可知,性能优化的目标对象是hotspot.如果找到的hotspot并非真正的热点,则性能优化的结果必然是事倍

android之ListView,详细介绍实现步骤,举例,自定义listview适配器

android之ListView,详细介绍实现步骤,举例,自定义listview适配器 09. 四 / android基础 / 没有评论 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listView是比较重要的,因为很多时候都需要将数据库中的数据以列表显示, 具体使用步骤:大体 1,建立一个item.xml文件,此布局文件布局布局如何具体显示列表中的每一个条目 2,在要使用listview的界面中添加listview控件. 3,activit