摘要

本案例研究讨论了如何将地图和地理定位特性构建到 Android* 商务应用中,包括在 Google Maps* 上覆盖商店位置,以及在设备进入商店地理围栏邻近区域时借助地理围栏通知用户。

目录

  1. 摘要
  2. 概述
  3. 在 Google Maps 上显示商店位置
    1. Google Maps Android API v2
    2. 在应用清单中指定应用设置
    3. 添加地图 Fragment
  4. 发送地理围栏通知
    1. 注册和取消注册地理围栏
    2. 实施位置服务回调
    3. 实施意向服务
  5. 总结
  6. 参考文献
  7. 作者介绍

概述

在本案例研究中,我们将会把地图和地理定位功能集成到基于 Android 平板电脑的餐馆商务应用中(图 1)。 用户可以从主菜单项“位置和地理围栏”访问地理定位功能(图 2)。


                                                                                                图 1 餐馆应用主界面


                                                                                                 图 2 浮出控件菜单项

在 Google Maps 上显示商店位置

对于一款商务应用而言,显示商店在地图上的位置对用户非常直观和有用(图 3)。 Google Maps Android API 可提供一种简单的方式将 Google Maps 集成至 Android 应用。

Google Maps Android API v2 

是 Google Play 服务 APK 的一部分。 为了创建使用 Google Maps Android API v2 的 Android 应用,需要下载并配置 Google Play 服务 SDK,获取 API 密钥并在应用的 AndroidManifest.xml 文件中添加所需的设置来对开发环境进行设置。

首先,你需要按照以下网站上的说明来设置 Google Play 服务 SDK:http://developer.android.com/google/play-services/setup.html

然后,你需要从谷歌开发人员控制台(Google Developers Console)上对你的项目进行注册并获取一个 API 密钥:https://console.developers.google.com/project。 你需要在 AndroidManifest.xml 文件中添加 API 密钥。


                                                                                  图 3 餐馆应用在谷歌地图上显示商店的位置。

在应用清单中指定应用设置

为了使用 Google Maps Android API v2,需要将一些权限和特性指定为 <manifest> 元素的子项(代码示例 1)。 其中包括网络连接、外部存储和位置访问的一些必要权限。 此外,为了使用 Google Maps Android API,需要使用 OpenGL ES 版本 2 特性。

  
  
01<uses-permission android:name=”android.permission.INTERNET"/>
02<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
03<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
04<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
05<!-- The following two permissions are not required to use
06     Google Maps Android API v2, but are recommended. -->
07<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
08<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
09<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
10 
11  <uses-feature
12    android:glEsVersion="0x00020000"
13    android:required="true"/>

代码示例 1。 建议在使用 Google Maps Android API 的应用上指定的权限。 包括 “ACCESS_MOCK_LOCATION” 权限(仅当需要使用模拟位置对应用进行测试时使用

我们同样需要将在 <meta-data> 元素中获得的 Google Play 服务版本和 API 密钥作为 <application> 元素的子项(代码示例 2)。
  
  
1     <meta-data
2              android:name="com.google.android.gms.version"
3              android:value="@integer/google_play_services_version" />
4         
5      <meta-data
6            android:name="com.google.android.maps.v2.API_KEY"
7          android:value="copy your API Key here"/>

代码示例 2。 指定 Google Play 服务版本和 API 密钥 **

添加地图 Fragment

首先,在你的 activity 布局 xml 文件中,添加一个 MapFragment 元素(代码示例 3)。

  
  
1<fragment
2    android:id="@+id/storelocationmap"
3    android:layout_width="fill_parent"
4    android:layout_height="fill_parent"
5    android:name="com.google.android.gms.maps.MapFragment"
6/>

代码示例 3。 在 Activity 布局中添加 MapFragment **

在你的 activity 类中,您可以检索 Google Maps MapFragment 对象并在每个商店位置处绘制商店图标。

  
  
01
02private static final LatLng CHANDLER = new LatLng(33.455,-112.0668);
03
04private static final StoreLocation[] ALLRESTURANTLOCATIONS = new StoreLocation[] {
05        new StoreLocation(new LatLng(33.455,-112.0668), new String("Phoenix, AZ")),
06        new StoreLocation(new LatLng(33.5123,-111.9336), new String("SCOTTSDALE, AZ")),
07        new StoreLocation(new LatLng(33.3333,-111.8335), new String("Chandler, AZ")),
08        new StoreLocation(new LatLng(33.4296,-111.9436), new String("Tempe, AZ")),
09        new StoreLocation(new LatLng(33.4152,-111.8315), new String("Mesa, AZ")),
10        new StoreLocation(new LatLng(33.3525,-111.7896), new String("Gilbert, AZ"))
11};
12…   
13      @Override
14    protected void onCreate(Bundle savedInstanceState) {
15        super.onCreate(savedInstanceState);
16        setContentView(R.layout.geolocation_view);
17         
18        mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.storelocationmap)).getMap();
19        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(CHANDLER, ZOOM_LEVEL));
20        Drawable iconDrawable = getResources().getDrawable(R.drawable.ic_launcher);
21        Bitmap iconBmp = ((BitmapDrawable) iconDrawable).getBitmap();
22        for(int ix = 0; ix < ALLRESTURANTLOCATIONS.length; ix++) {
23            mMap.addMarker(new MarkerOptions()
24                .position(ALLRESTURANTLOCATIONS[ix].mLatLng)
25                .icon(BitmapDescriptorFactory.fromBitmap(iconBmp)));
26        }
27

代码示例 4。 在 Google Maps 上绘制商店图标 **

发送地图围栏通知

地理围栏是一个圆形区域,该区域由一点的经纬度坐标和半径决定。 Android 应用可以注册带有 Android 位置服务的地理围栏。 Android 应用还可指定地理围栏的使用期限。 无论地理围栏何时切换,例如,当 Android 设备进入注册的地理围栏或从其中退出时,Android 位置服务都会即时通知 Android 应用。

在我们的餐馆应用中,我们能够为每个商店位置定义地理围栏。 当设备进入商店附近时,应用将会发送一条通知,如“您已进入最喜爱的餐馆的附近!” (图 4)。


图 4 我们根据兴趣点和半径将地理围栏定义为一个圆形范围。

注册和取消注册地理围栏

在 Android SDK 中,位置服务也是 Google Play 服务 APK 的一部分,位于 “Extras” 目录下。

如要申请地理围栏监控,首先我们需要在应用的清单文件中指定 “ACCESS_FINE_LOCATION” 权限,该操作我们已经在上一部分中完成。

此外,我们还需要查看 Google Play 服务的可用性(代码示例 5 中的 checkGooglePlayServices() 方法)。 locationClient().connect() 调用与位置客户端成功建立连接后,位置服务将会调用onConnected(Bundle bundle) 函数,位置客户端可通过该函数申请添加或删除地理围栏。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值