Android 百度地图开发详解

目录

    • 实验环境
    • 申请 API Key
    • 使用百度定位
      • 准备 LBS SDK
    • 编码

声明:本人小白,文章作为自己的学习笔记,与大家分享,欢迎大家于本人学习交流
本文 refer to

作者:郭霖
书名:第一行代码Android第2版
出版社:人民邮电出版社

感谢此书籍原创者,如有侵犯您的知识产权和版权问题,请通知本人,本人会即时做出处理并删除文章

Email:[email protected]

感谢您阅读我的文章,未经本人许可,文章不得用于商业用途。转载请注明出处,否则属于侵权行为。

实验环境

  • 操作系统:win10 64
  • 软件环境:Android Studio 3.5.3
  • 编程语言:Java 13

申请 API Key

首先需要注册百度账号,登陆百度账号,打开网址 http://developer.baidu.com/user/info 填写注册信息并提交,然后去自己的邮箱通过验证,就完成注册了。
接着访问 https://lbsyun.baidu.com/apiconsole/key 会看到下面这个界面
Android 百度地图开发详解_第1张图片
点击 创建应用 申请 API Key, 应用名称可以随便填,这里填 LBSTest,应用类型选择 Android SDK,启用服务保持沉默即可,如下图所示
Android 百度地图开发详解_第2张图片
发布版 SHA1 是打包程序时所用的签名文件的 SHA1 指纹,可以通过 Android 查看,新建一个 Android Studio 项目,如图(开发版 SHA1 我们等下再说)
Android 百度地图开发详解_第3张图片
接下来,一路 Next,就可以了。
Android 百度地图开发详解_第4张图片
点击右侧 Gradle,然后点击标红的 Sync 按钮,
Android 百度地图开发详解_第5张图片
然后会出现下图
Android 百度地图开发详解_第6张图片
点击 :app --> Task --> android -->
Android 百度地图开发详解_第7张图片
双击 signingReport, 我们即可得到 发布版SHA1 指纹
Android 百度地图开发详解_第8张图片
把 SHA1: 后面的字符复制到创建百度地图应用界面的对应位置,
开发版的 SHA1 我们需要创建一个正式的签名文件,点击 Android Studio 顶部工具栏中的 Build --> Generate Signed APK,弹出如下窗口
Android 百度地图开发详解_第9张图片
点击 Create new… 弹出如下窗口
Android 百度地图开发详解_第10张图片
点击第一行的三个点,弹出如下窗口,选择签名文件保存的路径,并填写签名文件名称,并点击 OK
Android 百度地图开发详解_第11张图片
填写密码和名字
Android 百度地图开发详解_第12张图片
点击 OK,会回到如下界面,然后关闭这个窗口
Android 百度地图开发详解_第13张图片
然后按 win + r 输入 cmd 输入如下命令,

keytool -list -v -keystore <签名文件路径>

比如我创建的签名文件路径为 D:\miyao.jks\LBSTest.jks ,如图
Android 百度地图开发详解_第14张图片
输入你刚才设置的密码,如图
Android 百度地图开发详解_第15张图片
把 SHA1:后的字符复制到创建百度地图应用界面的对应位置。
包名这里我们填 com.example.a83445.lbstest (包名在我们创建 Android project 的界面中已经设置了)
Android 百度地图开发详解_第16张图片
点击提交,应用就创建成功了
Android 百度地图开发详解_第17张图片
上图中 OmVEuKl1IxomNQ1jq1qlGnePFpwsIdq6 就是我们申请到的 API Key。

使用百度定位

建议在手机上运行调试

准备 LBS SDK

