zoukankan      html  css  js  c++  java
  • [android学习]__使用百度地图开放api编写地图定位app

    • 前言

    在前面我已经记录关于如何使用百度地图api,以及如何配置相关的androidstudio配置了,接下来将记录如何使用百度地图api开发简单的地图定位apk,我将决定不定期持续更新本篇笔记,在每个大的优化改动后.


    • 1.0 简单的地图显示以及定位

    首先我们打开对应的application项目(我们在之前申请百度地图ak密钥所对应的项目).如果你并没有,你可以新建一个项目,并申请ak密钥,然后将下载好的地图SDK导入,编写相关的配置.

    这些都可以参看其开发文档:

    百度地图SDK开发文档

    当然,里面也有比较详细api的使用案例和说明,我们可以参考其案例和说明编写程序.

    • 配置开发密钥ak
      我们在项目的配置文件AndroidManifest.xml文件中添加以下代码配置:
    <application>  
        <meta-data  
            android:name="com.baidu.lbsapi.API_KEY"  
            android:value="开发者 key" />  
    </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" />
    //允许sd卡写权限,需写入地图数据,禁用后无法显示地图
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    //这个权限用于进行网络定位
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    //这个权限用于访问GPS定位
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    //获取统计数据
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    //使用步行AR导航,配置Camera权限
    <uses-permission android:name="android.permission.CAMERA" />
    //程序在手机屏幕关闭后后台进程仍然运行
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    
    • 地图初始化

    新建application类初始化地图

    public class demoApplication 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);
        }
    }
    

    并在配置文件AndroidManifest.xml文件中声明:

    <application
            android:name=".demoApplication"
    

    • 布局文件

    添加两个控制显示地图类型的单选button控件,两个控制可重复显示的地图类型的checkBox复选框控件.以及添加百度地图的MapView容器.声明id便于在后面设置事件监听器.

    <?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=".MainActivity">
                <RadioGroup
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    >
                <RadioButton
                    android:id="@+id/Rbtn_1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="普通图"
                    android:layout_marginLeft="10dp"/>
                <RadioButton
                    android:id="@+id/Rbtn_2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:text="卫星图"/>
    
                    <CheckBox
                        android:id="@+id/cb_1"
                        android:orientation="horizontal"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:text="路况图"
                        />
                    <CheckBox
                        android:id="@+id/cb_2"
                        android:orientation="horizontal"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:text="城市热力图"
                        />
                </RadioGroup>
        <com.baidu.mapapi.map.MapView
            android:id="@+id/mMapView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true"
            ></com.baidu.mapapi.map.MapView>
    
    </LinearLayout>
    

    • activity文件

    定义initView方法初始化地图,在方法体类为几个button,checkbox设置监听器,并实现其功能将当前地图类型切换.

    定义定义监听函数,通过百度定位SDK中相应的方法实现简单的地图定位功能.
    具体的方法使用,参考api开发文档.里面有较详细的说明和案例

    package cn.gemuxiaoshe.gpsapplication;
    
    import android.Manifest;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.support.v4.app.ActivityCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.Window;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    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.SDKInitializer;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.MapStatus;
    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 MainActivity extends AppCompatActivity {
        private MapView mapView = null;
        private RadioButton rbtn_1, rbtn_2;
        private CheckBox cb_1, cb_2;
        private boolean isFirstLoc = true;
        private LocationClient locationClient;
    
        public MyLocationListenner myListener = new MyLocationListenner();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SDKInitializer.initialize(getApplicationContext());
            setContentView(R.layout.activity_main);
    
            // 获取地图控件的引用
            mapView = (MapView) findViewById(R.id.mMapView);
            // 开启定位图层
            mapView.getMap().setMyLocationEnabled(true);
            //定位初始化
             locationClient = new LocationClient(this);
    
            locationClient.registerLocationListener(myListener);
    
            //定位配置信息
            LocationClientOption option = new LocationClientOption();
            option.setOpenGps(true);
            option.setCoorType("bd0911");
            option.setScanSpan(1000);
            locationClient.setLocOption(option);
            locationClient.start();
            initView();
    
        }
    
    
    
        /**
         * 定位SDK监听函数
         */
        public class MyLocationListenner implements BDLocationListener {
    
            @Override
            public void onReceiveLocation(BDLocation location) {
                // map view 销毁后不在处理新接收的位置
                if (location == null || mapView == null) {
                    return;
                }
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(100).latitude(location.getLatitude())
                        .longitude(location.getLongitude()).build();
                mapView.getMap().setMyLocationData(locData);
                if (isFirstLoc) {
                    isFirstLoc = false;
                    LatLng ll = new LatLng(location.getLatitude(),
                            location.getLongitude());
                    MapStatus.Builder builder = new MapStatus.Builder();
                    builder.target(ll).zoom(18.0f);
                    mapView.getMap().animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
                }
            }
    
            public void onReceivePoi(BDLocation poiLocation) {
            }
        }
    
    
        private void initView() {
            rbtn_1 =(RadioButton)findViewById(R.id.Rbtn_1);
            rbtn_2 =(RadioButton)findViewById(R.id.Rbtn_2);
    
            cb_1 = (CheckBox) findViewById(R.id.cb_1);
            cb_2 = (CheckBox) findViewById(R.id.cb_2);
    
    
            rbtn_1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) { // 设置为普通图
                    mapView = (MapView) findViewById(R.id.mMapView);
                    mapView.getMap().setMapType(BaiduMap.MAP_TYPE_NORMAL);
                }
            });
            rbtn_2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) { // 设置为卫星图
                    mapView = (MapView) findViewById(R.id.mMapView);
                    mapView.getMap().setMapType(BaiduMap.MAP_TYPE_SATELLITE);
                }
            });
                // 设置复选框监听事件,选中与取消选中的两种事件.
            cb_1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if (b){
                        mapView.getMap().setTrafficEnabled(true);
                        // 可以自定义设置路况显示的颜色,四个参数,分别代表严重拥堵,拥堵,缓行,畅通
                        mapView.getMap().setCustomTrafficColor("#ffba0101", "#fff33131", "#ffff9e19", "#00000000");
                        // 对地图状态做更新,否则可能不会触发渲染.造成自定义无效.
                        MapStatusUpdate u = MapStatusUpdateFactory.zoomTo(13);
                        mapView.getMap().animateMapStatus(u);
                    }else
                        mapView.getMap().setTrafficEnabled(false);
                }
            });
    
            cb_2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if (b){
                        mapView.getMap().setBaiduHeatMapEnabled(true);
                    }else
                        mapView.getMap().setBaiduHeatMapEnabled(false);
                }
            });
        }
    
        // 重写父类方法,管理各部分生命周期.
        @Override
        protected void onResume() {
            mapView.onResume();
            super.onResume();
    
        }
    
        @Override
        protected void onPause() {
            mapView.onPause();
            super.onPause();
        }
    
        @Override
        protected void onDestroy() {
            locationClient.stop();
            mapView.getMap().setMyLocationEnabled(false);
            mapView.onDestroy();
            super.onDestroy();
        }
    }
    
    

    • 演示

    2019-4-20-05.gif

    这里,由于模拟器是没有gps定位模块了,所以这里的定位是不准确的.这样,一个基于百度地图api的简单地图定位apk就算是完成了.

    (这里,我在手机测试,发现定位并不是非常精确,之后会更新新版本,使其更加实用)


    更新时间:
    2019-4-21
    0:44

  • 相关阅读:
    当今手机和互联网故事
    回忆手机和互联网故事
    FAQ2010-2019
    LTM在服务器负载均衡中的运行模式
    如何让集团型企业进行IT集中管控,实现分支零IT运维
    两个优化Oracle数据库性能的方法解析
    简单描述Oracle数据库性能优化的几个要点
    A10 Thunder CFW融合防火墙保护企业应用安全
    全球甄选Azure云解决方案,直击云上核心痛点
    微软物联网开创”万物互联“新时代
  • 原文地址:https://www.cnblogs.com/gemuxiaoshe/p/10743577.html
Copyright © 2011-2022 走看看