0

我正在用 Java 编写一个 Android 应用程序。该活动包含一个谷歌地图,我想要的是在顶部有一个按钮位置,如图所示: 在此处输入图像描述

我希望当我单击该位置以指向我当前的位置时,我正在使用FusedLocationProviderClient类。

当我运行程序时,一切都很好,直到我按顺序执行以下步骤:1-第一次运行应用程序,我拒绝权限 2-第二次运行应用程序。它再次请求权限,所以我回答好,但按钮没有出现。3-我关闭了应用程序,因为我上次对位置许可说是,所以按钮在地图上并且正在工作。

这是我的代码:

 private void checkPermissions(int fineLocationPermission) {
        if (fineLocationPermission != PackageManager.PERMISSION_GRANTED) { //If we don't have any permissions yet
            // TODO: Consider calling
            //We have to request permissions and in case the user refuse the permission we show an explanation of why he needs the permission
            //The following method returns true in case the user reject the permission
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        PERMISSION_REQUEST_CODE);

        } else
            mLocationPermissionGranted=true;
    }

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //If the user accepts the dialog box then we get the last location and show button
                    mLocationPermissionGranted=true;

                } else {
                    mLocationPermissionGranted=false;
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                    Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
                }
        }
    }

 public void onLocationChanged(final Location location) {
        String msg = "Updated location: " +
                Double.toString(location.getLatitude()) + ", " +
                Double.toString(location.getLongitude());
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        final LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

        //Show button to locate current position

        mMap.setOnMyLocationButtonClickListener(new GoogleMap.OnMyLocationButtonClickListener() {
            @Override
            public boolean onMyLocationButtonClick() {
                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                CameraUpdateFactory.newLatLngZoom(latLng,12);
                //mMap.setMaxZoomPreference(12);
                return false;
            }

        });

        // Add a marker our current position
        LatLng CurrentPosition = new LatLng(location.getLatitude(), location.getLongitude());
        mMap.addMarker(new MarkerOptions().position(CurrentPosition).title("Here you are!"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(CurrentPosition));
    }
 @Override
    public void onMapReady(GoogleMap googleMap) {
        //Create the map
        mMap = googleMap;

        //Set the type of the map: HYBRID, NORMAL, SATELLITE or TERRAIN. In our case TERRAIN type
        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);

        //Set the zoom
        mMap.setMaxZoomPreference(12);

        //Set the markers
        MarkerOptions markerOptions= new MarkerOptions();

        //Checking permissions with the permissions we have included in the manifiest
        checkPermissions(permissionCheckFineLocation);



        if (mLocationPermissionGranted) {
            try {
                mMap.setMyLocationEnabled(true);
                //Last location task
                Task<Location> locationResult = mFusedLocationClient.getLastLocation();

                locationResult.addOnSuccessListener(this, new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        //Got last known location. In some rare situations this can be null
                        if (location != null) {
                            //Logic to handle location object
                            onLocationChanged(location);
                        }
                    }
                });
            } catch (SecurityException e) {
                Log.e("error", e.getMessage());
            }
        }
}

我知道这是一个奇怪的问题,但我不知道如何表达自己。任何帮助都会很棒!先感谢您!

4

1 回答 1

2

onMapReady在授予权限后不会(再次)调用(这发生在 之后onMapReady)。

onMapReady将子句中的代码移动if (mLocationPermissionGranted)到单独的方法中,并从内部调用它if以及onRequestPermissionsResult如果授予权限则从调用它。

于 2018-11-22T22:54:20.783 回答