一.获取百度开发SDK
- 控制台 | 百度地图开放平台 (baidu.com)在官方网站注册后,在控制台内创建应用
- 获取SHA1:找到.android文件夹下的debug.keystore,在cmd中输入keytool -list -v -keystore 相应路径/.android/debug.keystore -alias androiddebugkey
- 在SDK下载 - 百度LBS开放平台 (baidu.com)下载包,注意选择所需要的功能
- 将下载后的压缩包解压,将libs下的文件全部粘贴到项目的libs下
- 此时android视图下无法显示这些文件,需要修改build.gradle(Module:...)
// 在android {下添加
sourceSets {
main {
jniLibs.srcDir 'libs'
}
// 在dependencies {下添加
implementation files('libs/BaiduLBS_Android.jar')
二.AndroidManifest.xml文件的设置
<!-- 权限设置 -->
<!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 在application下添加-->
android:name=".otherSDK.BaiduMapApplication"
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/Theme.MyWork1lda">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="wHlGGK2O6zPbT33RiG2GEnOxskEVo9Qb" />
<!--百度定位服务 这个服务也是放在application标签下的-->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"
/>
三.Java和XML文件的代码
1.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=".activity.BaiduMapActivity">
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radioButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="普通地图" />
<RadioButton
android:id="@+id/radioButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="卫星图" />
</RadioGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/longitudeText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="经度:"
android:textSize="15dp" />
<TextView
android:id="@+id/longitudeText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/latitudeText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="纬度:" />
<TextView
android:id="@+id/latitudeText2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/addressText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="地址:"
android:textSize="15dp" />
<TextView
android:id="@+id/addressText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"></com.baidu.mapapi.map.MapView>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|start"
android:layout_margin="16dp"
android:src="@drawable/location"
app:elevation="8dp"/><!--设置高度值-->
</FrameLayout>
</LinearLayout>
2.Java文件
先要实现一个类
package com.example.mywork1_lda.otherSDK;
import android.app.Application;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
public class BaiduMapApplication 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);
}
}
百度地图调用的activity
package com.example.mywork1_lda.activity;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.example.mywork1_lda.R;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public class BaiduMapActivity extends AppCompatActivity {
private MapView mMapView;
private BaiduMap mBaiduMap;
private LocationClient mLocClient;
// 是否首次定位
private boolean isFirstLoc = true;
private RadioButton radioButton1;
private RadioButton radioButton2;
private TextView textViewLongitude;
private TextView textViewLatitude;
private TextView textViewAddress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_baidu_map);
radioButton1 = findViewById(R.id.radioButton);
radioButton2 = findViewById(R.id.radioButton2);
textViewLongitude = findViewById(R.id.longitudeText2);
textViewLatitude = findViewById(R.id.latitudeText2);
textViewAddress = findViewById(R.id.addressText2);
// 地图初始化
mMapView = findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
radioButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
BaiduMap mBaiduMap;
mBaiduMap = mMapView.getMap();
mBaiduMap.setMyLocationEnabled(true);
//普通地图 ,mBaiduMap是地图控制器对象
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
}
});
radioButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
BaiduMap mBaiduMap;
mBaiduMap = mMapView.getMap();
//普通地图 ,mBaiduMap是地图控制器对象
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
}
});
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED&&
ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED&&
ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else {
// 定位初始化
initLocation();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults[0]!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "没有相应权限", Toast.LENGTH_SHORT).show();
finish();;
}else{
initLocation();
}
}
}
@Override
protected void onDestroy() {
// 退出时销毁定位
mLocClient.stop();
// 关闭定位图层
mBaiduMap.setMyLocationEnabled(false);
// 在activity执行onDestroy时必须调用mMapView.onDestroy()
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
public void initLocation(){
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(this);
LocationClientOption option = new LocationClientOption();
// 打开gps
option.setOpenGps(true);
// 设置坐标类型
option.setCoorType("bd09ll");
option.setScanSpan(1000);
mLocClient.setLocOption(option);
// 注册监听器
MyLocationListener myListener = new MyLocationListener();
mLocClient.registerLocationListener(myListener);
mLocClient.start();
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// MapView 销毁后不在处理新接收的位置
Log.d("location1234","onReceiveLocation");
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())// 设置定位数据的精度信息,单位:米
.direction(location.getDirection()) // 此处设置开发者获取到的方向信息,顺时针0-360
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
// 设置定位数据, 只有先允许定位图层后设置数据才会生效
mBaiduMap.setMyLocationData(locData);
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
if (isFirstLoc) {
isFirstLoc = false;
//给地图设置状态
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(ll));
}
textViewLongitude.setText(location.getLongitude()+"");
textViewLatitude.setText(location.getLatitude()+"");
textViewAddress.setText(location.getAddress()+"");
}
}
}
/*
public class BaiduMapActivity extends AppCompatActivity {
private MapView mapView = null;
private BaiduMap mBaiduMap = null;
;
private LocationClient mLocationClient = null;
private boolean isFirstLocate = true;
//private MyLocationConfiguration.LocationMode locationMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_baidu_map);
mapView = findViewById(R.id.bmapView);
mBaiduMap = mapView.getMap();
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
mBaiduMap.setMyLocationEnabled(true);
//定位初始化
mLocationClient = new LocationClient(this);
//通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
//设置locationClientOption
mLocationClient.setLocOption(option);
//注册LocationListener监听器
MyLocationListener myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
mLocationClient.start();
}
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || mapView == null) {
return;
}
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
if (isFirstLocate) {
isFirstLocate = false;
//给地图设置状态
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(ll));
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
}
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mBaiduMap.setMyLocationEnabled(false);
mapView.onDestroy();
mapView = null;
}
}*/
四.效果图和源码仓库
代码仓库:ldaadl/AndroidDevelopment1: 第一次作业 (github.com)
效果图: