Android студия получает последнее известное местоположение для карт и использует вращатель, чтобы установить радиус круга - PullRequest
0 голосов
/ 06 января 2020

Я создаю приложение с картами Google и радиусом окружности по центру местоположения пользователя. Я хочу, чтобы пользователь выбрал нужный радиус круга с помощью счетчика (радиус 1-10 км). Но когда я использую значение из моего счетчика, радиус-круг не появляется.

Для местоположения я могу получить синюю точку, показывающую мой внешний вид: map.setMyLocationEnabled (true); и я могу вручную ввести местоположение для карты, чтобы увеличить. Но когда я пытаюсь увеличить масштаб и установить центр круга на месте устройства, я получаю ошибку nullpointerexception. Ниже мой код для местоположения, и тост как раз для меня, чтобы увидеть, что я получаю фактическое местоположение.

private void getDeviceLocation() {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]
                {Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

        return;
    }
    Task<Location> task = mFusedLocationClient.getLastLocation();
    task.addOnSuccessListener(MainActivity.this, new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            if (location != null) {
                currentLocation = location;
                Toast.makeText(MainActivity.this, "Current Position " + currentLocation.getLongitude(), Toast.LENGTH_LONG).show(); //Just to make sure we have a value
                SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager()
                        .findFragmentById(R.id.map2);
                supportMapFragment.getMapAsync(MainActivity.this);
            }

        }
    });
}

Затем я использую userPosition для карты, чтобы увеличить масштаб и установить центр круга

    public void onMapReady(GoogleMap map) {

    LatLng userPosition = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());

    mGoogleMap = map;
    map.setMyLocationEnabled(true);
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(userPosition, 10f));

    map.addCircle(new CircleOptions()
            .center(userPosition)
            .radius(mapRadius)
            .strokeColor(0x330073FF)
            .fillColor(0x330073FF)
            .strokeWidth(2));

    map.getUiSettings().setZoomControlsEnabled(true);
    map.getUiSettings().setMyLocationButtonEnabled(true);
}

Но здесь я получаю сообщение об ошибке в строке userPosition: java .lang.NullPointerException: попытка вызвать виртуальный метод 'double android .location.Location.getLatitude ()' для ссылки на пустой объект в com .example.test.MainActivity.onMapReady (MainActivity. java: 362).

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

Что касается радиуса, он отлично работает, когда я задаю местоположение вручную и пишу. Он хорошо работает, если я сам пишу радиус в метрах. Но если я попытаюсь использовать мой счетчик и значение mapRadius, радиус-круг вообще не будет отображаться при запуске эмулятора. Это код в onCreate

spinnerRadius = findViewById(R.id.spinner_radius);
    ArrayAdapter<CharSequence> spinnerAdapter = ArrayAdapter.createFromResource(this,
            R.array.spinner_radius_option, android.R.layout.simple_spinner_item);
    spinnerRadius.setAdapter(spinnerAdapter);
    spinnerRadius.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            mapRadiusInput = parent.getItemAtPosition(position).toString();
            mapRadius = Double.parseDouble(mapRadiusInput)*1000; //converting to meters
            Toast.makeText(MainActivity.this, ""+mapRadius, Toast.LENGTH_LONG).show();
        }

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

1 Ответ

0 голосов
/ 07 января 2020

Когда вы добавляете круг, сохраняйте возвращаемое значение (Circle) в переменной поля, Circle myCircle.

Затем в onItemSelected обновите радиус круга со значением (в метрах) .

Итак, сначала объявите переменную как переменную поля класса (для видимости области позже). Я предполагаю, что все это в одном классе - если нет, вам нужно сделать эту переменную доступной для экземпляра обратного вызова onItemSelected.

private Circle myCircle;

Затем при добавлении круга сохраните его:

myCircle = map.addCircle(new CircleOptions()
        .center(userPosition)
        .radius(mapRadius)
        .strokeColor(0x330073FF)
        .fillColor(0x330073FF)
        .strokeWidth(2));

А в вашем onItemSelected обновите круг (в метрах)

myCircle.setRadius(mapRadius);

Вот еще один пример, показывающий то же самое: { ссылка }

И API делают c: https://developers.google.com/android/reference/com/google/android/gms/maps/model/Circle.html#setRadius (double)

Ключом является сохранение Circle при его создании. И как вы можете видеть из API, со ссылкой Circle есть и другие сеттеры, которые можно использовать.

...