0

我正在尝试在操作栏选项卡中实现 Maps v2。地图选项卡是从 MapFragment 继承的片段。单击地图选项卡后,应用程序强制关闭。它在调用 getMap() 的 onStart 方法中给出空指针异常。这是代码。请告诉我哪里错了。

    public class MapActivity extends MapFragment implements LocationListener  {
int mNum;
GoogleMap googleMap;  


public static MapActivity newInstance() {
    MapActivity f = new MapActivity();

    // Supply num input as an argument.
    Bundle args = new Bundle();
    //args.putInt("num", num);
    //f.setArguments(args);

    return f;
}

/**
 * When creating, retrieve this instance's number from its arguments.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.maplayout, container, false);

    return v;
}


/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
public void onStart(){
    super.onStart();

    googleMap=getMap();

    // Enabling MyLocation Layer of Google Map
            googleMap.setMyLocationEnabled(true);               


             getActivity();
            // Getting LocationManager object from System Service LOCATION_SERVICE
            LocationManager locationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);

            // Creating a criteria object to retrieve provider
            Criteria criteria = new Criteria();

            // Getting the name of the best provider
            String provider = locationManager.getBestProvider(criteria, true);

            // Getting Current Location
            Location location = locationManager.getLastKnownLocation(provider);

            if(location!=null){
                    onLocationChanged(location);
            }

            locationManager.requestLocationUpdates(provider, 20000, 0, this);


         // Setting a click event handler for the map
            googleMap.setOnMapClickListener(new OnMapClickListener() {

                @Override
                public void onMapClick(LatLng latLng) {

                    // Creating a marker
                    MarkerOptions markerOptions = new MarkerOptions();

                    // Setting the position for the marker
                    markerOptions.position(latLng);

                    // Setting the title for the marker.
                    // This will be displayed on taping the marker
                    markerOptions.title(latLng.latitude + " : " + latLng.longitude);

                    // Clears the previously touched position
                    //googleMap.clear();

                    // Animating to the touched position
                    googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

                    // Placing a marker on the touched position
                    googleMap.addMarker(markerOptions);
                }
            });


        }


        @Override
        public void onLocationChanged(Location location) {

            TextView tvLocation = (TextView) getActivity().findViewById(R.id.tv_location);

            // Getting latitude of the current location
            double latitude = location.getLatitude();

            // Getting longitude of the current location
            double longitude = location.getLongitude();     

            // Creating a LatLng object for the current location
            LatLng latLng = new LatLng(latitude, longitude);

            // Showing the current location in Google Map
            googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

            // Zoom in the Google Map
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));

            // Setting latitude and longitude in the TextView tv_location
            tvLocation.setText("Latitude:" +  latitude  + ", Longitude:"+ longitude );      

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub      
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub      
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub      
        }       

}

编辑:我认为这段代码不应该写在 onStart 方法中,因为那时地图没有显示。如何知道地图已经加载,获取它的对象?

4

1 回答 1

1

在 OnStart 中获取空地图意味着 Google 服务 API 尚未启动。

这通常是由于缺少权限、无效的 Google API 密钥或未在主机设备上激活 Google Play 服务。

您可以通过发布 AndroidManifest 以及 maplayout.xml 来获取更多信息

在启动您的地图活动之前,您应该注意以下各项的价值:

GooglePlayServicesUtil.isGooglePlayServicesAvailable(anyActivity)

这将返回有关 Google Play 服务状态的指示

于 2013-02-24T09:35:13.333 回答