Android——定位服務(百度地圖)
阿新 • • 發佈:2021-02-17
技術標籤:Android Studio定位百度androidjavaandroid studio
第一步:在清單檔案中申請許可權,如下:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.WAKE_LOCK"/>
然後將自己建立應用申請到的ak金鑰新增到value中,android:name是固定的
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="ZnGU2mBmhv9uPVspDK29uueDSKYLloQ4"/>
在新增一個LDB SDK服務(內容固定不變)
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>
兩種方式顯示定位資訊
第一種:經緯度,和省市區等詳細位置(定位方式必須是網路定位才能顯示詳細位置資訊)
第二種:圖型形式
activity_main.xml程式碼如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:id="@+id/position" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#000"/> <com.baidu.mapapi.map.MapView android:id="@+id/baiduMap" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:clickable="true" android:layout_gravity="center"/>
MainActivity.java程式碼如下:
public class MainActivity extends AppCompatActivity {
private MapView BaiduMap;
private LocationClient Client;
private TextView Position;
private BaiduMap baiduMap;//地圖總控制器
private boolean isFirstLocate = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//一定要在setContentView()前呼叫
SDKInitializer.initialize(getApplicationContext());
Client = new LocationClient(getApplicationContext());//獲取全域性Context
Client.registerLocationListener(new MyLocationListener());//註冊一個定位監聽器,獲取位置資訊,回撥此定位監聽器
setContentView(R.layout.activity_main);
BaiduMap = (MapView) findViewById(R.id.baiduMap);
Position = (TextView) findViewById(R.id.position);
List<String> PermissionList = new ArrayList<>();
baiduMap = BaiduMap.getMap();//獲取例項,可以對地圖進行一系列操作,比如:縮放範圍,移動地圖
baiduMap.setMyLocationEnabled(true);//允許當前裝置顯示在地圖上
//判斷許可權是否授權
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED){
PermissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
PermissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
PermissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!PermissionList.isEmpty()){
String[] Permissions = PermissionList.toArray(new String[PermissionList.size()]);//轉化為陣列
ActivityCompat.requestPermissions(MainActivity.this,Permissions,1);//一次性申請許可權
}else {
requestLocation();
}
}
private void navigateTo(BDLocation location){
if (isFirstLocate){
LatLng lng = new LatLng(location.getLatitude(),location.getLongitude());//指定經緯度
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(lng);
baiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(16f);//百度地圖縮放級別限定在3-19
baiduMap.animateMapStatus(update);
isFirstLocate = false;
}
MyLocationData.Builder builder = new MyLocationData.Builder();
builder.latitude(location.getLatitude());
builder.longitude(location.getLongitude());
MyLocationData locationData = builder.build();
baiduMap.setMyLocationData(locationData);
}
private void requestLocation(){
InitLocation();
Client.start();
}
/*
* LBS SKD定位模式
* 1:Hight_Accuracy:高精確模式,優先使用GPS定位,其次使用網路定位
* 2:Battery_Saving:節電模式,使用網路定位
* 3:Device_Sensors:感測器模式,使用GPS
* */
private void InitLocation(){
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//高精確模式
option.setScanSpan(5000);//ms
option.setIsNeedAddress(true);//獲取詳細資訊許可
Client.setLocOption(option);
}
@Override
protected void onDestroy() {
super.onDestroy();
Client.stop();
BaiduMap.onDestroy();
baiduMap.setMyLocationEnabled(false);
}
@Override
protected void onResume() {
super.onResume();
BaiduMap.onResume();
}
@Override
protected void onPause() {
super.onPause();
BaiduMap.onPause();
}
@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,"必須同意所有許可權才能使用本程式",Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
}else {
Toast.makeText(this,"發生未知錯誤",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation bdLocation) {
if (bdLocation.getLocType() == BDLocation.TypeGpsLocation || bdLocation.getLocType() == BDLocation.TypeNetWorkLocation){
navigateTo(bdLocation);
}
StringBuilder currentPosition = new StringBuilder();
currentPosition.append("緯度:").append(bdLocation.getLatitude()).append("\n");
currentPosition.append("經度:").append(bdLocation.getLongitude()).append("\n");
currentPosition.append("國家:").append(bdLocation.getCountry()).append("\n");
currentPosition.append("省:").append(bdLocation.getProvince()).append("\n");
currentPosition.append("市/縣:").append(bdLocation.getCity()).append("\n");
currentPosition.append("區/鄉:").append(bdLocation.getDistrict()).append("\n");
currentPosition.append("街道/村:").append(bdLocation.getStreet()).append("\n");
currentPosition.append("定位方式:");
if (bdLocation.getLocType() == BDLocation.TypeGpsLocation){
currentPosition.append("GPS");
}else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation){
currentPosition.append("網路");
}
Position.setText(currentPosition);
}
}
}