百度地图SDK开启时自动定位自己的位置,并且完善权限动态申请,记得开启手机定位!!!!(续前两节教程,这次不讲原理,直接上代码)

百度地图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不变

我也不藏着了,大家一起用

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值