基于Android的影院APP设计与实现外文翻译资料

 2022-10-26 10:18:53

英语原文共 23 页,剩余内容已隐藏,支付完成后下载完整资料


Reto meier. Professional Android 4 Application Development. Wrox ,2012

513-535

13章 地图、地理编码和基于位置的服务

章节的内容

  • 理解前向和反向地理编码
  • 使用Map View和Map Activity创建交互式地图
  • 创建并向地图添加覆盖
  • 使用基于位置的服务找到自己的位置
  • 使用近距离提示

移动性是定义手机的一个特性,,所以毫不奇怪,Android中一些最吸引人的API是用来找到某个物理位置、确定该位置的所属环境以及将该位置在地图上表现出来的API。

通过使用Google API包中包含外部Maps库,可以将Google地图作为用户界面元素,创建

基于地图的Activity。你有充分的权利访问该地图,它使您可以控制显示设置,改变缩放级别,和移动到不同的位置。通过使用覆盖技术,你可以给地添加注释图并处理用户输入。

本章还将介绍包括基于位置的服务(LBS),它们可以用来查找设备当前位置。他们包括技术如GPS和Google的基于蜂窝(cell-based)或基于Wi-Fi 的位置感知技术。可以通过名称来显示地指定使用哪种定位技术,或者可以提供由精度,花费和其他要求构成的标准集,让Android选择最合适的技术。

地图和基于位置的服务使用纬度和经度来精确地定位地理位置,但是用户可能更喜欢按照认街道地址来考虑它们。Maps库提供了一个地理编码器(Geocoder),可以用来在

纬度/经度和现实世界地址进行相互的转换。

地图、地理编码和基于位置的服务合起来提供了一个强大的工具箱,让你的移动应用程序可以利用手机固有的移动性。

13.1 使用基于位置的服务

基于位置的服务(LBS)}是个宽泛的概念,描述了用来查找设备当前位置的不同技术。主要的两个LBS元素是:

位置管理器 提供基于位置的服务的挂钩(hook)。

位置提供器 每一个位置提供器都表示不同的位置查找技术,这些技术用来确定少备的当前位置。

使用位置管理器,可以:

获得当前的位置。

追踪移动。

设置近距离提醒,在检测到进入或者离开一个指定的区域时发出提醒。

找到可用的位置提供器。

监视GPS接收器的状态。

通过位置管理器可以访问基于位置的服务。要访问位置管理器,需要使getSystemService方法清求LOCATION_SERVICE的一个实例,如程序清单13-1所示。

程序清单13-1 访问位置管理器

String serviceString = Context.LOCATION_SERVICE;

LocationManager locationManager;

locationManager = (LocationManager)getSystemService(serviceString);

在使用基于位置的服务之前,需要在manifest文件中添加一个或更多个uses-permission标签。

下面的代码段演示了如何在应用程序的manifest文件中请求fine权限和coarse权限;

lt;uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”/gt;

lt;uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION”/gt;

接下来的小节中将更详细地介绍fine和coarse权限。一般来说,它们控制着应用程序在确定用户位置时可以使用的精度等级,fine代表高精度,coarse的精度则要差一些。

注意,被授予fine权限的应用程序将自动获得coarse权限。

13.2在模拟器中使用基于位置的服务

基于位置的服务依赖于用于查找当前位置的设备硬件。当使用模拟器进行开发或者测试的时候,硬件会被虚拟化,所以你很可能一直位于相同的位置。

为了弥补它的不足,Android提供了挂钩,它可以通过模拟位置提供器来测试基于位置的应用程序。本节将学习如何对所支持的GPI提供器的位置进行模拟。

如果你正打算开发基于位置的应用程序,并使用了Android模拟器,那么通过本节的介绍将了解到如何创建一个环境来模拟真实的硬件和位置改变。在本章其余的部分中,我们将会假设你已经通过使用这个部分中的例子对模拟器中的LocationManager.GPS_PROVIDER的位置进行了更新,或者你使用了真实设备。

13.2.1 更新模拟器位置提供器中的位置

使用Eclipse的DDMS视图中可用的Location Controls(如图13-1所示),可以直接将位置的改变添加到模拟器的GPS位置提供器中。

图13-1

图13-1显示了Manual和KML选项卡,使用Manual选项卡,可以指定特定的经纬度。KML和GPX选项卡则分别可以加载KML(Keyhole Markup Language.Keyhole标记语言)和GPX(GPS Exchange Format.GPS交换格式)文件。一旦加载了这些文件之后,就可以跳到指定的路标(waypoint位置)或者按顺序回放每一个位置。

大部分GPS系统都是使用GPX来记录跟踪文件的,而KML则广泛应用于在线定义地理信息.可以手工输入自己的KML文件,或者使用GoogIe Earth自动生成该文件,以找出两个位置之间的路径。

使用DDMS Location控件生成的所有位置变化都将被应用到GPS接收器,所以GPS接收器必须已经被启用并且是活动的.

13.2.2配置模拟器来测试基于位置的服务

