本文将分为两部分,第一部分是指导用户使用Mapview控件进行编程,其中包括了如何获得Google Map API,如何使用该API进行简单的开发,如何获得用户当前所在的位置。第二部分则包括如何在地图上,用第三方的组件库,实现气球式显示若干指定位置的功能。

步骤1 创建新的Android 工程

  首先打开eclipse新建立一个Android 工程,其中相关参数设置如下:

  Project name:MallFinder

  Build Target: Google APIs Platform – 2.1 API Level 7

  Application Name: Mall Finder

  Package Name: com.shawnbe.mallfinder

  Create Activity: MallFinderActivity

  MinimumSDK: 7

  如下图所示:

步骤2 注册Google Map API key

  由于在使用google map的时候,需要使用google map api的key,因此需要先注册一个开发者key,可以到如下地址进行注册:http://code.google.com/android/add-ons/google-apis/mapkey.html ,其中需要我们先产生开发期间的md5 密纹才能完成注册,因此我们先学习如何生成一个MD5密纹。

  我们需要使用keytool工具,不使用传统的命令行方式下那枯燥的证书签名生成办法,而是直接在eclipse下通过插件进行完成,详细见步骤3

  步骤3 安装keytool插件

  在eclipse的Help菜单中,如下图,选择安装新软件:

在安装地址中输入如下地址:http://www.keytool.sourceforge.net/update  ,如下图

接下来会加载相关的安装程序,并显示用户协议,选择接受所有用户协议后进行安装,安装成功后重新启动eclipse即可生效。

  步骤4 产生开发期间的MD5密钥

  在重新启动eclipse后,会发现工具栏多了如下图的keytool菜单

现在,我们打开debug.keystore,注意其位置回因操作系统不同而有不同

  Windows Vista : C:\Users\\.android\debug.keystore

  Windows XP : C:\Documents and Settings\\.android\debug.keystore

  OS X 和 Linux : ~/.android/debug.keystore

  点keytool菜单中,选择open keystore,根据提示,选择当前系统所在的debug.keystore位置并打开,如下图,

其中,输入密码默认为android即可,并点Load加载。之后会在eclipse中出现新的keytool的视图,如下图所示:

双击打开androiddebugkey,复制其md5密纹,然后访问页面

  http://code.google.com/android/maps-api-signup.html ,接受其协议,将md5密纹复制进去,再点Generate API Key,即产生google map的api key,记得保存好这个KEY,在接下来的步骤中要使用。

  步骤5 增加MapView控件

  接下来,我们可以往布局文件中增加MapView控件。我们在main.xml中添加如下代码:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="你的GOOGLE MAP API KEY "/>
</FrameLayout>
</LinearLayout>

在这个控件中,请注意要在android:apiKey的位置填入刚申请的google map api key。

  步骤6 设置相关的权限

  由于我们的应用需要调用Google Map的数据,以及通过手机的GPS获得相关的其他地理位置数据,因此我们必须在Android的Manifest文件中进行权限的设置。

  我们打开AndroidManifest.xml文件,然后增加如下代码所示的权限设置。

<uses-feature android:name="android.hardware.location.gps"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/>

在这里,我们分别调用了gps位置服务权限,使用互联网的权限以及使用最佳位置查找的权限(FINE_LOCATION)。在本文中,其实没用到FINE_LOCATION,但只是告诉开发者可以调整使用不同的地理位置提供者(providers)以提供准确的位置服务,如果要有比较精确的地理位置服务,那么可以设置android.permisson.ACCESS_FINE_LOCATION服务。要注意的是在开发中,不要过多引用一些不需要使用的权限设置,否则会给用户带来担忧安全等问题。要是只想调用一般的位置服务,可以使用普通的android.permission.ACCESS_COARSE_LOCATION权限。

  为了在应用中使用Google Map,需要在Manifest文件中包含相关的类库文件,所以加入如下代码:

<uses-library android:required="true" android:name="com.google.android.maps" />

为了视觉的美观,我们把标题栏也去掉,以便留给地图更大的空间,所以设置为

  android:theme="@android:style/Theme.NoTitleBar"

  下面是完整的Manifest文件代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shawnbe.mallfinder"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar">
