在百度地图上显示Point
—— BMap API Android SDK 的简单使用
1. BMap API 申请 AK
百度地图API是一套将百度地图嵌入到网页应用程序接口,可以用于构建功能丰富、交互性强的地图应用程序,支持PC端和移动端的地图应用开发。不仅如此,BMap API还提供了多个开源库,如快速实现在地图上添加Marker、自定义信息窗口、标注相关开发、区域限制设置、几何运算、实时交通、查询与公交驾车查询、鼠标绘制工具等功能。在本APP中,需要在百度地图上依据经纬度显示Point,因此APP也可以看做是一个LBS系统。
使用百度地图API需要申请AK,(点击进入申请页面),如下所示。申请过程需要参考百度地图提供的在线文档(点击进入在线文档)。
需要说明的是,Android Studio 本身提供了使用Terminal的功能,因此不必使用Windows 控制台也能获取SHA1
申请AK之后,需要在AndroidManifest.xml中添加如下代码:(添加在<application></application>之间)
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="你自己的AK" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
此外,还需要在AndroidManifest.xml中添加相关权限:
<pre name="code" class="html"> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- SD卡读取权限,用户写入离线定位数据 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- Test权限 -->
<uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />
<!-- 照相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
然后,在src/main/ 目录下新建 jniLibs目录,并将libBaiduMapSDK_vX_X_X_X.so复制到jniLibs目录下。如下图:
接下来在app/libs/ 目录下放BaiduMap的jar包,如下图所示。对每个jar包右键选择Add AS Library,导入jar包。
在 app/build.gradle文件中,dependencies{} 中添加以下代码,以便导入jar包
<span style="font-size:14px;"> compile files('libs/BaiduLBS_Android.jar')
compile files('libs/baidumapapi_base_v3_7_1.jar')
compile files('libs/baidumapapi_map_v3_7_1.jar')
compile files('libs/baidumapapi_util_v3_7_1.jar')</span>
此外,我还在使用了butterknife,它是GitHub上的一个开源项目,使用了butterknife就不用再写findViewById()了!为了用它,需要在app/build.gradle文件中添加 :
<span style="font-size:14px;"> compile 'com.jakewharton:butterknife:7.0.0'</span>
执行完上述步骤后,重新build project,如果没有报错就OK了。
2. 实现步骤
修改activity_main.xml如下:
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="com.example.a10405.tmp.MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</RelativeLayout></span><span style="font-size:18px;">
</span>
修改
MainActivity.java 如下:
<span style="font-size:14px;">package com.example.a10405.tmp.activity;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.example.a10405.tmp.R;
import com.example.a10405.tmp.model.Point;
import butterknife.Bind;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.bmapView)
MapView mapView; //绑定地图控件
public BaiduMap baiduMap; //地图实例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
baiduMap = mapView.getMap();
LatLng latLng = new LatLng(41.802273,123.417315);//将地图移至沈阳市
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.animateMapStatus(u);
addMarkerOnMap();
}
/**
* 在地图上加载标注点
*/
public void addMarkerOnMap() {
for(Point point : Point.pointList) {
//在地图上添加标注点marker
LatLng latLngMarker = new LatLng( point.getLatitude(), point.getLongitude());// 标注点的经纬度
BitmapDescriptor mIconMaker = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
OverlayOptions overlayOptions = new MarkerOptions()//添加图片标注
.position(latLngMarker)
.icon(mIconMaker)
.zIndex(5);// 图标
Marker marker = (Marker) (baiduMap.addOverlay(overlayOptions));
OverlayOptions textOption = new TextOptions()//添加文字标注
.position(latLngMarker)
.text(point.getName())
.fontSize(42)
.fontColor(Color.rgb(0, 150, 64));
baiduMap.addOverlay(textOption);
//绑定marker的数据
Bundle bundle = new Bundle();
bundle.putSerializable("name", point.getName());
bundle.putSerializable("pictures", point.getImgList());
marker.setExtraInfo(bundle);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mapView.onPause();
}
}</span>
最后,真机调试的效果如下: