一、 申請(qǐng)API_KEY
1. http://lbsyun.baidu.com/ :在這里注冊(cè)并申請(qǐng)。注冊(cè)之后出現(xiàn)應(yīng)用列表,選擇 創(chuàng)建應(yīng)用 :
創(chuàng)建應(yīng)用
2. 創(chuàng)建應(yīng)用后如下圖所示:
選擇
- 應(yīng)用類型選擇的話,我們選擇 Android SDK 就可以了。
SHA1
PS:SHA1
找了我好久...
- SHA1尋找之路:
左側(cè)選擇項(xiàng)目目錄類型 project ,打開右側(cè) Gradle > app > android > signingReport ,點(diǎn)擊發(fā)現(xiàn)空白,突然發(fā)現(xiàn)左下角有個(gè)轉(zhuǎn)換的鍵(左下標(biāo)紅的地方),答案出來了。
3. 獲取基本參數(shù)
- 創(chuàng)建完成,獲得
API_KEY
。
二、 下載百度定位SDK
- 如無特殊要求,選擇基礎(chǔ)功能即可:
- 下載開發(fā)包解壓后得到 libs 文件夾。
- BaiduLBS_android.jar 放在 project 目錄下的 app > libs 目錄下,其他so庫放在 app > main > 新建文件夾jniLibs 下,或者都可以放jniLibs下。
三、 使用百度地圖
1. 在 AndroidManifest.xml 中添加如下權(quán)限:
<!-- 這個(gè)權(quán)限用于進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 這個(gè)權(quán)限用于訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 獲取運(yùn)營商信息,用于支持提供運(yùn)營商信息相關(guān)的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 用于讀取手機(jī)當(dāng)前的狀態(tài)-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 寫入擴(kuò)展存儲(chǔ),向擴(kuò)展卡寫入數(shù)據(jù),用于寫入離線定位數(shù)據(jù)-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 訪問網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng)-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取權(quán)限,用戶寫入離線定位數(shù)據(jù)-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- 在
Application
標(biāo)簽中聲明SERVICE
組件,每個(gè)APP擁有自己單獨(dú)的定位SERVICE
:
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>
- 百度定位SDK在4.2版本之后需要在 AndroidMainfest.xml 中正確設(shè)置
Accesskey(AK)
,如果設(shè)置錯(cuò)誤將會(huì)導(dǎo)致定位和地理圍欄服務(wù)無法正常使用。設(shè)置AK
,在Application
標(biāo)簽中加入:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="AK" /> //AK:開發(fā)者申請(qǐng)的Key
2. 新建LBSwithBaidu
,LBSwithBaidu
代碼如下:
public class LBSwithBaidu extends AppCompatActivity {
private TextView text;
private LocationClient client;
private StringBuilder connrentPosition;
private MapView map;
private BaiduMap baidumap;
private boolean ismylocation=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//SDK的初始化
SDKInitializer.initialize(getApplicationContext());
//注冊(cè)客戶端定位的監(jiān)聽
client = new LocationClient(getApplicationContext());
client.registerLocationListener(new MylocationListener());
setContentView(R.layout.activity_lbswith_baidu);
text= (TextView) findViewById(R.id.textView_location);
//獲取地圖控件的引用
map= (MapView) findViewById(R.id.mapwithbaidu);
//獲取地圖實(shí)例
baidumap=map.getMap();
//設(shè)置是否在地圖上顯示位置
baidumap.setMyLocationEnabled(true);
//6.0以上動(dòng)態(tài)權(quán)限的獲取
List<String> permission = new ArrayList<>();
if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permission.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permission.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permission.isEmpty()) {
String[] permissions = permission.toArray(new String[permission.size()]);
ActivityCompat.requestPermissions(LBSwithBaidu.this, permissions, 1);
} else {
requestion();
}
}
private void requestion() {
initlocation();
client.start();
}
private void initlocation() {
LocationClientOption option=new LocationClientOption();
option.setIsNeedAddress(true);
option.setScanSpan(5000);
client.setLocOption(option);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for(int result:grantResults){
if(result!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "必須同意權(quán)限", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestion();
}else {
Toast.makeText(this, "發(fā)生錯(cuò)誤", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
public void nagativato(BDLocation bdLocation) {
if (ismylocation) {
LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
Log.d("pipa",bdLocation.getLatitude()+"::"+ bdLocation.getLongitude());
MapStatusUpdate updata = MapStatusUpdateFactory.newLatLng(ll);
baidumap.animateMapStatus(updata);
updata = MapStatusUpdateFactory.zoomTo(16f);
baidumap.animateMapStatus(updata);
ismylocation = false;
}
MyLocationData.Builder loBuilder=new MyLocationData.Builder().latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude());
MyLocationData locationData=loBuilder.build();
baidumap.setMyLocationData(locationData);
}
public class MylocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
String name = bdLocation.getLocType();
if(name==BDLocation.TypeGpsLocation||name==BDLocation.TypeNetWorkLocation){
nagativato(bdLocation);
}
connrentPosition = new StringBuilder();
connrentPosition.append("緯度:").append(bdLocation.getLatitude()).append("\n");
connrentPosition.append("經(jīng)度:").append(bdLocation.getLongitude()).append("\n");
connrentPosition.append("國家:").append(bdLocation.getCountry()).append("\n");
connrentPosition.append("省:").append(bdLocation.getProvince()).append("\n");
connrentPosition.append("市:").append(bdLocation.getCity()).append("\n");
connrentPosition.append("縣:").append(bdLocation.getDistrict()).append("\n");
connrentPosition.append("街道:").append(bdLocation.getStreet()).append("\n");
connrentPosition.append("定位方式:");
if (bdLocation.getLocType() == BDLocation.TypeGpsLocation) {
connrentPosition.append("GPS");
} else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
connrentPosition.append("網(wǎng)絡(luò)定位");
}
runOnUiThread(new Runnable() {
@Override
public void run() {
text.setText(connrentPosition);
}
});
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
@Override
protected void onResume() {
super.onResume();
//地圖生命周期需實(shí)現(xiàn)
map.onResume();
}
@Override
protected void onPause() {
super.onPause();
//地圖生命周期需實(shí)現(xiàn)
map.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
client.stop();
//地圖生命周期需實(shí)現(xiàn)
map.onDestroy();
baidumap.setMyLocationEnabled(false);
}
}
3. 最終效果圖:
如有不對(duì)之處,歡迎指正,謝謝~