一、实验目的

写一个使用LBS的APP,能显示你目前所在地址(经纬度,国家 省市 街道),并能实时显示你位置的移动。

二、实验内容

开发一个LBS的APP,具备以下功能:
1、基于百度开发LBS的APP
2、显示你目前所在地址
3、实时显示你位置的移动

三、实验要求

(1)每位同学独立设计软件功能、完成软件的开发与测试。
(2)每位同学独立完成实验报告(根据模板),并提交至网络课堂。

四、数据代码及运行结果截图

前期准备
申请API

生成jks文件,获取密钥

主要代码
显示部分的代码即mainactivity部分:

package com.example.lbstest;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = new Intent(MainActivity.this,PositionAcitivity.class);startActivity(intent);}
}
用于定位的模块代码:
package com.example.lbstest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
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.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
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 java.util.ArrayList;
import java.util.List;
public class PositionAcitivity extends AppCompatActivity {public LocationClient locationClient;private TextView position;private MapView mapView;private BaiduMap baiduMap;//百度地图的控制器private boolean isFirstLocation = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplicationContext());//很重要的一段代码setContentView(R.layout.activity_position_acitivity);//baiduMap的客户端locationClient = new LocationClient(getApplicationContext());locationClient.registerLocationListener(new MyLocationListener());position = findViewById(R.id.textView_position);mapView = findViewById(R.id.baiduMap);mapView.onCreate(getApplicationContext(),savedInstanceState);//获取百度地图的控制器baiduMap = mapView.getMap();baiduMap.setMyLocationEnabled(true);//可以显示当前位置//权限验证List<String> permissionList = new ArrayList<>();if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.READ_PHONE_STATE);}if (ContextCompat.checkSelfPermission(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(this, permissions, 1);} else {requestLocation();}}private void requestLocation() {initLocation();locationClient.start();}//这个是满足移动的时候更新locationprivate void initLocation() {LocationClientOption option = new LocationClientOption();option.setScanSpan(5000);option.setIsNeedAddress(true);//具体的地址locationClient.setLocOption(option);}//onResume@Overrideprotected void onResume() {super.onResume();mapView.onResume();}//pause@Overrideprotected void onPause() {super.onPause();mapView.onPause();}//关闭@Overrideprotected void onDestroy() {super.onDestroy();locationClient.stop();mapView.onDestroy();baiduMap.setMyLocationEnabled(false);}//监听器public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {//定位到我自己if(location.getLocType() == BDLocation.TypeGpsLocation ||location.getLocType() == BDLocation.TypeNetWorkLocation){navigateTo(location);}if (location.getCity() == null)return;//text View的展示地址StringBuilder currentPosition = new StringBuilder();currentPosition.append("纬度:").append(location.getLatitude()).append(" ");currentPosition.append("经线:").append(location.getLongitude()).append("\n");currentPosition.append("国家:").append(location.getCountry()).append(" ");currentPosition.append("省:").append(location.getProvince()).append("\n");currentPosition.append("市:").append(location.getCity()).append(" ");currentPosition.append("区:").append(location.getDistrict()).append(" ");currentPosition.append("街道:").append(location.getStreet()).append(" ");currentPosition.append("定位方式:");if (location.getLocType() == BDLocation.TypeGpsLocation) {currentPosition.append("GPS");} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {currentPosition.append("网络");}position.setText(currentPosition);}}//实现定位效果private void navigateTo(BDLocation location) {if(isFirstLocation){Toast.makeText(this, "当前位置: " + location.getAddrStr(), Toast.LENGTH_SHORT).show();LatLng ll= new LatLng(location.getLatitude(),location.getLongitude());MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);baiduMap.animateMapStatus(update);update = MapStatusUpdateFactory.zoomTo(16f);//地图放大baiduMap.animateMapStatus(update);isFirstLocation = false;}//实现光标显示我的位置MyLocationData.Builder builder = new MyLocationData.Builder();builder.latitude(location.getLatitude());builder.longitude(location.getLongitude());MyLocationData data = builder.build();baiduMap.setMyLocationData(data);}
}

