当前位置:   article > 正文

安卓第三次实验:百度地图的显示与定位_android百度定位rxpermissions

android百度定位rxpermissions

1.实验环境:

Windows系统,Android Studio

2.界面分析:

2.1  地图显示

默认是显示中国北京的天安门广场那里的地图。

2.2  显示定位

 注意:因为Android Studio中的手机为虚拟机,所以在定位的时候会定位到谷歌,而不是我们当前所在的地方。

3.功能实现:(本功能参考博客:Android 百度地图SDK 自动定位、标记定位_晨曦-CSDN博客

3.1. 地图显示:

3.1.1.配置百度地图的AK码

 在这里我们需要在我们的AndroidStudio中获取我们的SHA1码以及PackageName:

 然后就可以生成我们的AK码:

 3.1.2.下载百度地图的SDK

 下载解压后的libs文件夹如下:

可以看到有5个文件夹以及一个名为 BaiduLBS_Android.jar的jar包

 3.1.3.在Android Studio中配置AK码:

还需要配置百度的定位服务。 

3.1.4.在Android Studio中添加相应jar包:

3.1.5.用于显示地图的组件设置:

  1. <com.baidu.mapapi.map.MapView
  2. android:id="@+id/bmapView"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:clickable="true" />

我们只需要在activity_main.xml文件添加该组件即可。

3.1.6.创建一个MapApplication类,继承Application,在onCreate方法中完成SDK的初始化

  1. public class MapApplication extends Application {
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. //在使用SDK各组件之前初始化context信息,传入ApplicationContext
  6. SDKInitializer.initialize(this);
  7. SDKInitializer.setCoordType(CoordType.BD09LL);
  8. }
  9. }

我们在上述AK码的配置中已经在AndroidManifest.xml中声明该application了。

3.1.7.在MainActivity中配置相关方法:

  1. public class MainActivity extends Activity {
  2. private MapView mMapView = null;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. //获取地图控件引用
  8. mMapView = (MapView) findViewById(R.id.bmapView);
  9. }
  10. @Override
  11. protected void onResume() {
  12. super.onResume();
  13. //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
  14. mMapView.onResume();
  15. }
  16. @Override
  17. protected void onPause() {
  18. super.onPause();
  19. //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
  20. mMapView.onPause();
  21. }
  22. @Override
  23. protected void onDestroy() {
  24. super.onDestroy();
  25. //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
  26. mMapView.onDestroy();
  27. }
  28. }

 然后就可以运行程序查看显示的地图了。

3.2. 显示定位:

3.2.1.用于视图初始化的initView方法:

  1. private void initView() {
  2. // 地图初始化
  3. mMapView = (MapView) findViewById(R.id.bmapView);
  4. //回到当前定位
  5. ibLocation = (ImageButton) findViewById(R.id.ib_location);
  6. mMapView.showScaleControl(true); // 设置比例尺是否可见(true 可见/false不可见)
  7. //mMapView.showZoomControls(false); // 设置缩放控件是否可见(true 可见/false不可见)
  8. mMapView.removeViewAt(1);// 删除百度地图Logo
  9. mBaiduMap = mMapView.getMap();
  10. mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
  11. @Override
  12. public boolean onMarkerClick(Marker marker) {
  13. final String info = (String) marker.getExtraInfo().get("info");
  14. Toast.makeText(MainActivity.this, info, Toast.LENGTH_SHORT).show();
  15. return true;
  16. }
  17. });
  18. }

3.2.2.修改onDestroy方法:

  1. @Override
  2. protected void onDestroy() {
  3. super.onDestroy();
  4. // 退出时销毁定位
  5. mLocClient.stop();
  6. // 关闭定位图层
  7. mBaiduMap.setMyLocationEnabled(false);
  8. // 在activity执行onDestroy时必须调用mMapView.onDestroy()
  9. mMapView.onDestroy();
  10. }

3.2.3.定义一个用于实现回到原地的imageButton:

  1. <ImageButton
  2. android:visibility="gone"
  3. android:id="@+id/ib_location"
  4. android:layout_margin="8dp"
  5. android:onClick="resetLocation"
  6. android:layout_alignParentBottom="true"
  7. android:background="@drawable/icon_location"
  8. android:layout_width="40dp"
  9. android:layout_height="40dp"/>

当我们点击该button后,蓝点会回到我们当前所在的地点。 

3.2.4.定义点击地图的方法:

  1. private void mapOnClick() {
  2. // 设置marker图标
  3. bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
  4. mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
  5. @Override
  6. public void onMapPoiClick(MapPoi mapPoi) {
  7. }
  8. //此方法就是点击地图监听
  9. @Override
  10. public void onMapClick(LatLng latLng) {
  11. //获取经纬度
  12. markerLatitude = latLng.latitude;
  13. markerLongitude = latLng.longitude;
  14. //先清除图层
  15. mBaiduMap.clear();
  16. // 定义Maker坐标点
  17. LatLng point = new LatLng(markerLatitude, markerLongitude);
  18. // 构建MarkerOption,用于在地图上添加Marker
  19. MarkerOptions options = new MarkerOptions().position(point)
  20. .icon(bitmap);
  21. // 在地图上添加Marker,并显示
  22. //mBaiduMap.addOverlay(options);
  23. marker = (Marker) mBaiduMap.addOverlay(options);
  24. Bundle bundle = new Bundle();
  25. bundle.putSerializable("info", "纬度:" + markerLatitude + " 经度:" + markerLongitude);
  26. marker.setExtraInfo(bundle);//将bundle值传入marker中,给baiduMap设置监听时可以得到它
  27. //点击地图之后重新定位
  28. initLocation();
  29. }
  30. });
  31. }

