百度地图SDK申请秘钥及环境配置
详见http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/showmap
获取发布版SHA1
打开Terminal,进入.android目录后输入keytool -list -v -keystore debug.keystore
其中的SHA1就是所需要的内容
包名:自己创建的包名
Android地图SDK
显示地图
创建MyApplication.java
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
SDKInitializer.initialize(this);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
}
}
更改清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.mapapplication">
<!--//获取设备网络状态,禁用后无法获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--//网络权限,当禁用后,无法进行检索等相关业务-->
<uses-permission android:name="android.permission.INTERNET" />
<!--//读取设备硬件信息,统计数据-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--//读取系统信息,包含系统版本等信息,用作统计-->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<!--//获取设备的网络状态,鉴权所需网络代理-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--//允许sd卡写权限,需写入地图数据,禁用后无法显示地图-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--//这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<!--//这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--//获取统计数据-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--//使用步行AR导航,配置Camera权限-->
<uses-permission android:name="android.permission.CAMERA" />
<!--//程序在手机屏幕关闭后后台进程仍然运行-->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<dist:module dist:instant="true" />
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<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" >
<intent-filter>
<action android:name="com.baidu.location.service_v2.2" >
</action>
</intent-filter>
</service>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
创建Activity
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
import android.app.Activity;
import android.os.Bundle;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
public class MainActivity extends Activity {
private MapView mMapView = null;
private BaiduMap mBaiduMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
}
运行结果:
地图切换:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//普通地图 ,mBaiduMap是地图控制器对象
// mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);//卫星图
mBaiduMap.setTrafficEnabled(true);//实时交通图
}
标注覆盖物:
//添加一个标注覆盖物
LatLng latLng = new LatLng(39.963175,116.400244);//经纬度
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher);
//创建一个图层选项
OverlayOptions options = new MarkerOptions().position(latLng).icon(bitmapDescriptor);
//把图层选项添加到地图上
mBaiduMap.addOverlay(options);
注意: fromResource的图片最好为png,jpg,使用矢量图会出现java.lang.IllegalArgumentException: marker's icon can not be null错误
检索功能:
使用前注意调整系统时间。
poi检索:
public class MainActivity extends Activity {
private MapView mMapView = null;
private BaiduMap mBaiduMap;
private PoiSearch poiSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
poiSearch = PoiSearch.newInstance();
//POI检索的结果监听事件
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
//获取POI检索结果
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
List<PoiInfo> poiInfos = new ArrayList<PoiInfo>();
poiInfos = poiResult.getAllPoi();
for (PoiInfo p: poiInfos){
System.out.println(p.address+"--"+p.city+"--"+p.phoneNum);
}
}else {
System.out.println("no result");
}
}
@Override
public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
//获取Place详情页检索结果
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
//已废弃
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
};
poiSearch.setOnGetPoiSearchResultListener(listener);
}
public void poiClick(View view) {
//发起一个检索请求
poiSearch.searchInCity(new PoiCitySearchOption()
.city("北京") //必填
.keyword("美食") //必填
.pageNum(10));
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
poiSearch.destroy();
}
}
定位显示搜索结果
//在上一个代码中修改OnGetPoiSearchResultListener中的onGetPoiResult
public void onGetPoiResult(PoiResult poiResult) {
//获取POI检索结果
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
List<PoiInfo> poiInfos = new ArrayList<PoiInfo>();
poiInfos = poiResult.getAllPoi();
for (PoiInfo p: poiInfos){
System.out.println(p.address+"--"+p.city+"--"+p.phoneNum);
BitmapDescriptor bd = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
OverlayOptions options = new MarkerOptions().position(p.location).icon(bd);
mBaiduMap.addOverlay(options);
}
}else {
System.out.println("no result");
}
}
Android定位SDK
在上面的清单文件中添加权限
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions"/>
添加service组件
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"></service>
Android9.0以上,需要增加权限
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
定位功能详见http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/get-location/latlng
public class MainActivity extends Activity {
private MapView mMapView = null;
private BaiduMap mBaiduMap;
public LocationClient mLocationClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
BDAbstractLocationListener listener1 = new MyLocationListener();
//定位
//声明LocationClient类
mLocationClient = new LocationClient(getApplicationContext());
//注册监听函数
mLocationClient.registerLocationListener(listener1);
}
//请求我的位置信息
public void myLocationClick(View view) {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,设置定位模式,默认高精度
option.setCoorType("bd09ll");//可选,设置返回经纬度坐标类型,默认GCJ02
option.setScanSpan(5000);//可选,设置发起定位请求的间隔,int类型,单位ms
option.setOpenGps(true);//可选,设置是否使用gps,默认false,使用高精度和仅用设备两种定位模式的,参数必须设置为true
option.setLocationNotify(true);//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
option.setIgnoreKillProcess(false);//可选,定位SDK内部是一个service,并放到了独立进程。
option.SetIgnoreCacheException(false);//可选,设置是否收集Crash信息,默认收集,即参数为false
option.setWifiCacheTimeOut(5*60*1000);//如果设置了该接口,首次启动定位时,会先判断当前Wi-Fi是否超出有效期,若超出有效期,会先重新扫描Wi-Fi,然后定位
option.setEnableSimulateGps(false);//可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
mLocationClient.setLocOption(option);
mLocationClient.start();
mLocationClient.requestLocation();
}
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location){
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取经纬度相关(常用)的结果信息
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
double latitude = location.getLatitude(); //获取纬度信息
double longitude = location.getLongitude(); //获取经度信息
float radius = location.getRadius(); //获取定位精度,默认值为0.0f
//获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
String coorType = location.getCoorType();
//获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
int errorCode = location.getLocType();
System.out.println("经纬度:"+longitude+","+latitude);
System.out.println("addr:"+location.getAddrStr());
}
}
}