美文网首页三方
百度地图集成攻略

百度地图集成攻略

作者: 玖玖君 | 来源:发表于2019-10-22 15:46 被阅读0次

    Tip:

    因为公司有定位需求的需要,所以我重新了解了一下地图定位功能的实现,所以为了之后能够更方便使用,特此来记录一下,也为了方便更多的人使用

    Error:集成过程中有出现了几个问题:

    • 集成中设置 mBaiduMap.setMyLocationEnabled(true); 开启定位功能时,地图显示空白
      这个问题产生的原因是因为我们没有按正确的顺序来集成地图功能,一定要注意实现的先后顺序
    • 测试定位功能时点击定位会跑到大西洋,几内亚湾
      这个的话我也是查看了很久才发现问题的所在,是因为我们的key与我们在网站上申请的key不相同,还可能是因为我们的SHA1码不是我们需要的对应版本,我们如果是测试版,那么就需要用测试版的SHA1,删除掉申请的应用重新创建一个重新获取SHA1码再来试试看

    填写应用名称,选中类型为:Android SDK,发布版/开发版SHA1参考百度文档完成

    http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak

    步骤

    adb配置

    配置环境变量

    keytool配置

    配置环境变量

    九大危险权限
    电话、短信、通信录、日历、定义、传感器、麦克风、相机、文件

    三方的通用流程
    1、注册、创建应用、获取appkey
    2、下载SDK并导入到项目中
    3、配置清单文件、在application初始化数据
    4、代码处理

    基础地图
    覆盖物
    PIO检索
    定位功能
    导航功能

    获取发布版SHA1:

    1· 在命令符里输入执行” cd .android ”定位到”.android”文件夹下

    2·继续在控制台输入命令:

    调试版本使用 debug.keystore,命令为:keytool -v -list -keystore E:\Map.jks 
    发布版本使用 apk 对应的 keystore,命令为:keytool -list -v -keystore apk 的 keystore。
    可以直接cd .android 输入默认密码android
    命令为 :keytool -list -v -keystore debug.keystore
    

    3·获取以后创建好应用

    第一步 配置AndroidManifest.xml文件

    1.在<application>中加入如下代码配置开发密钥(AK):

    <application>  
        <meta-data  
            android:name="com.baidu.lbsapi.API_KEY"  
            android:value="开发者 key" />  
    </application>
    
    1. 在<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" />
    

    注:自Android6.0起部分权限的使用需要开发者在代码中动态申请。

    第二步 在布局文件中添加地图容器

    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" />
    

    在Application标签中声明定位的service组件(不然无法实现定位)

    <service android:name="com.baidu.location.f"
        android:enabled="true"
        android:process=":remote"/>
    

    第三步 在Activity中具体实现步骤

    public class TwoActivity extends AppCompatActivity implements View.OnClickListener {
    
        private MapView mMapView = null;
        private boolean isPermissionRequested;
        private BaiduMap mBaiduMap;
        private LocationClient mLocationClient;
        /**
         * 定位
         */
        private Button mBtn;
        private LatLng mUser_latlng;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_two);
            initView();
            // 申请动态权限
            requestPermission();
            //获取地图控件引用
            mMapView = findViewById(R.id.map_view);
            mBaiduMap = mMapView.getMap();
    
            initLocation();
    
        }
    
        private void initLocation() {
            mBaiduMap.setMyLocationEnabled(true);
    
            //通过LocationClient发起定位
            //定位初始化
            mLocationClient = new LocationClient(this);
    
            //通过LocationClientOption设置LocationClient相关参数
            LocationClientOption option = new LocationClientOption();
            option.setOpenGps(true); // 打开gps
            option.setCoorType("bd09ll"); // 设置坐标类型
            option.setScanSpan(1000);
    
            //设置locationClientOption
            mLocationClient.setLocOption(option);
    
    
            //注册LocationListener监听器
            MyLocationListener myLocationListener = new MyLocationListener();
            mLocationClient.registerLocationListener(myLocationListener);
            //开启地图定位图层
            mLocationClient.start();
    
    //        //定义BaiduMapOptions对象
    //        BaiduMapOptions options = new BaiduMapOptions();
    //
    //        //设置地图模式为卫星地图
    //        options.mapType(BaiduMap.MAP_TYPE_SATELLITE);
    //        options.overlookingGesturesEnabled(false);
    
            //创建MapView对象
    //        MapView mapView = new MapView(this, options);
    
    
    //        setContentView(mapView);
        }
    
        /**
         * Android6.0之后需要动态申请权限
         */
        private void requestPermission() {
            if (Build.VERSION.SDK_INT >= 23 && !isPermissionRequested) {
                isPermissionRequested = true;
                ArrayList<String> permissionsList = new ArrayList<>();
                String[] permissions = {
                        Manifest.permission.ACCESS_NETWORK_STATE,
                        Manifest.permission.INTERNET,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_WIFI_STATE,
                };
    
                for (String perm : permissions) {
                    if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(perm)) {
                        permissionsList.add(perm);
                        // 进入到这里代表没有权限.
                    }
                }
    
                if (!permissionsList.isEmpty()) {
                    String[] strings = new String[permissionsList.size()];
                    requestPermissions(permissionsList.toArray(strings), 0);
                }
            }else {
                Toast.makeText(this, "已获取授权", Toast.LENGTH_SHORT).show();
            }
        }
    
        private void initView() {
    
            mBtn = (Button) findViewById(R.id.btn);
            mBtn.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                default:
                    break;
                case R.id.btn:
                    initLoaction2();
                    break;
            }
        }
    
        private void initLoaction2() {
            MapStatusUpdate status2 = MapStatusUpdateFactory.newLatLng(mUser_latlng);
            mBaiduMap.setMapStatus(status2);
        }
    
    
        public class MyLocationListener extends BDAbstractLocationListener {
            @Override
            public void onReceiveLocation(BDLocation location) {
                //mapView 销毁后不在处理新接收的位置
                if (location == null || mMapView == null) {
                    return;
                }
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(location.getDirection()).latitude(location.getLatitude())
                        .longitude(location.getLongitude()).build();
                mUser_latlng = new LatLng(location.getLatitude(),location.getLongitude());
                mBaiduMap.setMyLocationData(locData);
            }
        }
    
    
        @Override
        protected void onResume() {
            mMapView.onResume();
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            mMapView.onPause();
            super.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
            mMapView.onDestroy();
            mLocationClient.stop();
            mBaiduMap.setMyLocationEnabled(false);
        }
        private long exitTime = 0;
        public void onBackPressed() {
            doubleBackQuit();
        }
        /**
         * 连续按两次返回键,退出应用
         */
        private void doubleBackQuit()
        {
            if (System.currentTimeMillis() - exitTime > 2000) {
                Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                finish();
            }
        }
    }
    
    

    至此,就实现了一个简单的集成百度地图与定位的显示效果了。

    相关文章

      网友评论

        本文标题:百度地图集成攻略

        本文链接:https://www.haomeiwen.com/subject/kniqvctx.html