首先在此说明,这里的百度地图,或者其他的高德地图,谷歌地图等,这些SDK都是开源的,供所有感兴趣的朋友们免费使用。下面将介绍使用百度地图的步骤:
详细的步骤百度上说得很详细,可以进入网址(百度地图)[http://developer.baidu.com/map/index.php?title=androidsdk/guide/introduction]查看这里只对一些不清楚的地方进行描述:
1、申请密钥
这是不可缺少的,也是第一步。Key的申请地址为:http://lbsyun.baidu.com/apiconsole/key
安全码由两部分获得:数字签名;包名
首先,新建项目,在项目中会有包名。例如: package=”com.my.administrator.mylocationdemo”
然后打开cmd,输入cd .android如:C:\Users\Administrator>cd .android 回车进入后,在输入keytool -list -v -keystore debug.keystore
然后再回车,得到如下信息:
其中,SHA1 后面的内容就是数字签名,点击鼠标右键,标记,选择后点击右键就是复制完成,然后将它粘贴到申请密钥的安全码中
提交后即可得到密钥。
2、配置环境:
Eclipse
- 工程配置方法
第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加)。
第二步:在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。
通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。
注意:由于adt插件升级,若您使用Eclipse adt 22的话,需要对开发环境进行相应的设置,方法如下:
在Eclipse 中选中工程,右键选 Properties->Java Build Path->Order and Export 使 Android Private Libraries处于勾选状态;
Project -> clean-> clean all .
Android Studio
- 工程配置方法
第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。
第二步:导入jar包。菜单栏选择File->Project Structor->Modules->Dependencies,点击+号,选择File dependency,选择jar包导入。
通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。
注意:在上面配置完后,一定要记得导入jar包。
3、显示出百度地图
在官网上有详细的讲解【http://developer.baidu.com/map/index.php?title=androidsdk/guide/hellobaidumap】
4、定位功能
可取网址【http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0】
在application标签中声明service组件,每个app拥有自己单独的定位service:
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
声明使用权限
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
设置AcessKey
SDK4.2及之后版本需要在Mainfest.xml设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。
设置AccessKey,在application标签中加入
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="key" /> //key:开发者申请的key
综合以上两个功能,可以使用简单的地图
MainActivity
public class MainActivity extends AppCompatActivity {
private MapView mMapView;
private Button mButtonLocation;
private Button mButtonSearch;
private Button mButtonLine;
GeoCoder mSearch = null;
BaiduMap mBaiduMap = null;
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
private List<LatLng> points = new ArrayList<LatLng>();//称将一个点的集合
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
mLocationClient.registerLocationListener(myListener); //注册监听函数
setContentView(R.layout.activity_main);
startLocation();
initDrawLine();
// 地图初始化
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
mButtonSearch = (Button) findViewById(R.id.buttonSearch);
mButtonLocation = (Button) findViewById(R.id.buttonLocation);
mButtonLine = (Button) findViewById(R.id.buttonLine);
// 初始化搜索模块,注册事件监听
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
// mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult
.getLocation()));
points.add(geoCodeResult.getLocation());//得到这个点
String strInfo = String.format("纬度:%f 经度:%f",
geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
}
});
mButtonSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Geo搜索
mSearch.geocode(new GeoCodeOption().city(
"北京").address(
"海淀区中关村海龙大厦"));
}
});
}
private void startLocation(){
mButtonLocation = (Button) findViewById(R.id.buttonLocation);
mButtonLocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initLocation();//设置定位参数
mLocationClient.start();
}
});
}
//配置定位SDK参数
private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
int span = 1000;
option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mLocationClient.setLocOption(option);
}
//画线的方法
private void initDrawLine() {
mButtonLine = (Button) findViewById(R.id.buttonLine);
mButtonLine.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OverlayOptions ooPolyline = new PolylineOptions().width(10)
.color(0xAAFF0000).points(points);
mBaiduMap.addOverlay(ooPolyline);
}
});
}
//实现BDLocationListener接口
class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location.getLocType()==BDLocation.TypeGpsLocation||location.getLocType()==BDLocation.TypeNetWorkLocation) {
LatLng point = new LatLng(location.getLatitude(), location.getLongitude());
points.add(point);
mBaiduMap.addOverlay(new MarkerOptions().position(point)
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point));
mLocationClient.stop();
}
}
}
}
运行后如下图: