在配置百度地图 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.获取密钥
点击获取密钥,会出现下面的页面:
点击创建应用,就可以创建自己的应用,如下图:
应用名称可以根据自己喜好起名字,应用类型在这里选择的是 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 的基本使用就完成了~~~