La API de Android de Google Maps v2 genera GooglePlayServicesNotAvailableException, desactualizado, SupportMapFragment.getMap () devuelve null

Estoy tratando de incorporar el nuevo Google Maps Android API v2 en una aplicación que utiliza la biblioteca de soporte de Android. He pasado por muchas iteraciones para intentar llegar a algún lugar para trabajar y ahora me he rendido y pensé que debería preguntar aquí.

Fui a la Consola de API, creé un proyecto, habilité la API de Google Maps v2 para Android, creé una CLAVE de depuración según fuera necesario y la pegué en el manifiesto. No hay problemas de autenticación ni nada de eso. Bastante seguro de que hice esto bien

En mi proyectolibs carpeta que puseandroid-support-v4.jar (a través del proyecto, haga clic con el botón derecho-> Android-> Agregar biblioteca de soporte ...). En Eclipse hice Archivo-> Importar-> Android-> Código de Android existente en Workspace e importé el último (rev 3) de android-sdk / google / google_play_services / libproject / google-play-services_lib. Luego lo agregué como una biblioteca de dependencias a mi proyecto (proyecto, haga clic con el botón derecho del mouse-> Propiedades-> Android-> Agregarlo como una dependencia de la biblioteca en la parte inferior.

En mi manifiesto tengo:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
    <permission
      android:name="myapp.permission.MAPS_RECEIVE"
      android:protectionLevel="signature"/>

    <All the uses-permission required like INTERNET, ACCESS_NETWORK_STATE, WRITE_EXTERNAL_STORAGE, FINE AND COARSE LOCATION, etc>
    <uses-permission android:name="myapp.permission.MAPS_RECEIVE"/>
    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
    <application ...>
        ...
        <uses-library android:name="com.google.android.maps" />
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AI..."/>
    </application>

En mi mainview.xml tengo:

<fragment
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/map"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   class="com.google.android.gms.maps.SupportMapFragment" />

Ahora en MainView.java tengo:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

public class MainView extends FragmentActivity ... {
    private GoogleMap mMap;

    @Override
    protected void onResume() {
        ...
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.map);
        SupportMapFragment mapFragment = (SupportMapFragment)fragment;
        mMap = mapFragment.getMap();
        //PROBLEM: mMap is null here even though mapFragment is not
    }
}

Entonces pensé que probablemente necesitaba inicializar los fragmentos, así que agregué en mionCreate después de configurar la vista de contenido:

//Fragments
FragmentManager manager = getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.map, SupportMapFragment.newInstance());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();

Entonces dije, tal vez no esSupportMapFragment pero en realidad debería referirme al fragmento real, y en mionResume Yo si:

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

//Fragments
FragmentManager manager = getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.map, mapFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();

mMap = mapFragment.getMap();

mMap Es de nuevo nulo después de esto.

Entonces vi que hay unaMapsInitializer clase, así que pensé que tal vez debería llamar eso primero.

Así que agregué el código antes de obtener el fragmento en el código anterior:

try {
    MapsInitializer.initialize(this);
} catch (GooglePlayServicesNotAvailableException e) {
    e.printStackTrace();
}

Con este Logcat informó la advertencia (la línea 313 es laMapsInitializer.initialize(this)):

com.google.android.gms.common.GooglePlayServicesNotAvailableException
    at com.google.android.gms.internal.n.c(Unknown Source)
    at com.google.android.gms.internal.n.a(Unknown Source)
    at com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source)
    at myapp.activities.MainView.inflateSelectedViewAndSetData(MainView.java:313)
    at myapp.activities.MainView.onClick(MainView.java:642)
    at android.view.View.performClick(View.java:3153)
    at android.view.View$PerformClick.run(View.java:12148)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:152)
    at android.app.ActivityThread.main(ActivityThread.java:4615)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    at dalvik.system.NativeStart.main(Native Method)

A lo largo de mis intentos, Logcat reportaría la siguiente advertencia:

Google Play services out of date.  Requires 2010100 but found 1013

Esto podría ser un culpable, pero no encontré una solución.

En este punto ya no tengo ideas. Leo varios hilosaquí, aquí, aquí pero ninguna de las sugerencias resolvió el problema. En este último, sugieren no incluir la dependencia del proyecto y simplemente incluir el archivo jar. Bueno, eso tampoco funcionó usandogoogle-play-services.jar desde elgoogle-play-services_lib/libs Carpeta o exportando mi propio jar de ese proyecto.

Por cierto, estoy ejecutando un dispositivo real (2.3.5 y una tableta con 3.2), no el emulador.

Cualquier ayuda sinceramente apreciada. :)

ACTUALIZAR:

La solución está abajo por qubit.

Al exportar la dependencia de la biblioteca, una buena forma de no tener que lidiar con ella (lo cual es un dolor al tratar con repositorios) es usarFatJar y exportar elgoogle_play_services_lib proyecto (del cual NO creé una copia local porque, cuando se actualiza, no quiero volver a importar), e incluyo el archivo jar de salida en su proyecto como otro archivo jar. NOTA: Al elegir los archivos jar para incluir en el tarro gordo, tuve que excluir elannotations.jar archivo ya que estaba pre-incluido y estaba causando errores para la duplicación. Ahora todo lo que tengo que hacer es incluir elgoogle_play_services_rev_3.jar en mi proyectolibs Carpeta y estoy bien para ir.

Respuestas a la pregunta(3)

Su respuesta a la pregunta