Android百度地图显示+抽屉式侧边栏
- App介绍
- 主要代码部分
- 完整项目下载
- 注意事项
App介绍
之前学安卓时候做了一个百度地图定位app。
功能有:显示地图,侧面抽屉布局,悬浮按钮点位点击能回到自己位置,标题栏控件,GPS和网络定位,权限管理等等。
真机测试图
==================================================
后续:加了一些功能:POI检索,周边搜索,搜索框条件搜索,中心标记地点等等功能。
下面是进阶版
主要代码部分
主程序 MainActivity
package com.example.lbstest;import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ZoomControls;import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;import java.util.ArrayList;
import java.util.List;
import static com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING;
import static com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL;public class MainActivity extends AppCompatActivity {private TextView positionText;//经纬度等信息显示private boolean isVisibility_flag = false;//控制是否显示经纬度private LocationClient mLocationClient;//定位客户端private MapView mapView;//地图显示private BaiduMap baiduMap;//地图总控制器private boolean isFirstLocate = true;//控制第一次经纬度显示次数private FloatingActionButton Map_but;private Toolbar toolbar;//标题栏private DrawerLayout drawerLayout;//抽屉式布局@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mLocationClient = new LocationClient(getApplicationContext());//注册位置监听器 , 当获取到位置信息时候,会回调mLocationClient.registerLocationListener(new MyLocationListener());//初始化:一定要在setContentView之前用SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);positionText = findViewById(R.id.position_text_view);mapView = findViewById(R.id.bmapView);Map_but =findViewById(R.id.Map_but);//浮选按钮baiduMap = mapView.getMap();baiduMap.setMyLocationEnabled(true);//开启 我 在地图上显示的功能toolbar = findViewById(R.id.toolbar);drawerLayout = findViewById(R.id.drawer_layout);NavigationView navigationView = findViewById(R.id.nav_view);setSupportActionBar(toolbar);//设置好自定义的标题栏//下面几列是布局ActionBar actionBar = getSupportActionBar();//标题栏if (actionBar!=null){actionBar.setDisplayHomeAsUpEnabled(true);//让导航栏显示出来actionBar.setHomeAsUpIndicator(R.drawable.daohanglan);//设置导航栏按钮}navigationView.setCheckedItem(R.id.nav_daohang);//设置为默认选中navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {//处理逻辑drawerLayout.closeDrawers();//关闭抽屉return true;}});//由于android 6.0运行时权限,所以要加上动态申请权限的代码,其中有三个属于危险权限,我们需要一次性申请三个权限//这里我们用到一个做法,首先创建一个空的List集合,然后判断这3个权限是否被授权,如果没有被授权就添加到集合中,如果已经授权则不添加List<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_DENIED) {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);}//然后判断List里是否有对象,有则代表需要动态申请权限if (!permissionList.isEmpty()) {//集合不为空则代表有需要申请的危险权限//调用toArray()方法将List转换成数组,然后传入到ActivityCompat.requestPermissions()一次性全部去申请String[] perimissions = permissionList.toArray(new String[permissionList.size()]);ActivityCompat.requestPermissions(MainActivity.this,perimissions,1);}else requestLocation();}private void requestLocation(){initLocation();mLocationClient.start();}/*位置管理选择*/private void initLocation() {LocationClientOption option = new LocationClientOption();//定位客户端选项类option.setScanSpan(2000);//设置2秒钟更新一次数据//High_Accuracy :表示高精度模式,在GPS信号正常的情况下优先使用GPS,在无法接收GPS的时候使用网络定位,一般手机默认就是这种模式//Battery_Saving :表示节电模式,只会使用网络定位//Device_Sensors :表示传感器模式,只会使用GPS定位option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);option.setIsNeedAddress(true);//详细的位置信息option.setCoorType("bd09ll");//设置的是百度的定位标准mLocationClient.setLocOption(option);}@Override//只有权限全部允许才能运行//第一是请求的id,第二个是请求具体的权限,第三个是请求的结果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(MainActivity.this,"权限未全部通过",Toast.LENGTH_SHORT);finish();return;}}requestLocation();}else {Toast.makeText(MainActivity.this,"未发生未知错误",Toast.LENGTH_SHORT);finish();}break;default:break;}}/*监听线程,获得当前的经纬度,并显示*/public class MyLocationListener extends BDAbstractLocationListener {@Overridepublic void onReceiveLocation(final BDLocation location) {runOnUiThread(new Runnable() {@Overridepublic void run() {if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) {if (location.getLocType() == BDLocation.TypeGpsLocation) {positionText.setText(" Location Type : GPS "+"\n Longitude : "+location.getLongitude()+"\n Latitude : "+location.getLatitude()+"\n Developer : KaiKai-G");}else positionText.setText(" Location Type : Network "+"\n Longitude : "+location.getLongitude()+"\n Latitude : "+location.getLatitude()+"\n Developer : KaiKai-G");navigateTo(location);}//按锁定自己位置按钮改变isFirslLocate可以再次回到地图Map_but.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {isFirstLocate = true;}});//隐藏百度logoView child = mapView.getChildAt(1);if (child != null && (child instanceof ImageView || child instanceof ZoomControls)) {child.setVisibility(View.INVISIBLE);}}});}}private void navigateTo(BDLocation location){//封装地点信息和我的信息, 并把信息传到地图显示if(isFirstLocate){//防止多次调用,这个方法只需要调用一次 地图移动到我们当前位置LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());//传入纬度(第一个参数)和经度MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);baiduMap.animateMapStatus(update);update =MapStatusUpdateFactory.zoomTo(17f);//缩放 3-19之间选择值越大越清晰baiduMap.animateMapStatus(update);isFirstLocate = false;}MyLocationData locData = new MyLocationData.Builder()//获取半径.accuracy(location.getRadius())// 此处设置开发者获取到的方向信息,顺时针0-360.direction(location.getDirection()).latitude(location.getLatitude()).longitude(location.getLongitude()).build();baiduMap.setMyLocationData(locData);//定位模式、是否开启方向、设置自定义定位图标、精度圈填充颜色以及精度圈边框颜色5个属性。//地图SDK支持三种定位模式:NORMAL(普通态), FOLLOWING(跟随态), COMPASS(罗盘态)BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.location);MyLocationConfiguration myLocationConfiguration =new MyLocationConfiguration(NORMAL,true,mCurrentMarker,0x3290A4F7,0xAA212101);baiduMap.setMyLocationConfiguration(myLocationConfiguration);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//加载toolbar这个菜单文件getMenuInflater().inflate(R.menu.toolbar,menu);return true;}@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {//menu上面的item按键具体实现switch (item.getItemId()){case R.id.backup:if (isVisibility_flag){positionText.setVisibility(View.VISIBLE);//显示经纬度信息Toast.makeText(this,"显示信息",Toast.LENGTH_SHORT).show();isVisibility_flag = false;}else{positionText.setVisibility(View.GONE);//隐藏经纬度信息isVisibility_flag = true;}break;case R.id.delete:Toast.makeText(this,"清除",Toast.LENGTH_SHORT).show();break;case R.id.settings:Toast.makeText(this,"you clicked settings",Toast.LENGTH_SHORT).show();break;case android.R.id.home://注意 前面加android 而且导航栏按钮 id 一直是android.R.id.homedrawerLayout.openDrawer(GravityCompat.START);//打开向Start滑动的菜单}return true;}public void onConnectHotSpotMessage(String s, int i) {}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onDestroy(){super.onDestroy();mLocationClient.stop();mapView.onDestroy();baiduMap.setMyLocationEnabled(false);}
}
布局:activity_main
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"/><!--clickable true可点击--><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="70dp"android:background="#F0494950"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /><!--them 设置的是单独Tooolbar这个控件为深色,其他元素:比如他上边的字为浅色popupTheme Toolbar内如果有按键,为了防止是深色主题 就设置弹出来的菜单是淡色(和原本主题颜色一样)--></FrameLayout><TextViewandroid:id="@+id/position_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/colorPrimary"android:layout_marginTop="70dp"/><!--visibility="gone" 隐藏TextView--><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/Map_but"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="530dp"android:layout_marginRight="16dp"android:layout_alignParentRight="true"android:src="@drawable/temg"android:elevation="8dp"app:maxImageSize="30dp"/><!--floatingActionButton浮选按钮 elevation 悬浮的阴影大小fabSize设置圆圈背景大小 maxImageSize 设置圈内图片大小--></RelativeLayout><com.google.android.material.navigation.NavigationViewandroid:id="@+id/nav_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="start"app:menu="@menu/nav_menu"app:headerLayout="@layout/nav_header"/></androidx.drawerlayout.widget.DrawerLayout>
侧面抽屉布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="180dp"android:padding="10dp"android:background="@drawable/yueqiu"><de.hdodenhof.circleimageview.CircleImageViewandroid:layout_width="70dp"android:layout_height="70dp"android:src="@drawable/kai"android:layout_centerInParent="true"/><TextViewandroid:id="@+id/user"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Test User:KaiKai_G"android:textColor="#FBFBFB"android:layout_alignParentBottom="true"android:layout_centerInParent="true"/></RelativeLayout>
设置主题和浮选按钮的样式。
styles.xml
<resources><!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">#C3EDE9</item></style><stylename ="nav_menus_style"><item name="android:textSize">30sp</item></style><dimen name="design_fab_size_normal">45dp</dimen><!--设置 浮选按钮背景的大小-->
</resources>
完整项目下载
还有一些需要的jar包,权限设置,菜单栏等等完整的项目都放到了:GitHub,这只是普通的后续添加的功能我还没上传。
注意事项
jar 包和其他几个so文件的位置
需要在这个文件里写明
百度地图的key每一个项目都对应不同的key
所以需要去百度地图开发者平台申请key,不然无法正常使用地图
SHA1两个都需要填写
第一个发布版需要先将项目进行apk打包,生成秘钥库,然后通过秘钥库才能得到SHA1.
keytool -list -v -keystore D:\Android_Studio\miyaoku_jks\Crms.jks
密码是自己打包时候定义的。
SHA1开发板 的需要在sdk的.android 目录下找到.debug.keystore文件再输入
keytool -list -v -keystore debug.keystore
然后密码是 android
Android百度地图显示+抽屉式侧边栏相关推荐
- Android百度地图显示POI
android 百度地图描绘POI 2012-10-17 10:02:54 我来说两句 作者:jj120522 收藏 我要投稿 首先还是一贯作风,请大家先看一些图例: 在 ...
- Android百度地图显示附近的位置
效果如下图所示,可以使用手滑动上面的地图进行位置刷新, 主要实现思路是去掉原始的地图导航图层,再MapView的正中间放一张图片,给MapView添加手滑动地图的事件进行添加,再获取MapView的中 ...
- android百度地图显示某个地区,百度地图api只显示某个省市的行政区域
有些时候我们只需要某个省份的行政区域,那么运用百度地图如何实现呢? 我们先上效果图: 步骤: 创建map实例 var map; createMap() { map = new BMap.Map('ma ...
- Android百度地图显示空白(只有格子)的具体真实解决方法
现象 如图 在申请的时候 下一步 最后一步,在 AndroidManifest.xml 中 ** 最后这两个key 必须一样. 经验.不行的话 多申请几次.吼吼 **就可以显示出地图啦!!! 上图
- Android 百度地图显示定位小蓝点
这个问题肯定苦恼了很多人,那就直入主题吧.首先要保证一点你申请得AK是有效的! 1. 2. 2的代码是放在 MyLocationListener的作用就是用于接收定位返回的结果,定结果进行解析的地方. ...
- android百度开发显示多个点标记,android百度地图显示多个自定义标记
一.配置相关参数 配置定位SDK参数 private int span = 5000; private void initLocationSDK() { LocationClientOption op ...
- Android 百度地图位置显示和标记
工程源码:安卓android百度地图SDKGPS位置获取位置地图显示-Android文档类资源-CSDN下载 1 首先注册百度账号,申请AK 2 下载SDK 3 Android studio 新建工程 ...
- Android百度地图开发入门教程
Android百度地图开发入门教程 1.平台注册登录 2.创建应用 3.Android studio配置 4.代码编写 5.最终效果(建议真机) 1.平台注册登录 登录百度地图开放平台网站注册并登录 ...
- Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1...
Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1 首页 代码 文档 问答 资讯 经验 Gi ...
- [android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题
前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Intere ...
最新文章
- SpringBoot 2.3 新特性之优雅停机,这波操作太秀了!
- mysql linux 客户端_MySQL—Linux查看客户端连接信息(连接数、进程等)
- Linux服务器时间同步那些事
- Aspose.Cells基础使用方法整理
- django判断ajax,Django ajax 检测用户名是否已
- 记录隐藏ubuntu桌面图标
- 微信小程序demo测试实践
- 威纶通触摸屏做主站(客户端)与modsim虚拟从站通过MODBUS TCP/IP通讯测试
- [转载]2012 年 4 月,水王排行榜
- 五、神奇的自然常数e之“自然”魅力
- AutoCAD Civil 3D 介绍
- vue+videojs视频播放、视频切换、视频断点分段上传
- 正点原子stm32F407学习笔记4——按键输入实验
- C++左移<<运算符详解
- JS 中常见的转义字符串
- VMM实践:当虚拟化遇到虚拟机
- TCP/IP网络协议详解
- 【单调队列优化DP】烽火传递 LibreOJ - 10180
- Printing 1 to 1000 without loop or conditionals
- 关于国土空间交通专项规划体系框架与编制要点的思考
热门文章
- VMWare VMNet 8 的配置使用
- TP5源码分析-执行应用【initialize方法分析】
- 如何用python爬取股票数据选股_用python爬取股票数据
- 程序设计c语言高速公路收费标准,高速公路收费系统c语言课程设计报告分解.docx...
- java高速公路收费管理计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
- 计算机网络实验4 — 网线制作
- 网络数据爬取实例教程
- 不是“饭饭之交”! 李彦宏丁磊CP乌镇神同步
- 神经网络分类效果评价——多元分类交叉熵
- Python四大神兽(迭代器生成器闭包装饰器)