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



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

对于位置,我可以通过以下方式获得显示我外观的蓝点:map.setMyLocationEnabled(true(;我可以手动输入地图放大的位置。但是当我尝试放大并在设备位置上设置圆心时,我收到一个空指针异常错误。下面是我的位置代码,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的地图来放大并设置圆心

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((' at com.example.test.MainActivity.onMapReady(MainActivity.java:362(.

我从教程中获取了代码,它似乎对他们有用,并尝试了许多不同的教程以及略有不同的代码,所以不确定我做错了什么。我尝试过搜索,知道其他人也有类似的问题,但仍然没有让它工作。

至于半径,当我设置手动位置并写下它时效果很好,如果我自己以米为单位写半径,它会很好用。但是,如果我尝试使用微调器和 mapRadius 值,则在运行模拟器时根本不会显示半径圆。这是在创建中的代码

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(双(

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

相关内容

  • 没有找到相关文章

最新更新