代码之家  ›  专栏  ›  技术社区  ›  Mena

Android地图:我的位置按钮在活动首次启动时不起作用

  •  0
  • Mena  · 技术社区  · 6 年前

    但是,如果我关闭活动并返回到它,按钮工作正常之后!所以,问题只是在我第一次接受活动启动的权限之后。

    如果我在接受权限后重新创建活动,问题就解决了,但是我不喜欢这个解决方案,另外我想了解问题的原因。

    是什么导致了这个错误?

     public class MapsActivity extends FragmentActivity implements` OnMapReadyCallback {
    
            private GoogleMap mMap;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_maps);
    
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
    
            GoogleMapOptions options = new GoogleMapOptions();
            options.mapType(GoogleMap.MAP_TYPE_NORMAL);
    
            mapFragment.newInstance(options);
            mapFragment.getMapAsync(this);
        }
    

    public void onMapReady(GoogleMap googleMap) {
                mMap = googleMap;
                requestLocationPermissions();
                mMap.getUiSettings().setMapToolbarEnabled(true);
        }
    

     public void requestLocationPermissions() {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
                    PackageManager.PERMISSION_GRANTED ||
                    ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
                    PackageManager.PERMISSION_GRANTED){
    
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                        15);
            }else{
    
                mMap.setMyLocationEnabled(true);//needs location permission
                mMap.getUiSettings().setMyLocationButtonEnabled(true);
    
            }
        }
    

        @SuppressLint("MissingPermission")
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == 15) {
                if (grantResults.length == 0) {
                    requestLocationPermissions();
                } else {
                    if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED  ) {
                        Toast.makeText(this, "You have to accept all Permissions!", Toast.LENGTH_SHORT).show();
                        Log.e("Permission refused","Permission refused");
                        requestLocationPermissions();
                    } else {
                        if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED ) {
                        mMap.setMyLocationEnabled(true);
                        mMap.getUiSettings().setMyLocationButtonEnabled(true);
                       }
                    }
                }
            }
    
        }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Mihai Adrian    6 年前

    调试代码以检查首次授予权限时收到的纬度和经度值。此时可能无法设置位置。如果GPS还没有打开,获取精确位置有时需要更多的时间。我在一些用于测试的设备上也遇到了同样的问题。

        2
  •  0
  •   forlayo    6 年前

    我一直在努力解决这个问题,目前唯一的解决办法就是使用 fuse location client 检索设备的位置并为“我的位置”按钮添加自定义行为。

    通过这种方式,它可以一直工作,而无需重新加载活动。

    private void getDeviceLocation() {
            /*
             * Get the best and most recent location of the device, which may be null in rare
             * cases when a location is not available.
             */
            try {
                if (hasLocationPermission()) {
                    fusedLocationClient
                            .getLastLocation()
                            .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) {
                                        lastLocation = location;
                                        // Logic to handle location object
                                        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                                                new LatLng(location.getLatitude(),
                                                        location.getLongitude()), DEFAULT_ZOOM));
                                        mMap.setOnMyLocationButtonClickListener(MapsActivity.this);
                                        mMap.setMyLocationEnabled(true);
                                        mMap.getUiSettings().setMyLocationButtonEnabled(true);
                                    } else {
                                        mMap.setMyLocationEnabled(false);
                                        mMap.getUiSettings().setMyLocationButtonEnabled(false);
                                    }
                                }
                            });
                }
            } catch (SecurityException e) {
                Log.e("Exception: %s", e.getMessage());
            }
        }
    

    MapsActivity是GoogleMap.OnMyLocationButtonClickListener链接然后有这个密码

    @Override
    public boolean onMyLocationButtonClick() {
        // I've tried just setting the default behavior of the button, but just works after reloading
        // the activity, then I've managed the click event to latest location; now it works for
        // all cases.
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                new LatLng(lastLocation.getLatitude(),
                        lastLocation.getLongitude()), DEFAULT_ZOOM));
        return false;
    }
    

    这是onMapReady的代码

    @SuppressLint("MissingPermission")
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        mMap.getUiSettings().setZoomControlsEnabled(true);
    
        getMuseums();
    
        if (!hasLocationPermission()) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    REQUEST_PERMISSION_LOCATION);
            return;
        }
        getDeviceLocation();
    }
    

    我的默认缩放值是10。