Mapapi v2 en android causando error en el fragmento

Estoy teniendo poco problema en la aplicación del mapa en el fragment . A continuación se muestra mi código.

 import android.app.Fragment; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.tfick.android.R; public class PoiFragment extends Fragment{ private GoogleMap mGoogleMap; private static final LatLng SYDNEY = new LatLng(23.03,72.62); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v=inflater.inflate(R.layout.poi_fragment, container,false); MapFragment mMapFragment = MapFragment.newInstance(); FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.container1, mMapFragment); fragmentTransaction.commit(); if(mGoogleMap ==null){ /*initializing map */ mGoogleMap=mMapFragment.getMap(); /*cretaing custom camera position*/ CameraPosition mCameraPosition=new CameraPosition.Builder().target(SYDNEY).bearing(0).tilt(30).build(); /*setting custom camera position*/ mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition)); /*adding custom marker on the map.*/ mGoogleMap.addMarker(new MarkerOptions().draggable(true).position(new LatLng(22.03, 72.56)).title("hello world").snippet("Ahmedabad").icon(BitmapDescriptorFactory.fromResource(R.drawable.wifi))); mGoogleMap.addMarker(new MarkerOptions().draggable(true).position(new LatLng(23.03, 78.10)).title("hello world").snippet("Baroda").icon(BitmapDescriptorFactory.fromResource(R.drawable.wifi))); } if(mGoogleMap !=null){ /* map is already initialized then setting map type */ /* * normal * satellite * hybrid * terrain * none */ mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); } return v; } } 
 03-01 12:15:31.439: E/AndroidRuntime(9299): FATAL EXCEPTION: main 03-01 12:15:31.439: E/AndroidRuntime(9299): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tfick.android/com.tfick.android.PointOfIntrest}: java.lang.NullPointerException: CameraUpdateFactory is not initialized 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.access$600(ActivityThread.java:140) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.os.Handler.dispatchMessage(Handler.java:99) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.os.Looper.loop(Looper.java:137) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.main(ActivityThread.java:4898) 03-01 12:15:31.439: E/AndroidRuntime(9299): at java.lang.reflect.Method.invokeNative(Native Method) 03-01 12:15:31.439: E/AndroidRuntime(9299): at java.lang.reflect.Method.invoke(Method.java:511) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 03-01 12:15:31.439: E/AndroidRuntime(9299): at dalvik.system.NativeStart.main(Native Method) 03-01 12:15:31.439: E/AndroidRuntime(9299): Caused by: java.lang.NullPointerException: CameraUpdateFactory is not initialized 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.google.android.gms.internal.at.a(Unknown Source) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.google.android.gms.maps.CameraUpdateFactory.J(Unknown Source) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.google.android.gms.maps.CameraUpdateFactory.newCameraPosition(Unknown Source) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.tfick.fragment.PoiFragment.onCreateView(PoiFragment.java:51) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.BackStackRecord.run(BackStackRecord.java:635) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.Activity.performStart(Activity.java:5215) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073) 03-01 12:15:31.439: E/AndroidRuntime(9299): ... 11 more 

Gracias a mí i encontrar la solución si alguna vez tienen el mismo problema de uso siguiente código.

 import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.tfick.android.R; public class PoiFragment extends MapFragment { /*object of google map*/ public GoogleMap mGoogleMap; /* summy location*/ private static final LatLng SYDNEY = new LatLng(23.03, 72.62); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); if (getMap() != null) { Log.d(getClass().getSimpleName(), "Map ready for use!"); mGoogleMap = getMap(); /* cretaing custom camera position */ CameraPosition mCameraPosition = new CameraPosition.Builder() .target(SYDNEY).bearing(0).tilt(30).build(); Log.i("gmap", mGoogleMap.toString()); /* setting custom camera position */ mGoogleMap.animateCamera(CameraUpdateFactory .newCameraPosition(mCameraPosition)); /* adding custom marker on the map. */ mGoogleMap .addMarker(new MarkerOptions() .draggable(true) .position(new LatLng(22.03, 72.56)) .title("hello world") .snippet("Ahmedabad") .icon(BitmapDescriptorFactory .fromResource(R.drawable.wifi))); mGoogleMap .addMarker(new MarkerOptions() .draggable(true) .position(new LatLng(23.03, 78.10)) .title("hello world") .snippet("Baroda") .icon(BitmapDescriptorFactory .fromResource(R.drawable.wifi))); } } } 

