在MapsView中使用getMapAsync()时应用程序崩溃

时间:2016-03-24 05:20:10

标签: java android google-maps-android-api-2

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

这是我的代码

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {
    @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布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MapsActivity">

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

这是清单

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

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

感谢。

2 个答案:

答案 0 :(得分:1)

试试这个,

SupportMapFragment mapFragment =  ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));

    if(mapFragment != null) {
       mapFragment.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));
        }
    });
}

到setUpMap()方法,我试过这里。它的工作。请检查一次

答案 1 :(得分:0)

首先要注意的是,根据OnMapReadyCallback,此方法需要documentation。需要注意的主要规则是,

  • 必须从主线程调用此方法。
  • 如果用户的设备上未安装Google Play服务,则在用户安装之前不会触发回调。
  • 在创建后立即销毁GoogleMap的极少数情况下,不会触发回调。

如果没有正确遵循这些规则,您将无法获得正确的结果,或者应用可能会崩溃。因此,我建议您将OnMapReadyCallback用于getMapAsync方法。