在开始编码之前,我们需要下载百度 LBS 开放平台的 SDK,下载地址为 http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar 选择 基础定位基础地图 然后点击 开发包 下载按钮
Android 百度地图开发详解_第18张图片
解压下载的文件,在下载文件中 libs 目录下的内容分为两部分,如图,BaiduLBS_Android.jar 是 Java 层要使用的,其他子目录下的 so 文件时 Native 层要用到的。so 文件是用 C/C++ 语言编写的,然后再用 NDK 编译出来的。 我们这里不需要编写 C/C++ 的代码,因为百度都已经做好了封装, 但是我们需要将 libs 目录下的每一个文件都放到正确的位置。
Android 百度地图开发详解_第19张图片
观察一下当前的项目结构, app 模块下有一个 libs 目录,这里就是用来存放所有 Jar 包的,我们将 BaiduLBS_Android.jar 复制到这个目录下,如下图所示
Android 百度地图开发详解_第20张图片
接下来,展开 src/main 目录,鼠标右键点击该目录–>New–>Directory, 创建一个名为 jniLibs 的目录,这个目录是专门用来存放 so 文件的,然后把压缩包里的其他所有目录直接复制到这里,如图
Android 百度地图开发详解_第21张图片
为了让项目引用到 Jar 包中提供的接口,我们需要点击一下 Android Studio 顶部工具栏的 Sync 按钮(就是我前面圈出来那个按钮)
在这里插入图片描述
点击 Sync 之后,libs 目录下的 jar 文件就会多出一个向右的箭头,表示项目已经能引用到这些 jar 包
这样我们就把 LBS 的 SDK 都准备好了,接下来就可以开始编码了

编码

MainActivity.java 代码如下

public class MainActivity extends AppCompatActivity {

    public LocationClient mLocationClient;

    private MapView mapView;
    private BaiduMap baiduMap;
    private boolean isFirstLocate = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLocationClient = new LocationClient(getApplicationContext());
        mLocationClient.registerLocationListener(new MyLocationListener());
        SDKInitializer.initialize(getApplicationContext());//初始化
        setContentView(R.layout.activity_main);
        mapView = (MapView) findViewById(R.id.bmapView);
        baiduMap = mapView.getMap();
        baiduMap.setMyLocationEnabled(true);//用于显示我的位置
        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_GRANTED){
            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);
        }
        if (!permissionList.isEmpty()){
            String[] permissions = permissionList.toArray(new String[permissionList.
                    size()]);

            ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
        }else {
            requestLocation();
        }
    }

    //用于首次定位让地图移动到当前位置
    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(16f);//缩放级别
            baiduMap.animateMapStatus(update);
            isFirstLocate = false;
        }
        MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
        locationBuilder.latitude(location.getLatitude());
        locationBuilder.longitude(location.getLongitude());
        MyLocationData locationData = locationBuilder.build();
        baiduMap.setMyLocationData(locationData);
    }

    private void requestLocation() {
        initLocation();
        mLocationClient.start();//start方法开始定位
    }

    private void initLocation(){
        LocationClientOption option = new LocationClientOption();
        option.setScanSpan(5000);//5秒更新一次位置信息
        option.setIsNeedAddress(true);//启用详细位置
        option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//使用GPS定位
        mLocationClient.setLocOption(option);
    }

    @Override
    protected void onResume(){
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause(){
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        mLocationClient.stop();//活动销毁
        mapView.onDestroy();
        baiduMap.setMyLocationEnabled(false);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        switch (requestCode){
            case 1:
                if (grantResults.length > 0) {
                    for (int result : grantResults) {
                        if (result != PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(this, "必须同意所有权限才能使用本程序",
                                    Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    requestLocation();
                }else{
                    Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
                default:
        }
    }

    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(final BDLocation location){
            if(location.getLocType() == BDLocation.TypeGpsLocation
                    || location.getLocType() == BDLocation.TypeNetWorkLocation){
                navigateTo(location);
            }
        }
    }
}


activity_main.xml 布局文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    //地图控件使其占满整个屏幕
    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"/>

LinearLayout>

权限文件 AndroidManifest.xml 代码如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.a83445.lbstest">

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="OmVEuKl1IxomNQ1jq1qlGnePFpwsIdq6" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>
        //注册百度 LBS SDK 服务
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote">
        service>
    application>

至此,Android 百度地图初步开发完成

你可能感兴趣的:(Android,定位,java,android,android,studio,百度)