Inicialice CameraUpdateFactory.
Según la documentación –
Llamada Inicializar (Contexto) . Mientras no se lance una excepción GooglePlayServicesNotAvailableException , esta clase se inicializará correctamente.

Enlazar-
http://developer.android.com/reference/com/google/android/gms/maps/MapsInitializer.html#initialize(android.content.Context)
Cómo inicializar –

 try { MapsInitializer.initialize(this /*the context*/); } catch (GooglePlayServicesNotAvailableException e) { e.printStackTrace(); } 

Referencia – mapview y cameraupdate en api v2

El problema es que getMap() devuelve null y por CameraUpdateFactory tanto CameraUpdateFactory lanza las excepciones ya que necesita un GoogleMap inicializado.

Tuve un problema similar al usar un MapFragment dentro de un Fragment . Lo solucioné moviendo la inicialización del mapa a OnResume .

La implementación del mapa de Google depende en gran medida de varios métodos de ciclo de vida (onCreate, onCreateView, onDestroy, onResume y onPause). Debe retransmitir esas llamadas al MapFragment si lo encapsula dentro de su propio fragmento. El mapa ya debe ser inicializado después de llamar a mapView.getMap () y obtener un GoogleMap a cambio.

Si obtiene null de getMap (), varias cosas podrían haber ocurrido:

  • No has llamado onCreate y / o onCreateView en el MapFragment (llamar a getMap () después de esos métodos)
  • Te falta la entrada de la característica OpenGL ES 2 en tu manifiesto
  • Te faltan los permisos necesarios para los mapas
  • Los Servicios SDK de Google Play no están instalados en el dispositivo o son demasiado antiguos

He leído sobre la solución de inicialización (this) bastante a menudo aquí en StackOverflow, pero en realidad no es necesario en la mayoría de los casos.

EDIT: Acabo de ver que está agregando el Mapfragment a través de una transacción. ¿Ha considerado utilizar un MapView en su lugar dentro de su PoiFragment? Creo que al usar el MapFragment y agregarlo a través de una transacción obtendrá un problema de tiempo. La transacción no se ha terminado propably mientras que usted está todavía en su método de PoiFragment.onCreateView (por lo tanto mapas no se inicializa, todavía). Usted podría intentar usar onResume pero usted tendría que cerciorarse de, que usted init su código del mapa solamente una vez que onResume será llamado más a menudo.

Mis sugerencias en términos de arquitectura:

  • Utiliza MapFragment directamente dentro de tu actividad si es factible
  • Extiende el Mapfragment si tienes código suficiente para poner allí

Me enfrenté exactamente al mismo problema. Este error ocurre cuando getMap() devuelve null .

Hice lo siguiente:

 SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); googleMap = mapFragment.getMap(); /* if googleMap == null then there may be following problem : * 1. google play service version are not matching on both device and installed apk.Will show update message on map. * 2. No google play service installed. Will show a install message on map. */ if (googleMap != null) { LatLng iniLoc = new LatLng(44.97651081283853, -93.2245754142059); googleMap.moveCamera(CameraUpdateFactory.newLatLng(iniLoc)); googleMap.getUiSettings().setZoomGesturesEnabled(false); currentMarkerOption = new MarkerOptions(); currentMarkerOption.position(iniLoc); currentMarker = googleMap.addMarker(currentMarkerOption); currentMarker.setIcon((BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))); currentMarker.setTitle("Current Position"); currentMarker.showInfoWindow(); currentMarker.setVisible(false); initDestinationMarker(); } 
  • La aplicación sigue fallando al utilizar Google API V2
  • Error de error de autorización de Google
  • Comparación de dos objetos LatLng en google map v2 android
  • No se han encontrado los recursos de los servicios de Google Play. Compruebe la configuración del proyecto para asegurarse de que se incluyen los recursos
  • Android: Google map api versión 2
  • Ocultar infowindow android map api v2
  • ¿Cómo mostrar varios marcadores en MapFragment en Google Map API v2?
  • OnMapReady no llamando aunque la visualización del mapa sin ningún error
  • Google Map API V2 - ¿Cómo puedo mantener un marcador en el centro de la pantalla mientras el usuario está desplazando el mapa?
  • Establecer el ancho de InfoWindow personalizado en Google Maps api v2
  • La biblioteca de soporte de Android v4 y la API de Google Maps rompen la compilación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.