百度地圖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.獲取金鑰
點選獲取金鑰,會出現下面的頁面:
點選建立應用,就可以建立自己的應用,如下圖:
應用名稱可以根據自己喜好起名字,應用型別在這裡選擇的是 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 的基本使用就完成了~~~