java - Android studio 获取 map 的最后已知位置并使用微调器设置圆半径

标签 java android google-maps android-spinner

我正在创建一个带有谷歌地图和以用户位置为中心的圆半径的应用程序。我希望用户用旋转器选择所需的圆半径(1-10 公里半径)。但是当我使用微调器中的值时,半径圆不会出现。

对于位置,我可以通过以下方式获取显示我外观的蓝点:map.setMyLocationEnabled(true);我可以手动输入 map 放大的位置。但是,当我尝试放大并在设备位置设置圆心时,出现 nullpointerexception 错误。下面是我的位置代码, toast 只是为了让我看到我获得了实际位置。

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 进行 map 放大并设置圆心

    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: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' 行上收到错误 userPosition: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference 在 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 方面的初学者,我在这两个问题上花了很多时间,如果它很容易解决,我也不会感到惊讶。任何帮助或指示将不胜感激。

最佳答案

添加圆圈时,将返回值 (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);

这是另一个显示相同内容的示例:https://stackoverflow.com/a/38454501/2711811

API 文档:https://developers.google.com/android/reference/com/google/android/gms/maps/model/Circle.html#setRadius(double)

关键是在创建Circle时保存它。正如您从 API 中看到的,通过 Circle 引用,还可以使用其他 setter。

关于java - Android studio 获取 map 的最后已知位置并使用微调器设置圆半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59610106/

相关文章:

java - 映射到许多值

java - 使用jboss5线程池启动线程

android - 更改 IP 地址以在真实设备上运行 MobileFirst Android 应用程序

android - 如何在 Android 和 Linux 上将 JPG 文件解码为相同的位图?

java - SQL 查询中列名称前面的值是什么?

java - Spring boot userRepository.findAll() 显示太多次并导致 stackoverflow 错误

java - 如何将字符串从 json 转换为 float 组?

java - 如何限制 Google map 中的缩放级别和可视区域?

javascript - 导出 KML 谷歌地图

javascript - map.fitBounds 之后有回调吗?