参考链接:
百度地图定位文档:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code
1. 导入SDK,配置AK
2. 导入具体的权限以及定位服务
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
- 定位服务 (这个Service在官方提供的SDK已经给出,只需要声明即可)
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
3. 由于Android6.0(API23)以上的动态权限申请这个原因,我们定位所需的GPS以及网络定位都需要进行危险权限申请处理.
- 判断用户的手机版本是否超过23,如果等于或大于则进行权限申请,如果没有则直接进行定位处理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
checkPhonePermission()
}else{
mLocationClient.start()
}
/**
* 检查手机权限是否已经获取
*/
private void checkPhonePermission() {
mPermissionList.clear();
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
if (mPermissionList.size() > 0) {
String[] permissions2 = mPermissionList.toArray(new String[mPermissionList.size()]);
ActivityCompat.requestPermissions(this, permissions2, PERMISSION_REQUEST_CODE);
}else{
mLocationClient.start();
}
}
/**
* 权限结果回调处理
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean hasPermissionDismiss = false;
if (PERMISSION_REQUEST_CODE == requestCode) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1) {
hasPermissionDismiss = true;
}
}
if (hasPermissionDismiss) {
Toast.makeText(this, "您没有授予权限,请您到系统设置中设置该权限,再重新进行定位", Toast.LENGTH_SHORT).show();;
}else{
mLocationClient.start();
}
}
}
4. 设置定位回调监听
- 新建类 MyLocationListener 继承 BDAbstractLocationListener ,在实现的方法中对回调进过进行处理
public class MyLocationListener extends BDAbstractLocationListener {
private static final String TAG = MyLocationListener.class.getSimpleName();
@Override
public void onReceiveLocation(BDLocation bdLocation) {
if (bdLocation.getLocType()==61){
double latitude = bdLocation.getLatitude();
double longitude = bdLocation.getLongitude();
float radius = bdLocation.getRadius();
String coorType = bdLocation.getCoorType();
Log.i(TAG,latitude+","+longitude);
}else if (bdLocation.getLocType()==161){
double latitude = bdLocation.getLatitude();
double longitude = bdLocation.getLongitude();
float radius = bdLocation.getRadius();
String coorType = bdLocation.getCoorType();
Log.i(TAG,latitude+","+longitude);
}else{
Log.i(TAG,"定位失败,错误码:"+bdLocation.getLocType());
}
}
}
5. 初始化MyLocationListener监听
myLocationListener = new MyLocationListener();
6. 配置定位SDK参数
option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setCoorType("bd09ll");
option.setScanSpan(1000);
option.setOpenGps(true);
option.setLocationNotify(true);
option.setIgnoreKillProcess(false);
option.SetIgnoreCacheException(false);
option.setWifiCacheTimeOut(5*60*1000);
option.setEnableSimulateGps(false);
7. 初始化LocationClient类,并设置上面初始化的LocationClientOption,注册MyLocationListener监听
mLocationClient = new LocationClient(this);
mLocationClient.setLocOption(option);
mLocationClient.registerLocationListener(myLocationListener);
8. 开启定位,并在上面所有权限处理相关的地方加入该句代码
mLocationClient.start();
9. 以下贴入MainActivity的全部代码
import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.jh.maplocationtest.location.MyLocationListener;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private MapView mapView = null;
private BaiduMap baiduMap = null;
private MyLocationListener myLocationListener = null;
private LocationClient mLocationClient = null;
private LocationClientOption option = null;
private static final int PERMISSION_REQUEST_CODE = 1000;
String[] permissions = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE
};
List<String> mPermissionList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = findViewById(R.id.mapView);
baiduMap = mapView.getMap();
initOptions();
mLocationClient = new LocationClient(this);
myLocationListener = new MyLocationListener();
mLocationClient.setLocOption(option);
mLocationClient.registerLocationListener(myLocationListener);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
checkPhonePermission();
}else{
mLocationClient.start();
}
}
/**
* 检查手机权限是否已经获取
*/
private void checkPhonePermission() {
mPermissionList.clear();
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
if (mPermissionList.size() > 0) {
String[] permissions2 = mPermissionList.toArray(new String[mPermissionList.size()]);
ActivityCompat.requestPermissions(this, permissions2, PERMISSION_REQUEST_CODE);
}else{
mLocationClient.start();
}
}
/**
* 进行初始化定位功能的配置
*/
private void initOptions() {
option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setCoorType("bd09ll");
option.setScanSpan(1000);
option.setOpenGps(true);
option.setLocationNotify(true);
option.setIgnoreKillProcess(false);
option.SetIgnoreCacheException(false);
option.setWifiCacheTimeOut(5*60*1000);
option.setEnableSimulateGps(false);
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
/**
* 权限结果回调处理
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean hasPermissionDismiss = false;
if (PERMISSION_REQUEST_CODE == requestCode) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1) {
hasPermissionDismiss = true;
}
}
if (hasPermissionDismiss) {
Toast.makeText(this, "您没有授予权限,请您到系统设置中设置该权限,再重新进行定位", Toast.LENGTH_SHORT).show();;
}else{
mLocationClient.start();
}
}
}
}
10. 代码已上传至github,可自行下载,查看