在 MapsView 中使用 getMapAsync() 时应用崩溃 - Android

App crash when using getMapAsync() in MapsView - Android

我有一个 mapsview,它在使用 getMap() 时工作​​正常,尽管它向我显示了一个 depricated 警告。但是当我将 getMap() 更改为 getMapAsync() 时,应用程序将崩溃。

这是我的代码

public class MapsActivity extends AppCompatActivity implements GoogleMap.OnInfoWindowClickListener,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    GoogleMap.OnMarkerDragListener,
    GoogleMap.OnInfoWindowCloseListener,
    LocationListener {

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

        ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMapAsync(this);

        mMap.setOnInfoWindowClickListener(this);
        mMap.setOnInfoWindowCloseListener(this);
        mMap.setOnMarkerDragListener(this);

        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                markerPoints.add(latLng);
                MarkerOptions options = new MarkerOptions();
                // Setting the position of the marker
                options.position(latLng);
            }
        });

        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

            @Override
            public boolean onMarkerClick(Marker marker) {    
                //Getting the coordinates
                toLatitude = marker.getPosition().latitude;
                toLongitude = marker.getPosition().longitude;

                dest = new LatLng(toLatitude, toLongitude);
                mMap.animateCamera(CameraUpdateFactory.newLatLng(dest));

                return ((toLatitude == my_marker.getPosition().latitude) && (toLongitude == my_marker.getPosition().longitude));
            }
        });
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        setUpMap();
    }

    private void setUpMap() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mMap.setMyLocationEnabled(true);
        } else {
            Toast.makeText(MapsActivity.this, "Anda harus menyetujuinya agar dapat menikmati semua fitur yang ada", Toast.LENGTH_LONG).show();
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {
                mMap.setMyLocationEnabled(true);
            }
        }

        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        mMap.setTrafficEnabled(true);
        CameraPosition cameraPosition = new CameraPosition.Builder()
                .zoom(15)                   // Sets the zoom
                .target(new LatLng(-6.597629,106.79957))
                .tilt(40)                   // Sets the tilt of the camera to 30 degrees
                .build();                   // Creates a CameraPosition from the builder
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }
}

这是 xml 布局

   <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

我的代码有什么问题?任何帮助将不胜感激。

谢谢。

目前 getMapAsync 调用 onMapReady 尚未完成。确保 ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 不为空或 onMapReady() 已成功完成。

我想 mMap 是 GoogleMap 对象 here.What 你正在做的是在初始化之前使用 mMap 所以它必须抛出 空指针异常 .

Make sure to use mMap object in onMapReady Callback.Hope it solves your problem.So, in short all you need to do is place all your mMap usages in onMap Ready callback