四、Android定位与百度位置应用开发
- 功能说明
百度地图调用及定位
- 结果截图


- 代码分析
MainActivity.java: package com.example.map; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.model.LatLng; /* 百度地图应用,包含定位信息和地图显示 一般需要打开定位服务,选择高精度定位模式,有网络连接 需要在清单文件里使用百度云服务(参见清单文件service标签) 需要创建应用(模块)的Key,并写入清单文件(参见清单文件meta标签) */ public class MainActivity extends AppCompatActivity { LocationClient mLocationClient; //定位客户端 MapView mapView; //Android Widget地图控件 BaiduMap baiduMap; boolean isFirstLocate = true; TextView tv_Lat; //纬度 TextView tv_Lon; //经度 TextView tv_Add; //地址 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //如果没有定位权限,动态请求用户允许使用该权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); }else { requestLocation(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1: if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "没有定位权限!", Toast.LENGTH_LONG).show(); finish(); } else { requestLocation(); } } } private void requestLocation() { initLocation(); mLocationClient.start(); } private void initLocation() { //初始化 mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(new MyLocationListener()); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = findViewById(R.id.bmapView); baiduMap = mapView.getMap(); tv_Lat = findViewById(R.id.tv_Lat); tv_Lon = findViewById(R.id.tv_Lon); tv_Add = findViewById(R.id.tv_Add); LocationClientOption option = new LocationClientOption(); //设置扫描时间间隔 option.setScanSpan(1000); //设置定位模式,三选一 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); /*option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving); option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);*/ //设置需要地址信息 option.setIsNeedAddress(true); //保存定位参数 mLocationClient.setLocOption(option); } //内部类,百度位置监听器 private class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation bdLocation) { tv_Lat.setText(bdLocation.getLatitude()+""); tv_Lon.setText(bdLocation.getLongitude()+""); tv_Add.setText(bdLocation.getAddrStr()); if(bdLocation.getLocType()==BDLocation.TypeGpsLocation || bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){ navigateTo(bdLocation); } } } private void navigateTo(BDLocation bdLocation) { if(isFirstLocate){ LatLng ll = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); isFirstLocate = false; } } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onResume(); } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); mapView.onDestroy(); } } activity_main.xml: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <!--百度地图控件--> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> <!--位置文本布局的背景色代码的前2位代码为透明度--> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#e0000000" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12dp" android:layout_marginTop="20dp" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="纬度:" android:textColor="#ffffff" android:textSize="15dp" /> <TextView android:id="@+id/tv_Lat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textColor="#ffffff" android:textSize="15dp" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12dp" android:layout_marginTop="10dp" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="经度:" android:textColor="#ffffff" android:textSize="15dp" /> <TextView android:id="@+id/tv_Lon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textColor="#ffffff" android:textSize="15dp" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginLeft="12dp" android:layout_marginTop="10dp" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="地址:" android:textColor="#ffffff" android:textSize="15dp" /> <TextView android:id="@+id/tv_Add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textColor="#ffffff" android:textSize="15dp" /> </LinearLayout> </LinearLayout> </FrameLayout> DemoApplication.java: package com.example.map; import android.app.Application; import com.baidu.mapapi.CoordType; import com.baidu.mapapi.SDKInitializer; public class DemoApplication extends Application { @Override public void onCreate() { super.onCreate(); //在使用SDK各组件之前初始化context信息,传入ApplicationContext SDKInitializer.initialize(this); //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型. //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。 SDKInitializer.setCoordType(CoordType.BD09LL); } } MyLocationListener.java: package com.example.map; import com.baidu.location.BDAbstractLocationListener; import com.baidu.location.BDLocation; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; public class MyLocationListener extends BDAbstractLocationListener { private MapView mMapView = null; private BaiduMap mBaiduMap; @Override public void onReceiveLocation(BDLocation location) { //mapView 销毁后不在处理新接收的位置 if (location == null || mMapView == null){ return; } MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(location.getDirection()).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); } }
浙公网安备 33010602011771号