运行截图如下

五、错误总结

如图显示NULL 百度定位API只给了几秒的时间记录信息,不能随时更新定位,因此当检测到NULL时直接返回即可

public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {//定位到我自己if(location.getLocType() == BDLocation.TypeGpsLocation ||location.getLocType() == BDLocation.TypeNetWorkLocation){navigateTo(location);}if (location.getCity() == null)return;//text View的展示地址StringBuilder currentPosition = new StringBuilder();currentPosition.append("纬度:").append(location.getLatitude()).append(" ");currentPosition.append("经线:").append(location.getLongitude()).append("\n");currentPosition.append("国家:").append(location.getCountry()).append(" ");if (location.getLocType() == BDLocation.TypeGpsLocation) {currentPosition.append("GPS");} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {currentPosition.append("网络");}position.setText(currentPosition);}}

六、个人心得体会

Hello BaiduMap
百度地图SDK为开发者提供了便捷的使用百度地图能力的接口,通过以下几步操作,即可在应用中使用百度地图:
1第一步 配置AndroidManifest.xml文件
1.在中加入如下代码配置开发密钥(AK):

<application>  <meta-data  android:name="com.baidu.lbsapi.API_KEY"  android:value="开发者 key" />
</application>

若您还不曾申请开发密钥,点此申请
2. 在外部添加如下权限声明:

<!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,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" />

注:自Android6.0起部分权限的使用需要开发者在代码中动态申请。
2第二步 在布局文件中添加地图容器
MapView是View的一个子类,用于在Android View中放置地图。MapView的使用方法与Android提供的其他View一样。

<com.baidu.mapapi.map.MapView  android:id="@+id/bmapView"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:clickable="true" />

3第三步 地图初始化
注意:在SDK各功能组件使用之前都需要调用“SDKInitializer.initialize(getApplicationContext())”,因此建议在应用创建时初始化SDK引用的Context为全局变量。
新建一个自定义的Application,在其onCreate方法中完成SDK的初始化。示例代码如下:

public class DemoApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//在使用SDK各组件之前初始化context信息,传入ApplicationContext   SDKInitializer.initialize(this);//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。SDKInitializer.setCoordType(CoordType.BD09LL);}
}

在AndroidManifest.xml文件中声明该Application

4创建地图Activity,管理MapView生命周期
注意:在项目中使用地图的时候要特别注意合理地管理地图生命周期,这非常重要。
以下示例代码简述对地图生命周期的管理:

public class MainActivity extends Activity {  private MapView mMapView = null;  @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();  }
}

完成以上工作即可在您的应用中显示地图:

通过添加View显示地图

百度地图SDK支持不用通过layout文件中添加MapView控件,直接在Java代码中添加MapView的方式来展示地图,示例如下:
1创建MapView对象

MapView mapView = new MapView(this);

2添加MapView对象

setContentView(mapView);

另外,在Java代码中添加MapView的方式支持通过BaiduMapOptions对象根据需求构造包含特定地图状态类型和控件显示状态的MapView对象。示例如下:
1定义BaiduMapOptions对象

BaiduMapOptions options = new BaiduMapOptions();

2设置需要的状态
//设置地图模式为卫星地图

options.mapType(BaiduMap.MAP_TYPE_SATELLITE);

3创建MapView对象

MapView mapView = new MapView(this, options);

4添加MapView对象

setContentView(mapView);

可以通过如下代码设置地图的缩放级别:

MapStatus.Builder builder = new MapStatus.Builder();
builder.zoom(18.0f);
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));

常用地图容器

地图SDK底层运用两种GLSurfaceView和TextureView两种OpenGL ES组件构建地图。下面简要介绍。GLSurfaceView包括MapView,MapFragment和SupportMapFragment三种容器。MapFragment和SupportMapFragment用于在Android Fragment中放置地图。适合需要使用Fragment的开发场景,方便您实现灵活的布局。MapFragment和SupportMapFragment分别是android.app.Fragment和android.support.v4.app,Fragment的子类,MapFragment需要在android3.0以上的版本中使用。

