Невозможно обновить текущее местоположение fusedlocationclient

Я использую объединенный поставщик местоположения для получения текущего местоположения и обновляю свой маркер до моего текущего местоположения с помощью этого. Я даю разрешение приложению, и после этого оно ничего не делает. Хотя я написал код для этого, чтобы получать и обновлять местоположение на карте. Я ранее также указывал Access_COARSE_LOCATION, но ничего не меняется. это мой код: -

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private FusedLocationProviderClient mFusedLocationClient;

    private static final int LOCATION_PERMISSION_REQUEST_CODE = 537;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
    }

    private void init() {
    //    Initializing Objects...
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        if (mapFragment != null) {
            mapFragment.getMapAsync(this);
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
    // onMapReady check Permission and load map...
    // If Permission not granted ask for permission...
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mMap = googleMap;
            MoveCameraToCurrentPosition();
        } else {
            AskUserPermission();
        }
    }


    public void AskUserPermission() {
        //   Show Explanation and show permission dialog...
        //   Permission is not granted
        //   Show Explanation...

        //   shouldShowRequestPermissionRationale returns true if permission has previously
        //   denied by user..

        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Why we need Location Permission?");
            builder.setMessage("we want to forecast the weather alert like storms, Flood," +
                    "Hurricanes, etc. to you before hand based on your farm location, so that " +
                    "we can save your crops :).");
            builder.setNeutralButton("Got it.", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();
                    RequestLocationPermission();
                }
            });
            builder.show();
            RequestLocationPermission();
        } else {
            //  No Explanation Needed Request Permission...
            RequestLocationPermission();
        }
    }

    // Show Alert Dialog for permission...
    private void RequestLocationPermission() {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission
                .ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION},
                LOCATION_PERMISSION_REQUEST_CODE);
    }

    // Fetch Request Permission result and update current location...
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case LOCATION_PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // This code is not executing even after giving permission..
                    MoveCameraToCurrentPosition();
                }
                break;
        }

    }
    // Move camera to current location...
    private void MoveCameraToCurrentPosition(){
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mFusedLocationClient.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) {
                                // Add a marker in Sydney, Australia, and move the camera.
                                LatLng sydney = new LatLng(location.getLatitude(), location.getLongitude());
                                mMap.addMarker(new MarkerOptions().position(sydney).icon(BitmapDescriptorFactory.fromResource(R.drawable.barley)).title("Your Location"));
                                CameraPosition cameraPosition = new CameraPosition(sydney, 10, 0, 0);
                                CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
                                mMap.animateCamera(cameraUpdate);
                            }
                        }
                    });
        } else {
            AskUserPermission();
        }
    }
}

Добавьте журнал. Это ваше устройство нашло ваше текущее местоположение или нет.

Shaon 10.09.2018 10:41

Я добавил его, но после того, как я даю разрешение своему приложению, ничего не происходит. В журнале ничего не печатается. он перестает печатать внутри журналов.

Avi Patel 10.09.2018 10:43

Вы уверены, что включили службу определения местоположения на устройстве?

Ashvin solanki 10.09.2018 10:45

@Ashvinsolanki, после того, как я разрешаю разрешение на местоположение, я проверяю настройку приложения и разрешение, которое оно предоставлено. но код не выполняется для определения местоположения.

Avi Patel 10.09.2018 10:47

@AviPatel Я не говорю о разрешении, я говорю, вы использовали службу определения местоположения на устройстве

Ashvin solanki 10.09.2018 10:50

установите точку отладки в методе moveCamera. тогда посмотрим, что произошло. так что отлаживайте сейчас

Shaon 10.09.2018 10:50

после того, как я установил точку отладки, его камера перемещается в мою текущую позицию.

Avi Patel 10.09.2018 10:52
1
7
370
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, моя проблема заключалась в том, что я не звонил getMapAsync после того, как разрешил разрешение на местоположение, что делало мой объект карты Google нулевым, и поэтому не было возможности переместить мою камеру в мое текущее местоположение. Я обновил свой код, и теперь он работает нормально.

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap googleMap;
    private String TAG = this.getClass().getSimpleName();
    private FusedLocationProviderClient mFusedLocationClient;
    private SupportMapFragment mapFragment;

    private static final int LOCATION_PERMISSION_REQUEST_CODE = 537;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        if (mapFragment != null) {
            mapFragment.getMapAsync(this);
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            if (googleMap != null) {
                this.googleMap = googleMap;
                MoveCameraToCurrentPosition();
            } else {
                Toast.makeText(this, "Null Object...OnMapReady", Toast.LENGTH_SHORT).show();
            }
        } else {
            AskUserPermission();
        }
    }


    public void AskUserPermission() {
        //   Show Explanation and show permission dialog...
        //   Permission is not granted
        //   Show Explanation...

        //   shouldShowRequestPermissionRationale returns true if permission has previously
        //   denied by user..

        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Why we need Location Permission?");
            builder.setMessage("we want to forecast the weather alert like storms, Flood," +
                    "Hurricanes, etc. to you before hand based on your farm location, so that " +
                    "we can save your crops :).");
            builder.setNeutralButton("Got it.", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();
                }
            });
            builder.show();
        }
        RequestLocationPermission();
    }

    private void RequestLocationPermission() {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission
                        .ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
                LOCATION_PERMISSION_REQUEST_CODE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case LOCATION_PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (googleMap != null) {
                        MoveCameraToCurrentPosition();
                    } else {
                        if (mapFragment != null) {
                            mapFragment.getMapAsync(this);
                        }
                    }
                }
                break;
        }

    }

    private void MoveCameraToCurrentPosition() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mFusedLocationClient.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) {
                                // Add a marker in Sydney, Australia, and move the camera.
                                LatLng sydney = new LatLng(location.getLatitude(), location.getLongitude());
                                googleMap.addMarker(new MarkerOptions().position(sydney).icon
                                        (BitmapDescriptorFactory.fromResource(R.drawable.barley)).title("Your Location"));
                                CameraPosition cameraPosition = new CameraPosition(sydney, 10, 0, 0);
                                CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
                                googleMap.animateCamera(cameraUpdate);
                            }
                        }
                    });
        } else {
            AskUserPermission();
        }
    }
}

Другие вопросы по теме