百度地图SDK完善定位,动态获取权限(定位)
测试的时候记得开启
手机定位(手机测试,模拟器不能获取位置!!!!)
在AndroidManifest.xml里添加两条权限
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
修改MainActivity.java如下即可
import static com.baidu.mapapi.map.BaiduMap.MAP_TYPE_NORMAL;
import static com.baidu.mapapi.map.BaiduMap.MAP_TYPE_SATELLITE;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private int times = 0;
private final int REQUEST_PERMISSION = 0;
//地图
private MapView mMapView = null;
//布局
private RadioGroup radioGroup;
RadioButton rg_normally, rg_GPS;
CheckBox rg_lk, rg_rl;
private BaiduMap mBaiduMap;
Boolean isFirstLoc = true;
private MyLocationConfiguration.LocationMode locationMode;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
radioGroup = findViewById(R.id.rg_TYPE);
rg_normally = findViewById(R.id.rg_normally);
rg_GPS = findViewById(R.id.rg_GPS);
rg_lk = findViewById(R.id.rg_lk);
rg_rl = findViewById(R.id.rg_rl);
initEvent();
initLor();
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
initLor();
}
@RequiresApi(api = Build.VERSION_CODES.M)
private void initLor() {
times++;
final List<String> permissionsList = new ArrayList<>();
//获取系统的LocationManager对象
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
//添加权限检查
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
){
permissionsList.add(Manifest.permission.ACCESS_FINE_LOCATION);
if ( ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED){
permissionsList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (permissionsList.size() != 0) {
if (times == 1) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_PERMISSION);
} else {
new AlertDialog.Builder(this)
.setCancelable(true)
.setTitle("提示")
.setMessage("获取不到授权,APP将无法正常使用,请允许APP获取权限!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_PERMISSION);
}
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
finish();
}
}).show();
}
return;
}
}
//设置每一秒获取一次location信息
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, //GPS定位提供者
1000, //更新数据时间为1秒
1, //位置间隔为1米
//位置监听器
new LocationListener() { //GPS定位信息发生改变时触发,用于更新位置信息
@Override
public void onLocationChanged(Location location) {
//GPS信息发生改变时,更新位置
locationUpdates(location);
}
@Override
//位置状态发生改变时触发
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
//定位提供者启动时触发
public void onProviderEnabled(String provider) {
}
@Override
//定位提供者关闭时触发
public void onProviderDisabled(String provider) {
}
});
//从GPS获取最新的定位信息
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//将最新的定位信息传递给创建的locationUpdates()方法中
locationUpdates(location);
}
private void initEvent() {
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
if (i == rg_normally.getId()) {
mBaiduMap.setMapType(MAP_TYPE_NORMAL);
} else if (i == rg_GPS.getId()) {
mBaiduMap.setMapType(MAP_TYPE_SATELLITE);
}
}
});
rg_lk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//开启交通图
mBaiduMap.setTrafficEnabled(b);
}
});
rg_rl.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//开启热力图
mBaiduMap.setBaiduHeatMapEnabled(b);
}
});
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
@Override
protected void onStart() { //启动地图定位
mBaiduMap.setMyLocationEnabled(true);
super.onStart();
}
@Override
protected void onStop() { //停止地图定位
super.onStop();
mBaiduMap.setMyLocationEnabled(false);
}
public void locationUpdates(Location location) { //获取指定的查询信息
//如果location不为空时
if (location != null) {
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); //获取用户当前经纬度
Toast.makeText(this, "yes获取到GPS信息", Toast.LENGTH_SHORT).show();
Log.i("Location", "纬度:" + location.getLatitude() + " | 经度:" + location.getLongitude());
if (isFirstLoc) {
//MapStatusUpdate描述地图将要发生变化的类
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);//以动画方式更新地图状态,默认动画耗时 300 ms
isFirstLoc = false;
}
//构造定位数据:
MyLocationData myLocationData = new MyLocationData.Builder().accuracy(location.getAccuracy())
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
mBaiduMap.setMyLocationData(myLocationData);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher_background);
locationMode = MyLocationConfiguration.LocationMode.NORMAL;
MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(locationMode, true, bitmapDescriptor);
mBaiduMap.setMyLocationConfiguration(myLocationConfiguration);
} else {
Log.i("Location", "没有获取到GPS信息");
//否则输出空信息
Toast.makeText(this, "no???", Toast.LENGTH_SHORT).show();
}
}
}
xml不变
我也不藏着了,大家一起用