注意:此代码的环境是:真机(系统版本为Android4.2.2)+WIFI联网(才能实现最后的运行结果);使用虚拟机调试会出现各种问题。
第一步:下载SDK和申请Key
到百度的网站http://developer.baidu.com/map/
第二步:然后选择SDK下载。(根据需要下载需要的SDK)
第三步:申请key
http://developer.baidu.com/map/index.php?title=androidsdk
然后选择创建应用
需要填写:应用名称和数字签名(SHA1)和包名
应用名称就是:
数字签名:
菜单栏中的window--------->Preferences---------->Build
包名:
填进去之后就会自动生成。
生成一个访问AK,这个AK,一定要记住。
第四步:编码
《1》配置文件manifest.xml中加上权限
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS"/> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/> <usespermissionandroid:name="android.permission.AUTHENTICATE_ACCOUNTS"/> <usespermissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET" /> <usespermission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
然后把刚才申请的key加上去:
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="你申请的key" />
然后在加上
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
《2》布局文件添加百度地图的布局:
<com.baidu.mapapi.map.MapView android:id="@+id/bmapview" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" />
《3》在libs文件夹下添加刚才下载的SDK(直接复制,粘贴进去就行了)
然后在把百度地图的JAR也添加到路径中去:
右键项目----------->Properties------>Java Build Path---->Libraries
添加进去之后,就可以了。
《4》MainActivity.java编码(头部的包就不写了,需要用到什么,自己添加):
public class MainActivity extends Activity { //百度地图控件,专门显示地图用的控件 private MapView mMapView = null; // 百度地图对象,抽象的地图对象 private BaiduMap bdMap; //定位模式 private LocationMode currentMode; //定位客户端 private LocationClient locClient; //定位图标 private Marker marker1; //经纬度 private double latitude, longitude; // 记录是否第一次定位 private boolean isFirstLoc = true; //地图上添加的定位图标 BitmapDescriptor bitmap; //定位监听器 //BDLocationListener locListener; @Override protected void onCreate(Bundle savedInstanceState) { //保存之前Activity状态 super.onCreate(savedInstanceState); // SDK初始化 SDKInitializer.initialize(getApplicationContext()); //设置android程序没有标题 requestWindowFeature(Window.FEATURE_NO_TITLE); //显示布局界面 setContentView(R.layout.activity_main); //获得显示地图的控件 mMapView = (MapView) findViewById(R.id.bmapview); //tv_show=(TextView)findViewById(R.id.tv_show); //在地图上显示的那个小图标 bitmap = BitmapDescriptorFactory .fromResource(R.drawable.icon_marka); init(); } private void init() { //定义地图状态 MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); //获得地图对象 bdMap = mMapView.getMap(); //LatLng cenpt=new LatLng(30.963175f,120.400244f); //BDLocation location; //latitude = location.getLatitude(); // LatLng cenpt = new LatLng(location.getLatitude(),location.getLongitude()); // OverlayOptions options = new MarkerOptions() // .position(cenpt) // .icon(bitmap); // MapStatus mMapStatus=new MapStatus.Builder() // .target(cenpt) // .zoom(18) // .build(); //普通地图 bdMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // MapStatusUpdate msu = MapStatusUpdateFactory.newMapStatus(mMapStatus); //设置地图初始状态 bdMap.setMapStatus(msu); //bdMap.addOverlay(options); // bdMap = new BaiduMap.Map("container", {mapType:BaiduMap.MAP_TYPE_NORMAL}); // map.setCurrentCity("北京市"); // map.centerAndZoom(new bdMap.Point(116.404, 39.915), 18); //当前定位模式为:普通 currentMode = LocationMode.NORMAL; // 开启定位图层 bdMap.setMyLocationEnabled(true); //定位服务的客户端 locClient = new LocationClient(this); //注册监听函数 locClient.registerLocationListener(locListener); //配置LocationClient这个定位客户端的定位参数 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll");// 设置坐标类型 option.setAddrType("all");//设置地址类型 option.setScanSpan(1000);//1s后定位 //配置客户端 locClient.setLocOption(option); //启动定位(这一步很重要,不然前边注册的那个监听函数就没用了) locClient.start(); } //这个是就是定位的监听函数(获取定位坐标,在坐标上显示图标) BDLocationListener locListener = new BDLocationListener(){ @Override public void onReceiveLocation(BDLocation location) { if (location == null || mMapView == null) return ; // 构造定位数据 MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius())// .direction(100)// 方向 .latitude(location.getLatitude())// .longitude(location.getLongitude())// .build(); // 获得经纬度 latitude = location.getLatitude(); longitude = location.getLongitude(); //设置定位数据 bdMap.setMyLocationData(locData); // 第一次定位的时候,那地图中心店显示为定位到的位置 LatLng cenpt = new LatLng(latitude,longitude); //定义覆盖物的坐标和使用的图标 OverlayOptions options = new MarkerOptions() .position(cenpt) .icon(bitmap); //在地图上添加覆盖物 bdMap.addOverlay(options); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); // MapStatusUpdate描述地图将要发生的变化 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll); //更新地图状态 bdMap.animateMapStatus(msu); // bdMap.setMyLocationEnabled(false); //reverseGeoCode(cenpt); //显示地址信息 Toast.makeText(getApplicationContext(), location.getAddrStr(), Toast.LENGTH_SHORT).show(); } } }; @Override protected void onResume() { super.onResume(); mMapView.onResume(); } @Override protected void onPause() { super.onPause(); mMapView.onPause(); } @Override protected void onDestroy() { mMapView.onDestroy(); mMapView = null; super.onDestroy(); } }
下图是定位显示的定位结果
源码下载:http://pan.baidu.com/s/1jGlP32Q