首先创建一个安卓项目在这里我就不介绍如何创建了。
在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">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
/>
</LinearLayout>
主要是编写一个地图视图。
在java中编写如下代码:
public class MainActivity extends AppCompatActivity {
private LocationClient locationClient;定位服务的客户端。宿主程序在客户端声明此类,并调用
private MapView mapView;
private BaiduMap baiduMap;
private boolean isFirstLocate=true;//判断是否是第一次定位
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //LocationClient定位服务的客户端。宿主程序在客户端声明此类,并调用
locationClient=new LocationClient(getApplicationContext());//调用getApplicationContext()方法来调用一个全局的Context参数并传入
locationClient.registerLocationListener(new MyLocationListener());
SDKInitializer.initialize(getApplicationContext());//初始化地图SDK,必须在 setContentView(R.layout.activity_main)之上
setContentView(R.layout.activity_main);
mapView=(MapView)findViewById(R.id.bmapView); // 地图初始化
baiduMap=mapView.getMap(); // 开启定位图层
baiduMap.setMyLocationEnabled(true);//本人理解是否定位当前位置
/******下面主要是判断权限问题********/
List<String> permissionList=new ArrayList<>();//创建空的List集合
//依次判断下面3个权限有没有被授权,如果没有被授权就添加到List集合中,最后将Lisr转换成数组
//再调用 ActivityCompat.requestPermissions()方法一次性申请
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 requestLocation() {
locationClient.start();//开始定位,定位的结果会回调到我们前面注册的监听器中MyLocationListener
//LocationClient的start()方法只会定位一次
initLocation();
}
private void initLocation() {
LocationClientOption option=new LocationClientOption();// LocationClientOption主要意思是选择定位服务模式的类型
option.setScanSpan(4000);//设置更新的间隔 多长时间进行一次请求
option.setIsNeedAddress(true);//是否获取当前详细的地址信息
//option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//这个是设置定位模式为高精度模式
//
locationClient.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,"必须同意所有权限才能使用本程序",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) {//本人感觉BDLocation封装了许多,比如获取经纬度,地区等
if (bdLocation.getLocType()==BDLocation.TypeNetWorkLocation||bdLocation.getLocType()==BDLocation.TypeGpsLocation){
navigateTo(bdLocation);
}
}
}
private void navigateTo(BDLocation bdLocation) {
if (isFirstLocate){
//LatLng是存储经纬度坐标值的类,单位角度。
LatLng latLng=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());//使用传入的经纬度构造LatLng 对象,一对经纬度值代表地球上一个地点
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
//MapStatusUpdateFactory生成地图状态将要发生的变化
//newLatLng设置地图新中心点
MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.animateMapStatus(update);//把update传入animateMapStatus()方法中,就可以将地图移动到指定的经纬度上
update=MapStatusUpdateFactory.zoomTo(16f);//设置缩放级别
baiduMap.animateMapStatus(update);
isFirstLocate=false;
}
// MyLocationData.Builder这个类是用来封装设备当前所在位置
MyLocationData.Builder builder=new MyLocationData.Builder();
builder.latitude(bdLocation.getLatitude());
builder.longitude(bdLocation.getLongitude());
MyLocationData locationData=builder.build();//.build()方法会生成一个 MyLocationData的实例
//然后在将这个实例传入 baiduMap.setMyLocationData()方法中,就可以让设备当前的位置显示在地图上了
baiduMap.setMyLocationData(locationData);
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
locationClient.stop();//一定要停止定位,不然程序会持续在后天不停地进行定位,严重消耗手机电量
baiduMap.setMyLocationEnabled(false);
}
}
(我已经在代码上关于不理解的我已经注释介绍了,在这里我就不介绍了)
最重要的还得在manifest.xml中设置权限问题,还有你所申请的百度密钥。
例如下面我所示:\
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.lbstest4">
<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.READ_LOGS"
tools:ignore="ProtectedPermissions" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="com.baidu.lbsapi.API_KEY"
android:value="ADuRoL0gilmwrS6MnskQyWGSaaQxhwaH"/>
<service android:name="com.baidu.location.f" android:enabled="true"
android:process=":remote"
/>
</application>
</manifest>