Android 开发之 Google Mpas 定位到当前位置

under 谷歌地图  tag     Published on May 14th , 2021 at 04:45 pm

上篇文章已经说明怎么在手机里运行出谷歌地图,不赘述了。

官方文档对 Google Play 服务的依赖性描述

文档中类的说明

添加依赖:

com.google.android.gms:play-services-location:18.0.0

65313023.png

定位到当前位置

1、声明。

private static final int REQUESTCODE = 6001;
FusedLocationProviderClient fusedLocationProviderClient;
Location currentLocation;

2、确认是否开启GPS,回调。没多写,如果未开启位置信息直接跳转。

    private void openGPS() {
        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || !locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            // 设置跳转开启权限
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivityForResult(intent, REQUESTCODE);
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUESTCODE: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 授权处理
                    fetchLastLocation();
                }
                break;
            }
        }
    }

3、获取当前可用的最佳最新位置并添加任务成功监听。

    private void fetchLastLocation() {
        //判断是否已经申请权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUESTCODE);
            return;
        }
        //返回当前可用的最佳最新位置。添加任务成功监听
        fusedLocationProviderClient.getLastLocation()
                .addOnSuccessListener(new OnSuccessListener<Location>() {
                    @SuppressLint("MissingPermission")
                    @Override
                    public void onSuccess(Location location) {
                        if (location != null) { //能成功获取位置信息时
                            //获得当前位置信息
                            currentLocation = location;

                            //创建地图片段。将组件添加到应用程序中。
                            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
                            //初始化地图系统和视图。设置一个回调对象,当GoogleMap 准备使用实例时将触发该对象。(回调方法:onMapReady)
                            mapFragment.getMapAsync(MapsActivity.this);

                        } else { //获取到的位置信息为空时
                            //创建位置请求。
                            LocationRequest locationRequest = LocationRequest.create();
                            //设置请求的优先级。PRIORITY_HIGH_ACCURACY:更可能使用GPS
                            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                            //设置活动位置更新所需的时间间隔(以毫秒为单位)。
                            locationRequest.setInterval(2000);
                            //明确设置位置更新的最快间隔(以毫秒为单位)。
                            locationRequest.setFastestInterval(1000);
                            //在指定的Looper线程上使用回调请求位置更新。
                            fusedLocationProviderClient.requestLocationUpdates(locationRequest, mLocationCallback, Looper.getMainLooper());
                        }
                    }
                });
    }

4、请求位置更新的结果回调

    private LocationCallback mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null || locationResult.getLastLocation() == null) {
                return;
            }
            //获取到位置信息
            currentLocation = locationResult.getLastLocation();
            //创建地图片段。将组件添加到应用程序中。
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
            //初始化地图系统和视图。设置一个回调对象,当GoogleMap 准备使用实例时将触发该对象。(回调方法:onMapReady)
            mapFragment.getMapAsync(MapsActivity.this);

        }
    };

5、重写 onMapReady()。

        // 删除之前的标记,不删除会创建很多 Marker
        googleMap.clear();

        //使用当前位置的纬度和经度(以度为单位)构造LatLng。
        LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());

        List<Address> result = null;
        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        try {
            result = geocoder.getFromLocation(currentLocation.getLatitude(), currentLocation.getLongitude(), 1);
            Log.d("位置", "onMapReady: "+result);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //绘制当前位置标记
        MarkerOptions markerOptions = new MarkerOptions()
                .icon(BitmapDescriptorFactory.defaultMarker())
                .position(latLng)
                .title(result.get(0).getAddressLine(0));

        //在此地图上添加当前位置上设置的标记。
        googleMap.addMarker(markerOptions);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()), 17));

6、当用户切换到另一个程序时,在 onPause() 中停止更新。

    @Override
    protected void onPause() {
        super.onPause();
        stopLocationUpdates();
    }

    private void stopLocationUpdates() {
        fusedLocationProviderClient.removeLocationUpdates(mLocationCallback);
    }

7、onCreate() 中使用。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        
        openGPS();
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
        fetchLastLocation();
    }

本文由 surface 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:October 15th , 2021 at 05:26 pm
分享到:Twitter  Weibo  Facebook