在标签式Android应用程序中获取谷歌地图

时间:2015-07-06 19:35:44

标签: android google-maps android-fragments google-maps-api-2 android-tabs

我花了一些时间试图让它工作,我不断在每个教程的某个地方卡住。简而言之,我正在尝试创建一个标签式应用程序,其中一个标签是谷歌地图。

我已经解决了所有常见的错误:

我已经通过SDK下载了所有相关内容。 我有一个API密钥。 我添加了编译com.google.android.gms:play-services:7.5.0 to my dependencies.

我正在尝试关注this code,但它并没有完全为我工作,所以我稍微改了一下,但我还是碰壁了。

我当前的错误是java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized。我想这会在getMapAsync初始化。

这是我的java代码:

public class MapFragment extends Fragment{

    MapView mMapView;
    private GoogleMap googleMap;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // inflat and return the layout
        View v = inflater.inflate(R.layout.fragment_location_info, container,
                false);

        mMapView = (MapView) v.findViewById(R.id.mapView);
        mMapView.onCreate(savedInstanceState);

        mMapView.onResume();// needed to get the map to display immediately

        mMapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                MapsInitializer.initialize(getApplicationContext());
                // latitude and longitude
                double latitude = 17.385044;
                double longitude = 78.486671;


                // create marker
                MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");

                // Changing marker icon
                marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
            }
        });

        //MapsInitializer.initialize(getApplicationContext());

        googleMap = mMapView.getMap();
        // latitude and longitude
        double latitude = 17.385044;
        double longitude = 78.486671;


        // create marker
        MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");

        // Changing marker icon
        marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

        // adding marker
        googleMap.addMarker(marker);

        CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(17.385044, 78.486671)).zoom(12).build();

        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

        // Perform any camera updates here
        return v;
    }

    @Override
    public void onResume() {
        super.onResume();
        mMapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mMapView.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mMapView.onLowMemory();
    }
}

1 个答案:

答案 0 :(得分:1)

看起来您的代码正处于转型过程中。您同时拨打getMapAsync()getMap()

只需使用getMapAsync(),在获得onMapReady()回调之前不要对地图执行任何操作。

此外,您不需要MapsInitializer。来自文档:

  

如果使用此功能,请使用此课程初始化Google Maps Android API   需要在获取地图之前使用。它必须被调用,因为有些   需要BitmapDescriptorFactory和CameraUpdateFactory等类   要初始化。

     

如果您正在使用MapFragment或MapView并且已经获得了   (非null)GoogleMap通过在其中任何一个类上调用getMap(),   那你就不用担心这门课了。看样品   申请一些例子。

以下是您修改的代码:

public class MapFragment extends Fragment implements OnMapReadyCallback {

        MapView mMapView;
        private GoogleMap googleMap;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // inflate and return the layout
            View v = inflater.inflate(R.layout.fragment_location_info, container,
                    false);

            mMapView = (MapView) v.findViewById(R.id.mapView);
            mMapView.onCreate(savedInstanceState);

            //mMapView.onResume(); // should not be needed

            mMapView.getMapAsync(this);

            //MapsInitializer.initialize(getApplicationContext());

            // Perform any camera updates here
            return v;
        }

        @Override
        public void onMapReady(GoogleMap gMap) {

            googleMap = gMap;

            mMapView.onResume(); //call this here if you really need to

            //MapsInitializer.initialize(getApplicationContext());
            // latitude and longitude
            double latitude = 17.385044;
            double longitude = 78.486671;

            // create marker
            MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");

            // Changing marker icon
            marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

            // adding marker
            googleMap.addMarker(marker);

            CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(17.385044, 78.486671)).zoom(12).build();

            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

        }
   //.........................