百度地图SDK配置与使用

在配置百度地图 SDK 和使用时,发现官网上的教程并不是那么好用,而且容易出现定位回调里 BDLocation.getLocType() == 162 这个问题,官网只是说 SO 配置出现异常,并没有明确问题所在;如果你也遇到了,请点这个链接:BDLocation.getLocType() == 162;下面是在官网的步骤,其中我画红圈的是必须要看的:获取密钥,开发指南,产品下载。

先看一下效果图,可以直接获取到我的位置信息:

GitHub 下载地址:https://github.com/wuqingsen/getLocation

CSDN 下载地址:https://download.csdn.net/download/wuqingsen1/10827318

1. 打开百度地图 SDK 官网,登陆/注册

打开百度地图 SDK 官网,登陆/注册;官网是:http://lbsyun.baidu.com/index.php?title=android-locsdk

一定要登陆/注册,否则下面获取密钥无法进行;

2.获取密钥

点击获取密钥,会出现下面的页面:

点击创建应用,就可以创建自己的应用,如下图:

扫描二维码关注公众号,回复: 4473106 查看本文章

应用名称可以根据自己喜好起名字,应用类型在这里选择的是 Android SDK ,启动服务默认全选,SHA1的获取可以点这里看如何获取包名的查看可以点击这里;当然也可以看官网的介绍。这些操作完后,就可以点击提交了,这样就获取到密钥了。

3.下载jar包

点击产品下载,点击去下载,如下图:

可以根据自己需要下载,我下载的只是定位能力的 jar 包,如下图:

下载解压后,打开后会看到下面图片的内容:

将 jar 包复制到项目的 libs 中,再创建 jniLibs 的包是和 java 包同级的,这里是和官网配置不怎么一样,因为按照官网的配置,会出现 162 的错误,而用下面的方式可以避免错误;如下图:

创建完之后,就配置完成了,这里就不用再取配置 Gradle 了。

4. AndroidManfest 的配置

添加代码这部分,官网的开发指南说的很清楚了,我也不再多写了。在添加代码前,需要配置权限,下面是一个 app 正常运行都要配置的内容,懒得抽出来写百度地图的配置,所以直接拿过来了~~:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.REORDER_TASKS" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS" />
    <!-- 访问网络的权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <uses-feature android:name="android.hardware.location.gps" />

    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- 阅读消息 -->
    <uses-permission android:name="android.permission.READ_SMS" />
    <!-- 写入消息 -->
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <!-- 接收消息 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- iBeancon功能所需权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

下面是 application 内的配置,其中 API_KEY 为自己申请的密钥~~,不要填错了:

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <!-- 百度定位 开始 -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="YKdeW7z3YqOrO2yjvVSMbYdBgccvPGK8" />
        <!-- 百度定位 结束 -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

到此为止 AndroidManfest 的配置也完成了;

5. 写入获取地理为止的代码~就OK了

写入代码之前要先申请一些权限~~,如:获取地理为止等,下面是我自己写的获取权限的工具类:

import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.content.ContextCompat;

/**
 * author: wu
 * date: on 2018/11/30.
 * describe:检查权限的工具类
 */

public class PermissionsChecker {
    private final Context mContext;

    public PermissionsChecker(Context context) {
        mContext = context.getApplicationContext();
    }

    // 判断权限集合
    public boolean lacksPermissions(String... permissions) {
        for (String permission : permissions) {
            if (lacksPermission(permission)) {
                return true;
            }
        }
        return false;
    }

    // 判断是否缺少权限
    private boolean lacksPermission(String permission) {
        return ContextCompat.checkSelfPermission(mContext, permission) ==
                PackageManager.PERMISSION_DENIED;
    }
}

下面就是 MainActivity 的主要代码了:

import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

public class MainActivity extends AppCompatActivity {
    private PermissionsChecker mPermissionsChecker; // 权限检测器
    private final int RESULT_CODE_LOCATION = 0x001;
    private Button btn_getPlace;
    //定位权限,获取app内常用权限
    String[] permsLocation = {"android.permission.READ_PHONE_STATE"
            , "android.permission.ACCESS_COARSE_LOCATION"
            , "android.permission.ACCESS_FINE_LOCATION"
            , "android.permission.READ_EXTERNAL_STORAGE"
            , "android.permission.WRITE_EXTERNAL_STORAGE"};
    LocationClient mLocClient;
    private TextView tv_place;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_getPlace = findViewById(R.id.btn_getPlace);
        tv_place = findViewById(R.id.tv_place);
        mPermissionsChecker = new PermissionsChecker(MainActivity.this);
        mLocClient = new LocationClient(getApplicationContext());
        mLocClient.registerLocationListener(listener);

        btn_getPlace.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mPermissionsChecker.lacksPermissions(permsLocation)) {
                    ActivityCompat.requestPermissions(MainActivity.this, permsLocation, RESULT_CODE_LOCATION);
                } else {
                    //获取位置
                    setLocation();
                }
            }
        });
    }

    //获取位置
    private void setLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setIsNeedAddress(true);//是否要地址
        option.setOpenGps(true);
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
        mLocClient.setLocOption(option);
        mLocClient.start();
    }

    /***
     * 定位结果回调,在此方法中处理定位结果
     */
    BDAbstractLocationListener listener = new BDAbstractLocationListener() {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {

            Log.i("bdmap", "定位类型:" + bdLocation.getLocTypeDescription() + "\n"
                    + "纬度:" + bdLocation.getLatitude() + "\n"
                    + "经度:" + bdLocation.getLongitude() + "\n"
                    + "详细地址:" + bdLocation.getAddrStr() + "\n"
                    + "卫星数目" + bdLocation.getSatelliteNumber());
            //设置我的位置
            tv_place.setText(bdLocation.getAddrStr());
        }
    };

    @Override
    public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {
        switch (permsRequestCode) {
            case RESULT_CODE_LOCATION:
                boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                if (cameraAccepted) {
                    //权限通过后继续获取位置
                    setLocation();
                } else {
                    //用户授权拒绝之后,友情提示一下
                    Toast.makeText(MainActivity.this, "请开启应用定位权限", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

不难看出,和百度官方的所给的代码所差无几,只是在里面多加了权限的判断,没有权限时,去申请权限。最后的 onRequestPermissionsResult 方法中,再去判断有没有权限,如果申请到了权限继续获取位置。

到这里百度地图 SDK 的基本使用就完成了~~~

猜你喜欢

转载自blog.csdn.net/wuqingsen1/article/details/84782836