Java Android studio获取地图的最后已知位置,并使用微调器设置圆半径

Java Android studio获取地图的最后已知位置,并使用微调器设置圆半径,java,android,google-maps,android-spinner,Java,Android,Google Maps,Android Spinner,我正在创建一个应用程序,它有一个谷歌地图和一个以用户位置为中心的圆半径。我希望用户使用微调器选择所需的圆半径(半径1-10公里)。但是当我使用微调器中的值时,半径圆不会出现 对于位置,我可以通过以下方式获得显示我外观的蓝点:map.setMyLocationEnabled(true);我可以手动输入地图要放大的位置。但当我试图放大并设置设备位置的圆心时,我得到了一个nullpointerexception错误。下面是我的位置代码,祝酒词只是为了让我看到我得到了实际的位置 private void

我正在创建一个应用程序,它有一个谷歌地图和一个以用户位置为中心的圆半径。我希望用户使用微调器选择所需的圆半径(半径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: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();
        }
spinnerRadius=findViewById(R.id.spinner\u半径);
ArrayAdapter spinnerAdapter=ArrayAdapter.createFromResource(此,
R.array.spinner\u radius\u选项,android.R.layout.simple\u spinner\u项);
喷丝头半径设置适配器(喷丝头适配器);
spinnerRadius.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
mapRadiusInput=parent.getItemAtPosition(position.toString();
mapRadius=Double.parseDouble(mapRadiusInput)*1000;//转换为米
Toast.makeText(MainActivity.this,“+mapRadius,Toast.LENGTH_LONG.show();
}

对于编程和android,我是一个初学者,我在这两个问题上花了不少时间,如果这两个问题很容易解决,我也不会感到惊讶。任何帮助或指点都将不胜感激。

添加圆时,将返回值(
circle
)保存在字段变量
circle myCircle

然后在所选的
使用值(以米为单位)更新圆半径

因此,首先将该变量声明为类字段变量(用于以后的范围可见性)。我假设这都在一个类中-如果不是,则需要使该变量可供
onItemSelected
回调实例访问

private Circle myCircle;
然后,在添加圆时,将其保存:

myCircle = map.addCircle(new CircleOptions()
        .center(userPosition)
        .radius(mapRadius)
        .strokeColor(0x330073FF)
        .fillColor(0x330073FF)
        .strokeWidth(2));
并在所选的
中更新圆圈(以米为单位)

下面是另一个显示相同内容的示例:

及API文件:


关键是在创建时保存
。从API中可以看到,有了
引用,还可以使用其他设置器。

您需要在
选中的
中更新圆
-请参见
addCircle>返回的
对象上的
设置半径
,只设置
地图半径
不会更新圆。只要空指针-发布的代码看起来很好-您在获得位置更新后获得地图,因此问题可能在其他地方。因此选择以1/1000米为单位?感谢您的回复!选择以公里为单位,但转换为米。我得到了e现在半径有问题,但我真的不知道如何解决。你能详细说明你的建议或给我一个代码吗?很好的描述,作为初学者它真的很有帮助。非常感谢你的帮助。
myCircle = map.addCircle(new CircleOptions()
        .center(userPosition)
        .radius(mapRadius)
        .strokeColor(0x330073FF)
        .fillColor(0x330073FF)
        .strokeWidth(2));
myCircle.setRadius(mapRadius);