Google Maps API Android v2 jette GooglePlayServicesNotAvailableException, de la date, SupportMapFragment.getMap() renvoie la valeur null

Je suis en train d'intégrer le nouveau Google Maps API Android v2 dans une application en utilisant l'Android Support Library.
J'ai traversé beaucoup d'itération pour essayer d'obtenir un endroit pour travailler, et maintenant, j'ai renoncé et pensé que je devrais demander ici.

Je suis allé à l'API Console, a créé un projet, a permis à Google Maps API v2 pour Android, créé une CLÉ de débogage nécessaires et collé sur le manifeste. Pas de problèmes d'authentification ou quelque chose comme ça. Assez sûr que je n'ai pas ce droit.

Dans mon projet de libs dossier j'ai mis android-support-v4.jar (aide à projet via clic droit->Android->Ajouter la prise en charge de la Bibliothèque...). Dans Eclipse, j'ai fait Fichier->Import->Android->Existant Android Code Dans l'espace de travail et importé la dernière (rev 3), de android-sdk/google/google_play_services/libproject/google-play-services_lib. Puis je l'ai ajouté comme une dépendance de la bibliothèque de mon projet de projet (clic droit>Propriétés->Android->l'Ajouter comme une dépendance de bibliothèque sur le fond.

Dans mon manifeste que j'ai:

<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>

Dans mon mainview.xml j'ai:

<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" />

Maintenant sur MainView.java j'ai:

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
    }
}

Alors j'ai pensé que j'ai probablement besoin d'initialiser les fragments j'ai donc ajouté dans mon onCreate après le réglage de l'affichage du contenu:

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

Puis je l'ai dit, c'est peut-être pas SupportMapFragment mais j'ai vraiment devrait se référer à la réalité de fragment, et dans mon onResume j'ai fait:

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 est à nouveau nulle après ce.

Puis j'ai vu qu'il y est un MapsInitializer classe, alors j'ai pensé que peut-être que je devrais l'appeler en premier.

Donc j'ai ajouté le code avant d'obtenir le fragment dans le code ci-dessus:

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

Avec cette Logcat signalé l'avertissement (ligne 313 est le MapsInitializer.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)

Tout au long de ma tente Logcat rendrait compte de l'avertissement suivant:

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

Cela pourrait être le coupable, mais je n'ai trouvé aucune solution.

À ce point, je suis d'idées. J'ai lu plusieurs threads ici, ici, ici mais aucune des solutions que le problème est résolu. Sur le dernier, ils suggèrent de ne pas y compris le projet de dépendance et juste, y compris le fichier jar. Bien, cela ne fonctionne pas, soit en utilisant soit google-play-services.jar de la google-play-services_lib/libs dossier ou l'exportation de mon propre pot de ce projet.

Par la façon dont je suis en cours d'exécution sur un périphérique réel (2.3.5 et une tablette avec 3.2), pas de l'émulateur.

Toute aide sincèrement apprécié. 🙂

Mise à JOUR:

La solution est ci-dessous par qubit.

Aussi loin de l'exportation de la bibliothèque de la dépendance, un moyen sympa de ne pas avoir à traiter avec elle (ce qui est une douleur lorsque vous traitez avec des dépôts) est d'utiliser FatJar et l'exportation de la google_play_services_lib projet (que je n'ai PAS de créer une copie locale de parce que quand il se met à jour-je ne veux pas re-import), et comprennent tha sortie de graisse fichier jar dans votre projet comme un autre fichier jar.
REMARQUE: Lors du choix jar fichiers à inclure dans la graisse du pot, j'ai dû l'exclure de la annotations.jar fichier tel qu'il était déjà pré-inclus et a été à l'origine des erreurs de duplication.
Maintenant, tout ce que j'ai à faire est d'inclure le google_play_services_rev_3.jar dans mon projet de libs dossier et je suis bon pour aller.

  • Car ce n'est pas une réponse à votre problème, je vais vous donner ce que des commentaires uniquement: lorsque vous ne voulez pas faire plus de GPS/WIFI en fonction de la localisation, en montrant des cartes, plans en illustré de cartes, je vous recommande d'utiliser les classes ouf de sourceforge.net/projects/libwlocate . À mon humble avis, ils sont beaucoup plus faciles à gérer et fournir un soutien pour plusieurs types de carte.
  • Ce "google_play_services_rev_3.jar" doit être générique, même fonctionne pour n'importe quel projet et de la configuration, je suppose? Merci pour l'astuce de FatJar, j'ai maintenant mon projet de travail de Jenkins CI avec cette procédure.
  • Oui, elle est générique et vous pouvez l'importer sur un projet. 🙂
InformationsquelleAutor iliask | 2012-12-05