在该方法中我们设置了蓝点的移动以及标点的出现,我们点击标点即可获得当前点的经纬度。

3.2.5.定位初始化initLocation方法:

  1. public void initLocation() {
  2. // 开启定位图层
  3. mBaiduMap.setMyLocationEnabled(true);
  4. // 定位初始化
  5. mLocClient = new LocationClient(this);
  6. MyLocationListener myListener = new MyLocationListener();
  7. mLocClient.registerLocationListener(myListener);
  8. LocationClientOption option = new LocationClientOption();
  9. option.setOpenGps(true);// 打开gps
  10. option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置高精度定位
  11. option.setCoorType("bd09ll");
  12. option.setScanSpan(0);
  13. option.setIsNeedAddress(true);
  14. option.setOpenGps(true);
  15. option.setIsNeedLocationDescribe(true);
  16. option.setIsNeedLocationPoiList(true);
  17. option.setIgnoreKillProcess(false);
  18. option.SetIgnoreCacheException(false);
  19. option.setEnableSimulateGps(false);
  20. mLocClient.setLocOption(option);
  21. mLocClient.start();//开始定位
  22. }

这是初始化蓝点位置的方法。

 3.2.6.定义监听函数MyLocationListener:

  1. public class MyLocationListener implements BDLocationListener {
  2. @Override
  3. public void onReceiveLocation(BDLocation location) {
  4. Toast.makeText(MainActivity.this,location.getAddrStr(),Toast.LENGTH_SHORT).show();
  5. // MapView 销毁后不在处理新接收的位置
  6. if (location == null || mMapView == null) {
  7. return;
  8. }
  9. double resultLatitude;
  10. double resultLongitude;
  11. if (markerLatitude == 0) {//自动定位
  12. resultLatitude = location.getLatitude();
  13. resultLongitude = location.getLongitude();
  14. ibLocation.setVisibility(View.GONE);
  15. } else {//标点定位
  16. resultLatitude = markerLatitude;
  17. resultLongitude = markerLongitude;
  18. ibLocation.setVisibility(View.VISIBLE);
  19. }
  20. MyLocationData locData = new MyLocationData.Builder()
  21. .accuracy(location.getRadius())// 设置定位数据的精度信息,单位:米
  22. .direction(location.getDirection()) // 此处设置开发者获取到的方向信息,顺时针0-360
  23. .latitude(resultLatitude)
  24. .longitude(resultLongitude)
  25. .build();
  26. mBaiduMap.setMyLocationData(locData);// 设置定位数据, 只有先允许定位图层后设置数据才会生效
  27. LatLng latLng = new LatLng(resultLatitude, resultLongitude);
  28. MapStatus.Builder builder = new MapStatus.Builder();
  29. builder.target(latLng).zoom(20.0f);
  30. mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
  31. }
  32. }

 在该方法中我们首先会判断当前蓝点经纬度是否为null,不是则使用默认的值,然后每次点击地图后,就会重新更新其经纬度。而如果当前位置并未我们的原位置,左下角的定位到原位的imageButton就会显示出来,接下来就是定义该imageButton点击后实现的逻辑。

3.2.7.imageButton的点击方法:

  1. public void resetLocation(View view) {
  2. markerLatitude = 0;
  3. initLocation();
  4. marker.remove();//清除标点
  5. }

我们点击该按钮后,就会重新回到原点,并且该左下角的按钮消失。

3.2.8.在oncreate方法中使用这些方法:

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. initView();//视图初始化
  5. checkVersion();//检查版本
  6. mapOnClick();//地图点击
  7. }

3.2.9.运行程序后会发现定位在几内亚湾附近,需要进行以下修改:

在app的build.gralde中的android闭包下增加如下jdk1.8的使用代码

  1. compileOptions {
  2. sourceCompatibility = 1.8
  3. targetCompatibility = 1.8
  4. }

然后在dependencies闭包下增加如下依赖

  1. //动态权限请求
  2. implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
  3. implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
  4. implementation "io.reactivex.rxjava2:rxjava:2.0.0"

 

新增检查权限的方法:

  1. private void checkVersion() {
  2. if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
  3. RxPermissions rxPermissions = new RxPermissions(this);
  4. rxPermissions.request(Manifest.permission.ACCESS_COARSE_LOCATION,
  5. Manifest.permission.ACCESS_FINE_LOCATION,
  6. Manifest.permission.READ_PHONE_STATE,
  7. Manifest.permission.WRITE_EXTERNAL_STORAGE)
  8. .subscribe(granted -> {
  9. if (granted) {//申请成功
  10. //发起连续定位请求
  11. initLocation();// 定位初始化
  12. } else {//申请失败
  13. Toast.makeText(MainActivity.this,"权限未开启",Toast.LENGTH_SHORT).show();
  14. }
  15. });
  16. }else {
  17. initLocation();// 定位初始化
  18. }
  19. }

 

然后我们就发现可以成功定位了,虽然是在谷歌。。。但是定位也是成功了,毕竟这是因为虚拟机的原因。

 4.实验小结:

本次实验在老师的带领下完成了地图显示的功能,然后通过网上搜索以及查看官方文档完成了显示当前定位的功能。本次实验学习了百度地图在安卓中的部分功能的使用,而且加强了自己独自学习以及完成指定任务的能力。

点击查看源码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/297535
推荐阅读
相关标签
  

闽ICP备14008679号