2013-02-24 1 views
0

Я пытаюсь внедрить Maps v2 в вкладках панели действий. Вкладка карты - это фрагмент, который унаследован от MapFragment. Сила приложения закрывается после нажатия на вкладку «Карты». Он дает исключение из null-указателя внутри метода onStart, где вызывается getMap(). Вот код. Скажите, где я ошибаюсь.вызов getMap() внутри onStart() в MapFragment дает nullpointerexception

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  
     }  

}

Edit: Я думаю, что этот код не должен быть записан в методе OnStart потому что карта не отображается, то. Как узнать, что карта была загружена, чтобы получить ее объект?

ответ

1

Получение нулевой карты в OnStart означает, что API служб Google еще не начался.

Это часто связано с отсутствием разрешений или недействительным ключом Google API или сервисами Google Play, которые не активируются на главном устройстве.

Вы можете получить более подробную информацию, отправляя вас AndroidManifest, а также ваши maplayout.xml

И перед запуском карты деятельности, вы должны заботиться о стоимости:

GooglePlayServicesUtil.isGooglePlayServicesAvailable(anyActivity) 

который будет возвращать указание о состоянии Служб Google Play

+0

Хороший звонок при необходимости проверки наличия игровых сервисов, все приложения должны обрабатывать это, потому что новый телефон не будет установлен. – deepwinter