<activity
android:label="@string/app_name"
android:name=".MallFinderActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:required="true" android:name="com.google.android.maps" />
</application>
<uses-feature android:name="android.hardware.location.gps"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

        步骤7 获取当前位置并监听位置变化的完整代码:

public class MallFinderActivity extends MapActivity implements LocationListener {
private MapController mapController;
private MapView mapView;
private LocationManager locationManager;
private Location currentLocation;
private GeoPoint currentPoint;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView)findViewById(R.id.mapView);
//使用系统内置的放大缩小功能
mapView.setBuiltInZoomControls(true);
mapView.setSatellite(false);
//地图显示的方式为街道模式
mapView.setStreetView(true);
mapController = mapView.getController();
//地图的放大缩小倍数为13
mapController.setZoom(13);
getLastLocation();
animateToCurrentLocation();
}
@Override
protected void onResume() {
super.onResume();
//更新地理位置信息
locationManager.requestLocationUpdates(getBestProvider(), 1000, 1, this);
}
@Override
protected void onPause() {
super.onPause();
//取消更新地理位置信息
locationManager.removeUpdates(this);
}
@Override
//用来做路线导航 ,这里我们不需要,因此只需要简单返回false即可
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
@Override
//使用location 监听器去检测我们的位置变化
public void onLocationChanged(Location newLocation) {
// TODO Auto-generated method stub
setCurrentLocation(newLocation);
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
public void getLastLocation(){
String provider = getBestProvider();
currentLocation = locationManager.getLastKnownLocation(provider);
if(currentLocation != null){
setCurrentLocation(currentLocation);//当前经纬度*10的6次方
}
else
{
Toast.makeText(this, "Location not yet acquired", Toast.LENGTH_LONG).show();
}
}
public void animateToCurrentLocation(){
if(currentPoint!=null){
mapController.animateTo(currentPoint);
}
}
public String getBestProvider(){
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
//criteria.setAccuracy(Criteria.NO_REQUIREMENT);
criteria.setAccuracy(Criteria.ACCURACY_FINE);//使用最精确的provider
String bestProvider = locationManager.getBestProvider(criteria, true);
return bestProvider;
}
public void setCurrentLocation(Location location){
int currLatitude = (int) (location.getLatitude()*1E6);
int currLongitude = (int) (location.getLongitude()*1E6);
currentPoint = new GeoPoint(currLatitude,currLongitude);
currentLocation = new Location("");
currentLocation.setLatitude(currentPoint.getLatitudeE6() / 1e6);
currentLocation.setLongitude(currentPoint.getLongitudeE6() / 1e6);
}
}

  

        小结

  在本系列的第一讲中,分步讲解了如何注册Google API KEY以及Mapview控件基本方法的使用,还有让读者了解到使用google map的初步步骤,在下一讲中,将指导读者如何对地图上的位置进行标注。

