导读
1.简介
2.获取SHA1码的方式
3.配置环境
4.地图初养成
5.显示地图覆盖物
6.窗口信息的添加及发起截图
7.POI检索
8.线路规划
9.定位
10.导航
11.全景图
简介
使用流程
注册登录
点击上图获取密钥
点击上图创建应用
⚠️这里要选择android SDK
下载SDK,事例代码,类参考
获取SHA1码的方式
获取开发版
获取发布版
在finish后,从存储的路径找到生成的文件,然后拷贝到下图
在Terminal中复制输入如下命令(是一句哦)
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
然后得到发布码
填写完毕后会创建应用如下图
配置环境
上一步完成后,我们还需要配置环境,需要用到上边下载的文件
⚠️以下内容要去百度地图官网查看最新情况
首先,将下载的文件解压,我们要用到的是下图文件
Docs文件夹 —-百度地图的类库及接口
Lib文件夹—-开发要导入工程的配置文件
Sample文件夹—-百度官方的开发案例
⚠️图中标号对应的拷到对应的位置,在工程视图下操作较容易
然后添加依赖⚠️要到百度地图官网上查最新的代码
sourceSets{
main{
jniLibs.srcDir 'libs'
//说明so的路径为该libs路径,关联所有地图SDK的so文件
}
}
compile files('libs/BaiduLBS_Android.jar')
signingConfigs{
release{
storeFile file("/Users/air/Documents/Android/app/Android.jks")
storePassword "********"
keyAlias "key0"
keyPassword "******"
}
}
buildTypes {
release {
//是否混淆
minifyEnabled false
//是否移除无用资源
zipAlignEnabled true
//混淆的配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
⚠️这里有个安全问题
再然后在清单文件中添加权限⚠️在百度地图官网上查询
⚠️上图的开发者key来自下图
地图初养成
见上图了,官方给的使用方法,不过开发中经常要写我们自己的application
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.hala.mapdemo">
<application
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"
android:name=".HalaApplication">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="自己创建的百度地图项目下面有" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<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" />
//获取设备的网络状态,鉴权所需网络代理
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//允许sd卡写权限,需写入地图数据,禁用后无法显示地图
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
//获取统计数据
<uses-permission android:name="android.permission.GET_TASKS" />
//鉴权所需该权限获取进程列表
<uses-permission android:name="android.permission.CAMERA" />
//使用步行AR导航,配置Camera权限
</manifest>
activity_main.xml
<?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="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</android.support.constraint.ConstraintLayout>
HalaApplication.java
package com.hala.mapdemo;
import android.app.Application;
import com.baidu.mapapi.SDKInitializer;
//别忘了在清单文件中注册自定义application
public class HalaApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//初始化地图
SDKInitializer.initialize(getApplicationContext());
}
}
MainActivity.java
package com.hala.mapdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
public class MainActivity extends AppCompatActivity {
MapView mMapView=null;//展示地图视图
BaiduMap mBaiduMap;//控制器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView=(MapView)this.findViewById(R.id.bmapView);
mBaiduMap=mMapView.getMap();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
显示地图覆盖物
⚠️其他文件相同
MainActivity.java
package com.hala.mapdemo;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
MapView mMapView=null;//展示地图视图
BaiduMap mBaiduMap;//控制器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView=(MapView)this.findViewById(R.id.bmapView);
mBaiduMap=mMapView.getMap();
//设置地图的类型
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
addText();
// addPoly();
// addMarker();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
/**
*添加文字覆盖物
*/
public void addText(){
TextOptions opt=new TextOptions();
opt.text("Emilia Clark");
opt.fontColor(Color.BLACK);
opt.fontSize(24);
LatLng point=new LatLng(39,116);
opt.position(point);
//添加覆盖物
mBaiduMap.addOverlay(opt);
}
/**
* 添加多边形覆盖物
*/
public void addPoly(){
PolygonOptions poly=new PolygonOptions();
List<LatLng> lats=new ArrayList<LatLng>();
LatLng point1=new LatLng(39,116);
lats.add(point1);
LatLng point2=new LatLng(38,116);
lats.add(point2);
LatLng point3=new LatLng(39,117);
lats.add(point3);
poly.points(lats);
mBaiduMap.addOverlay(poly);
}
/**
* 添加图片标志物
*/
public void addMarker(){
MarkerOptions opt=new MarkerOptions();
BitmapDescriptor icon= BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
opt.icon(icon);
LatLng point=new LatLng(39,116);
opt.position(point);
mBaiduMap.addOverlay(opt);
}
}
窗口信息的添加及发起截图
⚠️其他文件保持不变
activity_main.xml
<?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">
<Button
android:id="@+id/btn_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="截图"
android:onClick="onClick"/>
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
app:layout_constraintTop_toBottomOf="@+id/btn_icon" />
</android.support.constraint.ConstraintLayout>
MainActivity.java
package com.hala.mapdemo;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
MapView mMapView=null;//展示地图视图
BaiduMap mBaiduMap;//控制器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView=(MapView)this.findViewById(R.id.bmapView);
mBaiduMap=mMapView.getMap();
//设置地图的类型
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
addText();
// addPoly();
// addMarker();
// addInfo();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
/**
*添加文字覆盖物
*/
public void addText(){
TextOptions opt=new TextOptions();
opt.text("Emilia Clark");
opt.fontColor(Color.BLACK);
opt.fontSize(24);
LatLng point=new LatLng(39,116);
opt.position(point);
//添加覆盖物
mBaiduMap.addOverlay(opt);
}
/**
* 添加多边形覆盖物
*/
public void addPoly(){
PolygonOptions poly=new PolygonOptions();
List<LatLng> lats=new ArrayList<LatLng>();
LatLng point1=new LatLng(39,116);
lats.add(point1);
LatLng point2=new LatLng(38,116);
lats.add(point2);
LatLng point3=new LatLng(39,117);
lats.add(point3);
poly.points(lats);
mBaiduMap.addOverlay(poly);
}
/**
* 添加图片标志物
*/
public void addMarker(){
MarkerOptions opt=new MarkerOptions();
BitmapDescriptor icon= BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
opt.icon(icon);
LatLng point=new LatLng(39,116);
opt.position(point);
mBaiduMap.addOverlay(opt);
}
/**
* 添加窗口视图
*/
public void addInfo(){
BitmapDescriptor icon=BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
LatLng point=new LatLng(39,116);
InfoWindow info=new InfoWindow(icon,point,0,new InfoWindowOnClickListener());
mBaiduMap.showInfoWindow(info);
}
//窗口视图的监听器,InfoWindow的第四个参数
class InfoWindowOnClickListener implements InfoWindow.OnInfoWindowClickListener{
@Override
public void onInfoWindowClick() {
Toast.makeText(MainActivity.this, "窗口信息被点击了", Toast.LENGTH_SHORT).show();
}
}
//截图点击事件
public void onClick(View view){
mBaiduMap.snapshot(new BaiduMap.SnapshotReadyCallback() {
@Override
public void onSnapshotReady(Bitmap bitmap) {
Toast.makeText(MainActivity.this, "地址:"+bitmap, Toast.LENGTH_SHORT).show();
}
});
}
}
POI检索
⚠️其他文件不变
MainActivity.java
package com.hala.mapdemo;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.poi.BaiduMapPoiSearch;
import com.baidu.mapapi.utils.poi.PoiParaOption;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
MapView mMapView=null;//展示地图视图
BaiduMap mBaiduMap;//控制器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView=(MapView)this.findViewById(R.id.bmapView);
mBaiduMap=mMapView.getMap();
//设置地图的类型
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
addText();
// addPoly();
// addMarker();
// addInfo();
// poiSearch();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
/**
*添加文字覆盖物
*/
public void addText(){
TextOptions opt=new TextOptions();
opt.text("Emilia Clark");
opt.fontColor(Color.BLACK);
opt.fontSize(24);
LatLng point=new LatLng(39,116);
opt.position(point);
//添加覆盖物
mBaiduMap.addOverlay(opt);
}
/**
* 添加多边形覆盖物
*/
public void addPoly(){
PolygonOptions poly=new PolygonOptions();
List<LatLng> lats=new ArrayList<LatLng>();
LatLng point1=new LatLng(39,116);
lats.add(point1);
LatLng point2=new LatLng(38,116);
lats.add(point2);
LatLng point3=new LatLng(39,117);
lats.add(point3);
poly.points(lats);
mBaiduMap.addOverlay(poly);
}
/**
* 添加图片标志物
*/
public void addMarker(){
MarkerOptions opt=new MarkerOptions();
BitmapDescriptor icon= BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
opt.icon(icon);
LatLng point=new LatLng(39,116);
opt.position(point);
mBaiduMap.addOverlay(opt);
}
/**
* 添加窗口视图
*/
public void addInfo(){
BitmapDescriptor icon=BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
LatLng point=new LatLng(39,116);
InfoWindow info=new InfoWindow(icon,point,0,new InfoWindowOnClickListener());
mBaiduMap.showInfoWindow(info);
}
//窗口视图的监听器,InfoWindow的第四个参数
class InfoWindowOnClickListener implements InfoWindow.OnInfoWindowClickListener{
@Override
public void onInfoWindowClick() {
Toast.makeText(MainActivity.this, "窗口信息被点击了", Toast.LENGTH_SHORT).show();
}
}
//截图点击事件
public void onClick(View view){
mBaiduMap.snapshot(new BaiduMap.SnapshotReadyCallback() {
@Override
public void onSnapshotReady(Bitmap bitmap) {
Toast.makeText(MainActivity.this, "地址:"+bitmap, Toast.LENGTH_SHORT).show();
}
});
}
/**
*POI检索
*/
public void poiSearch(){
BaiduMapPoiSearch poi=new BaiduMapPoiSearch();
PoiParaOption opt=new PoiParaOption();
opt.key("肯德基");
opt.radius(5000);
LatLng point1=new LatLng(39,116);
opt.center(point1);
poi.openBaiduMapPoiNearbySearch(opt,this);
}
}
线路规划
⚠️其他文件不变
MainActivity.java
package com.hala.mapdemo;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.poi.BaiduMapPoiSearch;
import com.baidu.mapapi.utils.poi.PoiParaOption;
import com.baidu.mapapi.utils.route.BaiduMapRoutePlan;
import com.baidu.mapapi.utils.route.RouteParaOption;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
MapView mMapView=null;//展示地图视图
BaiduMap mBaiduMap;//控制器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView=(MapView)this.findViewById(R.id.bmapView);
mBaiduMap=mMapView.getMap();
//设置地图的类型
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
addText();
// addPoly();
// addMarker();
// addInfo();
// poiSearch();
rountPlan();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
/**
*添加文字覆盖物
*/
public void addText(){
TextOptions opt=new TextOptions();
opt.text("Emilia Clark");
opt.fontColor(Color.BLACK);
opt.fontSize(24);
LatLng point=new LatLng(39,116);
opt.position(point);
//添加覆盖物
mBaiduMap.addOverlay(opt);
}
/**
* 添加多边形覆盖物
*/
public void addPoly(){
PolygonOptions poly=new PolygonOptions();
List<LatLng> lats=new ArrayList<LatLng>();
LatLng point1=new LatLng(39,116);
lats.add(point1);
LatLng point2=new LatLng(38,116);
lats.add(point2);
LatLng point3=new LatLng(39,117);
lats.add(point3);
poly.points(lats);
mBaiduMap.addOverlay(poly);
}
/**
* 添加图片标志物
*/
public void addMarker(){
MarkerOptions opt=new MarkerOptions();
BitmapDescriptor icon= BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
opt.icon(icon);
LatLng point=new LatLng(39,116);
opt.position(point);
mBaiduMap.addOverlay(opt);
}
/**
* 添加窗口视图
*/
public void addInfo(){
BitmapDescriptor icon=BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
LatLng point=new LatLng(39,116);
InfoWindow info=new InfoWindow(icon,point,0,new InfoWindowOnClickListener());
mBaiduMap.showInfoWindow(info);
}
//窗口视图的监听器,InfoWindow的第四个参数
class InfoWindowOnClickListener implements InfoWindow.OnInfoWindowClickListener{
@Override
public void onInfoWindowClick() {
Toast.makeText(MainActivity.this, "窗口信息被点击了", Toast.LENGTH_SHORT).show();
}
}
//截图点击事件
public void onClick(View view){
mBaiduMap.snapshot(new BaiduMap.SnapshotReadyCallback() {
@Override
public void onSnapshotReady(Bitmap bitmap) {
Toast.makeText(MainActivity.this, "地址:"+bitmap, Toast.LENGTH_SHORT).show();
}
});
}
/**
* POI检索
*/
public void poiSearch(){
BaiduMapPoiSearch poi=new BaiduMapPoiSearch();
PoiParaOption opt=new PoiParaOption();
opt.key("肯德基");
opt.radius(5000);
LatLng point1=new LatLng(39,116);
opt.center(point1);
poi.openBaiduMapPoiNearbySearch(opt,this);
}
/**
* 公交路线规划
*/
public void rountPlan(){
BaiduMapRoutePlan plan=new BaiduMapRoutePlan();
LatLng start=new LatLng(39.93923,116.357428);
LatLng end=new LatLng(39.91923,116.327428);
RouteParaOption opt=new RouteParaOption();
opt.cityName("北京");
opt.startPoint(start);
opt.startName("天安门");
opt.endPoint(end);
opt.endName("龙泽");
plan.openBaiduMapTransitRoute(opt,this);
}
}
定位
定位需要在前边基础上再次配置关于定位功能的环境
将上边两图的Service和权限复制到清单文件中
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.hala.mapdemo">
<application
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"
android:name=".HalaApplication">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="41WOIuD9aoOcGqEElSGCmUWaMyxwVtRC " />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.baidu.location.f"
android:enabled="true" android:process=":remote">
</service>
</application>
<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" />
//获取设备的网络状态,鉴权所需网络代理
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//允许sd卡写权限,需写入地图数据,禁用后无法显示地图
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
//获取统计数据
<uses-permission android:name="android.permission.GET_TASKS" />
//鉴权所需该权限获取进程列表
<uses-permission android:name="android.permission.CAMERA" />
//使用步行AR导航,配置Camera权限
<!-- 这个权限用于进行网络定位-->
<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"
tools:ignore="ProtectedPermissions"></uses-permission>
</manifest>
MainActivity.java
package com.hala.mapdemo;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
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.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.poi.BaiduMapPoiSearch;
import com.baidu.mapapi.utils.poi.PoiParaOption;
import com.baidu.mapapi.utils.route.BaiduMapRoutePlan;
import com.baidu.mapapi.utils.route.RouteParaOption;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
MapView mMapView=null;//展示地图视图
BaiduMap mBaiduMap;//控制器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView=(MapView)this.findViewById(R.id.bmapView);
mBaiduMap=mMapView.getMap();
//设置地图的类型
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
addText();
// addPoly();
// addMarker();
// addInfo();
// poiSearch();
// rountPlan();
location();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@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 onStop() {
super.onStop();
//如果停止,就取消定位
client.unRegisterLocationListener(myLocationListener);
client.stop();
}
/**
*添加文字覆盖物
*/
public void addText(){
TextOptions opt=new TextOptions();
opt.text("Emilia Clark");
opt.fontColor(Color.BLACK);
opt.fontSize(24);
LatLng point=new LatLng(39,116);
opt.position(point);
//添加覆盖物
mBaiduMap.addOverlay(opt);
}
/**
* 添加多边形覆盖物
*/
public void addPoly(){
PolygonOptions poly=new PolygonOptions();
List<LatLng> lats=new ArrayList<LatLng>();
LatLng point1=new LatLng(39,116);
lats.add(point1);
LatLng point2=new LatLng(38,116);
lats.add(point2);
LatLng point3=new LatLng(39,117);
lats.add(point3);
poly.points(lats);
mBaiduMap.addOverlay(poly);
}
/**
* 添加图片标志物
*/
public void addMarker(){
MarkerOptions opt=new MarkerOptions();
BitmapDescriptor icon= BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
opt.icon(icon);
LatLng point=new LatLng(39,116);
opt.position(point);
mBaiduMap.addOverlay(opt);
}
/**
* 添加窗口视图
*/
public void addInfo(){
BitmapDescriptor icon=BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
LatLng point=new LatLng(39,116);
InfoWindow info=new InfoWindow(icon,point,0,new InfoWindowOnClickListener());
mBaiduMap.showInfoWindow(info);
}
//窗口视图的监听器,InfoWindow的第四个参数
class InfoWindowOnClickListener implements InfoWindow.OnInfoWindowClickListener{
@Override
public void onInfoWindowClick() {
Toast.makeText(MainActivity.this, "窗口信息被点击了", Toast.LENGTH_SHORT).show();
}
}
//截图点击事件
public void onClick(View view){
mBaiduMap.snapshot(new BaiduMap.SnapshotReadyCallback() {
@Override
public void onSnapshotReady(Bitmap bitmap) {
Toast.makeText(MainActivity.this, "地址:"+bitmap, Toast.LENGTH_SHORT).show();
}
});
}
/**
* POI检索
*/
public void poiSearch(){
BaiduMapPoiSearch poi=new BaiduMapPoiSearch();
PoiParaOption opt=new PoiParaOption();
opt.key("肯德基");
opt.radius(5000);
LatLng point1=new LatLng(39,116);
opt.center(point1);
poi.openBaiduMapPoiNearbySearch(opt,this);
}
/**
* 公交路线规划
*/
public void rountPlan(){
BaiduMapRoutePlan plan=new BaiduMapRoutePlan();
LatLng start=new LatLng(39.93923,116.357428);
LatLng end=new LatLng(39.91923,116.327428);
RouteParaOption opt=new RouteParaOption();
opt.cityName("北京");
opt.startPoint(start);
opt.startName("天安门");
opt.endPoint(end);
opt.endName("龙泽");
plan.openBaiduMapTransitRoute(opt,this);
}
MyLocationListener myLocationListener;
LocationClient client;
/**
* 定位
*/
public void location(){
//允许进行定位 完成后关闭
mBaiduMap.setMyLocationEnabled(true);
LocationClientOption opt=new LocationClientOption();
//坐标系
opt.setCoorType("bd09ll");
//打开GPS
opt.setOpenGps(true);
//设置定位模式 高精度
opt.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//设置监听
client=new LocationClient(this,opt);
myLocationListener=new MyLocationListener();
client.registerLocationListener(myLocationListener);
//启动定位
client.start();
mBaiduMap.setMyLocationEnabled(false);
}
class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation bdLocation) {
MyLocationData data=new MyLocationData.Builder()
.latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude())
.build();
mBaiduMap.setMyLocationData(data);
//将地图中心移动到定位位置
LatLng lat=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());
MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(lat);
mBaiduMap.animateMapStatus(update);
//窗口信息 定位图标
BitmapDescriptor icon=BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
InfoWindow infoWindow=new InfoWindow(icon,lat,0,null);
mBaiduMap.showInfoWindow(infoWindow);
}
}
}
导航
在前边配置基础上加如下权限到清单文件
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.hala.mapdemo">
<application
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"
android:name=".HalaApplication">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="41WOIuD9aoOcGqEElSGCmUWaMyxwVtRC " />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.baidu.location.f"
android:enabled="true" android:process=":remote">
</service>
</application>
<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" />
//获取设备的网络状态,鉴权所需网络代理
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//允许sd卡写权限,需写入地图数据,禁用后无法显示地图
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
//获取统计数据
<uses-permission android:name="android.permission.GET_TASKS" />
//鉴权所需该权限获取进程列表
<uses-permission android:name="android.permission.CAMERA" />
//使用步行AR导航,配置Camera权限
<!-- 这个权限用于进行网络定位-->
<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"
tools:ignore="ProtectedPermissions"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCES_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<!-- 来电消音 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 摄影机 -->
<uses-permission android:name="android.permission.CAMERA" />
</manifest>
Main2Activity.java
package com.hala.mapdemo;
import android.content.Intent;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import com.baidu.navisdk.adapter.BaiduNaviManager;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Main2Activity extends AppCompatActivity {
private Button mBtnStart;
private BaiduNaviManager mBaiduNaviManager;
private BNRoutePlanNode sNode;
private BNRoutePlanNode eNode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//导航初始化
mBaiduNaviManager=BaiduNaviManager.getInstance();
mBaiduNaviManager.init(this,
getSdcardRootPath(),
getAppFolderName(),
new MyNaviInitListener(),
null,null,null);
mBtnStart=(Button)this.findViewById(R.id.btn_start);
mBtnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//发起导航线路规划
if(BaiduNaviManager.isNaviInited()){
List<BNRoutePlanNode> nodes=new ArrayList<BNRoutePlanNode>();
sNode = new BNRoutePlanNode(116.30142, 40.05087, "百度大厦", "百度大厦", BNRoutePlanNode.CoordinateType.WGS84);
eNode = new BNRoutePlanNode(116.39750, 39.90882, "北京天安门", "北京天安门", BNRoutePlanNode.CoordinateType.WGS84);
nodes.add(sNode);
nodes.add(eNode);
mBaiduNaviManager.launchNavigator(Main2Activity.this,nodes,0,true,new MyRoutePlanListener());
}
}
});
}
//线路规划监听事件
class MyRoutePlanListener implements BaiduNaviManager.RoutePlanListener{
//跳转到导航的过程界面
@Override
public void onJumpToNavigator() {
Intent start=new Intent(Main2Activity.this,NaviActivity.class);
start.putExtra("node",sNode);
startActivity(start);
}
@Override
public void onRoutePlanFailed() {
}
}
//初始化导航监听事件
class MyNaviInitListener implements BaiduNaviManager.NaviInitListener{
@Override
public void onAuthResult(int i, String s) {
}
@Override
public void initStart() {
}
@Override
public void initSuccess() {
}
@Override
public void initFailed() {
}
}
//获取sd卡的路径
public String getSdcardRootPath(){
return Environment.getDownloadCacheDirectory().getAbsolutePath();
}
//获取目录名称
public String getAppFolderName(){
File folder=new File(Environment.getExternalStorageDirectory(),"Emilia");
if(!folder.exists()){
folder.mkdirs();
}
return folder.getAbsolutePath();
}
}
布局文件 activity_main2.xml
<?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=".Main2Activity">
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发起导航"/>
</android.support.constraint.ConstraintLayout>
NaviActivity.java
package com.hala.mapdemo;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.baidu.navisdk.adapter.BNRouteGuideManager;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import java.util.ArrayList;
import java.util.List;
import static com.baidu.navisdk.adapter.BNRouteGuideManager.getInstance;
//导航过程页面
public class NaviActivity extends AppCompatActivity {
private BNRouteGuideManager mBnRouteGuideManager;
private BNRoutePlanNode sNode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBnRouteGuideManager= getInstance();
//设置图层
sNode= (BNRoutePlanNode) this.getIntent().getSerializableExtra("node");
setCustomItem();
View view=mBnRouteGuideManager.onCreate(this,null);
setContentView(view);
}
//设置图层
public void setCustomItem(){
List<BNRouteGuideManager.CustomizedLayerItem> items=new ArrayList<BNRouteGuideManager.CustomizedLayerItem>();
Drawable icon=this.getResources().getDrawable(R.mipmap.ic_launcher);
BNRouteGuideManager.CustomizedLayerItem item=
new BNRouteGuideManager.CustomizedLayerItem(
sNode.getLongitude(), sNode.getLatitude(),
BNRoutePlanNode.CoordinateType.WGS84,
icon,
BNRouteGuideManager.CustomizedLayerItem.ALIGN_CENTER);
items.add(item);
mBnRouteGuideManager.setCustomizedLayerItems(items);
//是否显示自定义图层
mBnRouteGuideManager.showCustomizedLayer(true);
}
@Override
protected void onResume() {
super.onResume();
mBnRouteGuideManager.onResume();
}
@Override
protected void onPause() {
super.onPause();
mBnRouteGuideManager.onPause();
}
@Override
protected void onStop() {
super.onStop();
mBnRouteGuideManager.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
mBnRouteGuideManager.onDestroy();
}
//参数改变时也跟着改变
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mBnRouteGuideManager.onConfigurationChanged(newConfig);
}
}
全景图
activity_main3.xml
<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"
>
<com.baidu.lbsapi.panoramaview.PanoramaView
android:id="@+id/pano"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
MainActivity.java
package com.hala.mapdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.baidu.lbsapi.BMapManager;
import com.baidu.lbsapi.MKGeneralListener;
import com.baidu.lbsapi.panoramaview.ImageMarker;
import com.baidu.lbsapi.panoramaview.PanoramaView;
import com.baidu.lbsapi.tools.Point;
public class Main3Activity extends AppCompatActivity {
private BMapManager manager;
private PanoramaView mPanoramaView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
manager=new BMapManager(getApplicationContext());
manager.init(new MyMKGeneralListener());
mPanoramaView=(PanoramaView) this.findViewById(R.id.pano);
//根据经纬度坐标设置全景图
mPanoramaView.setPanorama(116.400244,39.963175);
//添加标记
ImageMarker icon=new ImageMarker();
icon.setMarker(this.getResources().getDrawable(R.mipmap.ic_launcher));
icon.setMarkerPosition(new Point(116.400244,39.963175));
mPanoramaView.addMarker(icon);
}
class MyMKGeneralListener implements MKGeneralListener {
@Override
public void onGetPermissionState(int states) {
if(states!=300){
Toast.makeText(Main3Activity.this, "授权成功", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(Main3Activity.this, "授权失败", Toast.LENGTH_LONG).show();
}
}
}
@Override
protected void onPause() {
super.onPause();
mPanoramaView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mPanoramaView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mPanoramaView.destroy();
}
}