如果没有任何应用程序请求位置更新,getLastKnownLocation返回的GPS值是不会改变的。因此,第一次启动模拟器时,调用gctLastKnownLocation返回的结果很可能是null,因为此前还没有应用程序请求接收位置更新。

而且,只有当至少有一个应用程序请求从GPS接收位置更新时,用来更新前一节描述的模拟位置的技术才是有效的.

程序清单13-2显示了如何在模拟器中启用连续位置更新,从而能够使用DDMS更新模拟器中的模拟位置。

程序清单13-2 在模拟器中启用GPS提供器

locationManager.requestLocationUpdates(

LocationManager.GPS_PROVIDER, 0, 0,

new LocationListener() {

public void onLocationChanged(Location location) {}

public void onProviderDisabled(String provider) {}

public void onProviderEnabled(String provider) {}

public void onStatusChanged(String provider, int status,

Bundle extras) {}

}

);

注意,这段代码实际上将GPS位置提供器锁定到了“开启”状态,这会使实际设备I:的电池很快消耗,所以不是一种好做法。只有在模拟器上进行测试时才应该使用这种方法。

13.3选择一个位置提供器

根据不同的设备,可以使用多种技术来确定当前的位置。每一种技术(通过位置提供器的方式使用)在能耗、精确度以及确定海拔、速度和朝向信息的能力等方面部可能有所不同。

13.3.1查找位置提供器

LocationManager类包含了一些静态字符串常量,这些常量将返回以下三种位置提供器的名称:

LocationManager.GPS_PROVIDER

LocationManager.NETWORK _PROVIDER

LocationManager.PASSIVE_ PROVIDER

GPS提供器和被动提供器都需要fine权限,而网络(Cell ID/wi-fi)提供器则只需要coarse权限。

要获得所有可用提供器的名称列表(根据设备上可用的硬件和授予应用程序的权限).可以调用getProviders,并使用一个布尔值来说明是希望返回所有的提供器,还足只返回已经启用的提供器。

boolean enabledOnly = true;

Listlt;Stringgt; providers = locationManager.getProviders(enabledOnly);

13.3.2通过指定条件查找位置提供器

在大部分情况下,都不太可能去显式地选择要使用的位置提供器.更常见的情况是指定你的要求,让Android去确定要使用的最优的技术。

使用Criteria类来说明对提供器的要求,包括精度(高或者低)、能耗(低、中或高)、花费以及返回海拔、速度和朝向的能力。

程序清单13-3创建了一个条件,它要求coarse精度,低能耗并且不需要海拔、朝向或者速度的信息.而且允许位置提供器收取一定的费用.

程序清单13-3 指定位置提供器

criteria criteria = new Criteria();

criteria.setAccuracy(Criteria.ACCURACY_COARSE);

criteria.setPowerRequirement(Criteria.POWER_LOW);

criteria.setAltitudeRequired(false);

criteria.setBearingRequired(false);

criteria.setSpeedRequired(false);

criteria.setCostAllowed(true);

传入setAccuracy的coarse/fine值代表一个主管的精确,其中fine代表GPS或更好的技术,而coarse则代表精度低很多的任何技术。

Android 3.0为Criteria类引入了几个额外的属性,以更好地控制所需的精度程度。下面对程序清单13-3的扩展指定了需要在水平(纬度/经度)方向具有高精度,在垂直(海拔)方向具有中等精度,对返回的方向和速度的精度要求被设为低精度:

criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);

criteria.setVerticalAccuracy(Criteria.ACCURACY_MEDIUM);

criteria.setBearingAccuracy(Criteria.ACCURACY_LOW);

criteria.setSpeedAccuracy(Criteria.ACCURACY_LOW);

水平和垂直方向的高精度是指结果的准确程度在100m以内.低精度的提供器的准确程度大于500m。中等精度的提供器能够提供的精度在100m~500m之间。

为方向指定精度需求时,合法的参数只有ACCURACY _LOW和ACCURACY_ HIGHT。

在定义了要求的条件之后,可以使用getBestProvider来返同最佳匹配的位置提供器,或者使用getProviders来返回所有可能的匹配。下面的代码段展示了使用getBestProvider来返回符合条件的最佳提供器,其中布尔值可以把结果限制在当前已经启用的提供器的范围内。

String bestProvider = locationManager.getBestProvider(criteria, true);

如果有多个位置提供器匹配了你的条件,那么将会返回精度最高的那一个.如果没有任何一个位置提供器满足要求,那么将会按照下面的顺序放宽标准,直到找到一个提供器为止:

.能耗

.返回位置的精度

.方向、速度和海拔的精度

.返回方向、速度和海拔的能力

对允许设备收费的条件永远都不会放宽.如果找不到匹配的提供器,那么就会返回null.

要获得所有符合条件的提供器的名称,可以使用getProviders.它接受一个Critcria对象作为参数.并返回与该条件匹配的所有位置提供器的一个字符串列表。与调用getBestProvidcr相同,如果找不到匹配的提供器,它将会返同null或空列表.

Listlt;Stringgt;

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[153911],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。