TextureView
包括TexureMapView,TextureMapFragment和TextureSupportMapFragment三种容器。使用场景:您将MapView与其他的GLSurfaceView(比如相机)叠加展示,或者是在ScrollView中加载地图时,建议使用TextureMapView及SupportTextureMapFragment来展示地图,可以有效解决 GLSurfaceView 叠加时出现的穿透、滚动黑屏等问题。如果使用TextureMapView请确保:Android 4.4以上系统,在AndroidManifest.xml中配置硬件加速选项。
SupportMapFragment
此处示例代码简要介绍SupportMapFragment使用。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fragment);manager = getSupportFragmentManager();//获取到SupportMapFragment实例mSupportMapFragment = SupportMapFragment.newInstance(mapOptions);//将fragment添加至Activitymanager.beginTransaction().add(R.id.map_container, mapFragment).commit();
}

另外,您也可以使用replace的方法替换已有的fragment。
manager.beginTransaction().replace(R.id.map_container, mapFragment).commit();
多实例显示地图
开发者可以在一个页面中建立多个地图对象,并且针对这些对象分别操作且不会产生相互干扰。 示例代码:在布局文件中添加多个SupportMapFragment

<fragmentandroid:id="@+id/map1"android:layout_width="match_parent"android:layout_height="0dp"android:layout_margin="5dp"android:layout_weight="1"class="com.baidu.mapapi.map.SupportMapFragment" />
<fragmentandroid:id="@+id/map2"android:layout_width="match_parent"android:layout_height="0dp"android:layout_margin="5dp"android:layout_weight="1"class="com.baidu.mapapi.map.SupportMapFragment" />
在Activity中管理地图容器
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_multi_map_demo);LatLng GEO_BEIJING = new LatLng(39.945, 116.404);LatLng GEO_SHANGHAI = new LatLng(31.227, 121.481);//北京为地图中心,logo在左上角MapStatusUpdate status1 = MapStatusUpdateFactory.newLatLng(GEO_BEIJING);SupportMapFragment map1 = (SupportMapFragment) (getSupportFragmentManager().findFragmentById(R.id.map1));map1.getBaiduMap().setMapStatus(status1);map1.getMapView().setLogoPosition(LogoPosition.logoPostionleftTop);//上海为地图中心MapStatusUpdate status2 = MapStatusUpdateFactory.newLatLng(GEO_SHANGHAI);SupportMapFragment map2 = (SupportMapFragment) (getSupportFragmentManager().findFragmentById(R.id.map2));map2.getBaiduMap().setMapStatus(status2);
}

效果如图:

代码见我发布的资源

