Android百度地图开发入门教程
1.平台注册登录
登录百度地图开放平台网站注册并登录
网址:https://lbsyun.baidu.com
2.创建应用
点击右上角控制台,然后点击左侧“我的应用”,最后点击"创建应用"
应用名随便填,应用类型选Android SDK。找到Android目录下的debug.keystore文件,并复制其文件路径。(找不到在磁盘中全局搜索debug.keystore)
在java JDK中的bin目录打开命令窗口输入keytool -list -v -keystore +刚复制的debug.keystore文件路径
密钥库口令默认为 “android” (注:输入不显示),生成成功复制SHA1内容,发布版,开发版输入内容相同
使用AS创建android项目,复制主入口activity包名,点击提交生成应用。复制其中访问应用的AK
3.Android studio配置
打开AndroidMainifest.xml 配置meta-data标签,value值为刚复制的AK值
下载开发包
根据想要的功能下载开发包(选择JAR类型)
解压下好的压缩文件,进入libs文件夹,复制所有文件
将Android studio工程类型切换成project 把复制的文件粘贴到libs中
在build.gradle中配置如图内容,点击同步
android studio切换Android工程时出现了jniLibs文件夹即为加载成功
在AndroidManifest.xml中配置百度的服务
引入各种权限配置
<!-- 网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- WIFI定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 运营商相关接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 获取wifi权限-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!-- android9以上前台服务-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
4.代码编写
xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/locationInfo"
android:layout_width="wrap_content"
android:layout_height="200dp"
/>
<com.baidu.mapapi.map.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
>
</com.baidu.mapapi.map.MapView>
</LinearLayout>
MainActivity
public class MainActivity extends AppCompatActivity {
private TextView locationInfo;
//定位的对象
LocationClient mLocationClient;
MapView mapView;
BaiduMap baiduMap=null;
boolean isFirst=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());//百度服务初始化,在界面初始化之前加载
setContentView(R.layout.activity_main);
//初始化TextView
locationInfo = findViewById(R.id.locationInfo);
//初始化定位对象
mLocationClient=new LocationClient(getApplicationContext());
//注册监听方法
mLocationClient.registerLocationListener(new MyLocationListener());
//初始化地图方法
mapView=findViewById(R.id.mapView);
baiduMap=mapView.getMap();
//设置地图样式,平面图,卫星图等
baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//设置地图显示
baiduMap.setMyLocationEnabled(true);
//添加权限的方法
getPermission();
}
public void getPermission(){
ArrayList<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()){
String[] permissions= permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
}else {
requestLocation();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length>0){
for (int result:grantResults){
if (result!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "必须同意所有权限才能使用 ", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
}else {
Toast.makeText(this, "未知错误 ", Toast.LENGTH_SHORT).show();
finish();
}
break;
}
}
//初始化定位信息参数
private void requestLocation() {
initLocation();
//定位启动
mLocationClient.start();
}
private void initLocation() {
LocationClientOption option=new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选定位模式,默认高精度
//LocationMode.Height_Accuracy:高精度
//LocationMode.Battery_Saving:低功耗
//LocationMode.Device_Sensors:仅使用设备
option.setCoorType( "BD09LL");
//可选,设置返回经纬度坐标类型,默认GCJ02
//GCJ02:国测局坐标;
// BD09LL:百度经纬度坐标;
// BD09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,统一返回wGS84类型坐标
option.setScanSpan(1000) ;
//可选,设置发起定位请求的间隔, int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
// 如果设置非0,需设置1000ms 以上才有效
option.setOpenGps(true) ;
//可选,设置是否使用gps.默认false
//使用高精度和仅用设备两种定位模式的,参数必须设置为true
option.setLocationNotify(true);
//可选,设置是否当GPS有效时按照1s/1次频率输出GPS结果,默认false
option.setIgnoreKillProcess(false) ;
//可选,定位SDK 内部是一个service,并放到了独立进程。
//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKiLLProcess(true)
option. SetIgnoreCacheException(false) ;
//可选,设置是否收集Crash 信息,默认收集,即参数为false
option.setWifiCacheTimeOut(5*60*1000);
option.setEnableSimulateGps(false) ;
//可选,设置是否需要过滤GPs仿真结果,默认需要,即参数为false
option.setIsNeedAddress(true);
//将参数设置到定位对徐
mLocationClient.setLocOption(option);
}
//定位监听方法
private class MyLocationListener extends BDAbstractLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
navigateTo(location);
StringBuilder currentPosition = new StringBuilder( ) ;
currentPosition.append("纬度:").append(location.getLatitude()).append("\n");
currentPosition.append("经度:").append(location.getLongitude()). append("\n");
currentPosition.append("国家: " ).append(location.getCountry()).append("\n");
currentPosition.append("省:" ).append(location.getProvince()).append("\n");
currentPosition.append("市: " ).append(location.getCity()).append("\n");
currentPosition.append("区:" ).append(location.getDistrict()) .append("\n");
currentPosition.append("村镇: ").append(location.getTown()) .append("\n");
currentPosition.append("街道: ").append(location.getStreet()).append("\n");
currentPosition.append("地址: ").append(location.getAddrStr( ) ).append("\n");
currentPosition.append("定位方式:");
if ( location.getLocType() == BDLocation.TypeGpsLocation) {
currentPosition. append("GPS" ) ;
}else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
currentPosition. append("网络");
}
locationInfo.setText(currentPosition);
}
}
private void navigateTo(BDLocation location) {
//判断只初始化一次
if (isFirst) {
//添加经纬度
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
//给地图设置经纬度参数
baiduMap.animateMapStatus(update);
//初始化地图默认放大16倍
update = MapStatusUpdateFactory.zoomTo(16f);
//重新设置地图参数 ,更新
baiduMap.animateMapStatus(update);
isFirst=false;
}
MyLocationData.Builder builder = new MyLocationData.Builder();
//构建对象获取经纬度
builder.longitude(location.getLongitude());
builder.latitude(location.getLatitude());
//设置地图上的点
MyLocationData locationData = builder.build();
//给地图添加点
baiduMap.setMyLocationData(locationData);
}
// ========================定义生命周期,节省性能===========================================
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
baiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
}