Android基于LBS的地图开发:(一)Google地图的调用相关推荐

  1. Android基于环信SDK开发IM即时聊天(一)

    2016-09-02更新:可以看一下最新的这篇文章和源码,Android基于环信SDK开发IM即时聊天(二) 目前市面上我了解的做第三方即时聊天SDK的有两家:环信.融云,这里我使用环信SDK来完成即 ...

  2. 【LBS】移动互联网基于LBS地理位置应用开发必备

    原文:[LBS]移动互联网基于LBS地理位置应用开发必备 源代码下载地址:http://www.zuidaima.com/share/1694743146056704.htm 功能:计算两个点(经纬度 ...

  3. Android基于XMPP Smack openfire 开发的聊天室

    公司刚好让做即时通讯模块,服务器使用openfire,偶然看到有位仁兄的帖子,拷贝过来细细研究,感谢此仁兄的无私,期待此仁兄的下次更新 转自http://blog.csdn.net/lnb333666 ...

  4. Android基于环信SDK开发IM即时聊天(二)

    声明1:北京时间现在是2019/6/10,评论里的问题我看到了,这几天我找时间看看源代码问题出在哪,在此感谢大家的监督 声明2:此Demo我是在5.1测试机上测试通过,感谢WTQ_DOMIAN的评论, ...

  5. 项目 - Web地图开发【高德地图API】(一)

    导航兔: Web地图开发 [高德地图API] 导航地址 Web地图开发[高德地图API](一) https://qianmoer.blog.csdn.net/article/details/12842 ...

  6. 项目 - Web地图开发【高德地图API】(二)

    导航兔: Web地图开发 [高德地图API] 导航地址 Web地图开发[高德地图API](一) https://qianmoer.blog.csdn.net/article/details/12842 ...

  7. Android基于高德SDK的开发——自定义地图主题样式(悬浮按钮+底部弹窗)

    日常的地图使用中,平台一般只会给我们提供地图的标准样式,造成了一定程度上的审美疲劳,那么如何实现地图的自定义样式呢?本文使用Android Studio 4.1,给开发者提供了一个基于高德地图SDK进 ...

  8. Android 开发笔记 Google地图定位与路线显示

    当你的应用需要加入Google地图,并且需要根据两点坐标规划路线时,就需要在应用中加入Google地图,调用指定的api获取路线数据,再把数据显示出来. 1.加载google地图,实例化一个地图视图对 ...

  9. 基于百度地图开发网易班车地图导航展示

    来到网易已经不知不觉一两个月了,最近把原来租的房子出租后,打算重新租一套房子.找到一个好房子不容易,首先考虑交通问题,上下班时间不能耗费太长,网易提供了遍布全城的班车系统,不过说实话,貌似只有文字说明 ...

  10. 商场室内地图-室内地图开发-室内三维地图开发

    在当下的移动互联网时代,室外地图领域炉火纯青的技术已经充分地满足了我们关于室外定位.导航的各种需求.但在室内,人们却经常会因为在商场找不到一个洗手间.朋友聚餐找不到饭店,停车场的茫茫车海里找不到一个停 ...

最新文章

  1. 用什么擦地最干净脑筋急转弯_22个数学脑筋急转弯答案,你能全部做出来吗?...
  2. 用vs2005开发比delphi快多了
  3. 微课堂 | 欢迎加入核心交流群,往期微课堂的嘉宾都在这里
  4. ubuntu 18.04无法开机 允许root用户桌面登录
  5. 【IT资讯】阿里新推出“阿里云网盘” 速度10MBs,百度网盘或迎来最强对手!
  6. 力扣217.存在重复元素 使用多种方法
  7. 华为Mate30 5G评测:首款5G爆品, 一步到位兼容5G双模全网通
  8. PHP Ctype函数(转)
  9. 人工智能语言python招聘_编程语言这么多为什么选Python
  10. (数据挖掘-入门-9)聚类
  11. java 自动化测试_java写一个自动化测试
  12. Python新手入门第一步:什么是 IDE?IDE 有什么用?
  13. 码畜 码奴 码农 IT民工和IT其他工种的划分定义
  14. 【高项】第5章 项目范围管理【知识点精华笔记】
  15. cmdline-tools component is missing
  16. 我的世界服务器无限血,我的世界生物血量无限指令 | 手游网游页游攻略大全
  17. WinRM 服务无法创建以下 SPN: /WSMAN/DC.contoso.com; WSMAN/DC
  18. uniapp结合萤石视频ezuikit.js的爬坑记录
  19. 【每晚一个恐怖的测开技术学习小故事】第三集:无限噩梦算法
  20. mac 启动台不显示已经安装的软件图标

热门文章

  1. linux pppd GRPS 配置若干问题
  2. 蓝桥杯单片机组——程序框架及客观题
  3. 《聊聊热点》第二篇:码农界的春联真扎心
  4. Windows下如何使用VScode连接远程linux服务器进行远程开发
  5. 整理任正非思想:加强合作走向世界-1996
  6. mysql like为什么不走索引,如何改写
  7. java计算机毕业设计售楼系统MyBatis+系统+LW文档+源码+调试部署
  8. java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.xx.xx.xx.xx.Acce
  9. 《中国日报国际版》创刊,传播中国声音
  10. 成功职业经理人的34个好习惯