安卓-LBS地图显示相关推荐

  1. Android BLE开发 百度地图 大神博客简书传送门合集

    一.踩坑 踩坑1: 问题Q:方法报错.标红.Android Studio提示必须添加权限检查. 解决S:不用管,一样能够正常运行! 踩坑2: 问题Q:权限报错.标红.提示必须是系统应用才可以使用. 解 ...

  2. 安卓学习专栏——百度地图(1)获取SHA1指纹申请百度地图API Key使用百度LBS定位功能(图文保姆级)

    步骤 系列文章 前言 1.前期准备 2.创建应用 3.获取发布版SHA1和开发版SHA1 3.1找到.android文件夹位置 3.2Android Studio的Terminal中cd路径 3.3输 ...

  3. 摩拜单车地图显示的红点是什么,安卓模仿膜拜单车地图显示的功能

    这是效果的视频 https://pan.baidu.com/s/1c2IVmRA 百度地图版本4.0.0 首先是定位,定位成功后再添加一个这样的点 添加方式 val shopList = arrayL ...

  4. Android 高德地图显示国外地图,安卓地图只显示高德地图四个字

    观察logcat 的日志 发现 Could not find generated setter for class cn.qiuxiang.react.amap3d.maps.AMapViewMana ...

  5. 安卓学习专栏——百度地图(6)移动到我的位置(图文+代码)

    步骤 系列文章 前言 介绍api 实现效果 activity_main.xml AndroidManifest.xml MainActivity.java(修改) 附录.参考资料 下载资源 总结 系列 ...

  6. 定位技术GPS/A-GPS/LBS/WIFI定位介绍

    定位技术GPS/A-GPS/LBS/WIFI定位介绍 来源:本站整理 作者:08LR.CN 更新时间:2013年05月03日人气:本日:9 本周:19 本月:34 总数:2134 次 生活中,我们经常 ...

  7. 赛门铁克卸载工具_神奇的安卓恶意软件 xHelper:自卸载且无法删除

    聚焦源代码安全,网罗国内外最新资讯!编译:奇安信代码卫士团队赛门铁克表示,近半年来出现的一款安卓恶意软件 xHelper迄今为止已经感染了4.5万台安卓设备.由于它具有自卸载机制,因此几乎不可能被删除 ...

  8. LBS突围:从微信到微博

    2010年起,在Foursquare等国外LBS网站成功试水的示范带动下,中国兴起了一股LBS热潮,一时间涌现的LBS公司多达三十家,2011年上半年,国内的LBS公司一度多达五六十家.然而,进入20 ...

  9. 安卓世界微观搏杀激烈,网易云信教你存活绝招

    安卓世界的竞争一向是异常激烈的.根据Talkingdata最新的2016年9月监测数据,中国现有移动智能终端41亿多部,其中70%是安卓设备.而早在2012年的时候,全球安卓APP应用商店里的APP数 ...

  10. 没有它,我们寸步难行——LBS的渊源与实践

    LBS简史 LBS是互联网的基础设施,几乎每个互联网巨头都投入大量的资源来开发它,我们的生活才得以这么便利.或者说,正是它如此常用,就像水电空气,我们对它们几乎毫无感知,却又处处使用着它.很多时候,我 ...

最新文章

  1. CNN如何识别一幅图像中的物体
  2. 机器学习入门需要多久
  3. Penang Industrial Zone
  4. jenkins自动化打包部署,jenkins执行sh脚本不退出问题
  5. Linux关于文件的权限笔记
  6. kaggle房价预测特征意思_Kaggle竞赛丨房价预测(House Prices)
  7. 衡量文章词汇复杂度Type Token Ratio (TTR)
  8. SPI、I2C、I2S
  9. OrCAD Library Builder使用
  10. 《腾讯产品启示录》学习笔记
  11. mysql更新数据的语句怎么写_mysql更新数据库语句怎么写?mysql更新字段语句
  12. 数据库导入导出的几种方式
  13. VMware5.5-VMware补丁程序VUM
  14. *1179 筛选素数
  15. 基于Spring Boot的微生活的设计与实现
  16. emp和emn是什么文件,emnemp是什么文件
  17. 我用 PyTorch 复现了 LeNet-5 神经网络(MNIST 手写数据集篇)!
  18. Time Series FeatuRe Extraction on basis of Scalable Hypothesis tests (tsfresh –A Python package)
  19. 为什么燕子鸟纹身是如此出名
  20. 仲辛醇/水体系的界面现象——Lammps与Gromacs计算结果对比

热门文章

  1. 2019年北航、南大、东南、上科大及本校计算机系保研
  2. 2021-2027全球与中国Al2O3氧化铝陶瓷基板白板市场现状及未来发展趋势
  3. unit10-Cookie、Session
  4. 计算机毕业设计springboot+vue基本微信小程序的考试系统
  5. 双目摄像头相关参数介绍
  6. 小技巧:机械键盘使用技巧
  7. 交换机 Port-Channel(端口汇聚)的 配置
  8. 计算机教师教育笔记,信息技术教师教育随笔
  9. 平时使用计算机时有哪些不安全的做法,KVM设备在使用时都有哪些安全隐患?
  10. 计算机无法识别银行usb是,电脑不能识别USB设备(加密设备、网银U盾等)的解决方法...