Google Maps Android API v2 wirft den Fehler "GooglePlayServicesNotAvailableException" aus, SupportMapFragment.getMap () gibt null zurück

Ich versuche, die neue Google Maps Android API v2 mithilfe der Android-Supportbibliothek in eine Anwendung zu integrieren. Ich habe viele Iterationen durchlaufen, um zu versuchen, irgendwo zur Arbeit zu kommen, und jetzt habe ich aufgegeben und dachte, ich sollte hier fragen.

Ich ging zur API-Konsole, erstellte ein Projekt, aktivierte Google Maps API v2 für Android, erstellte einen erforderlichen Debug-KEY und fügte ihn in das Manifest ein. Keine Authentifizierungsprobleme oder ähnliches. Ich bin mir ziemlich sicher, dass ich das richtig gemacht habe.

In meinem Projektlibs Ordner, den ich legteandroid-support-v4.jar (Über Projekt Rechtsklick-> Android-> Support Library hinzufügen ...). In Eclipse habe ich Datei-> Importieren-> Android-> Vorhandener Android-Code in Workspace importiert und die neueste Version (Version 3) von android-sdk / google / google_play_services / libproject / google-play-services_lib importiert. Dann habe ich es meinem Projekt als Abhängigkeitsbibliothek hinzugefügt (Rechtsklick auf das Projekt-> Eigenschaften-> Android-> Als Bibliotheksabhängigkeit hinzufügen unten).

In meinem Manifest habe ich:

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

In meiner mainview.xml habe ich:

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

Jetzt auf MainView.java habe ich:

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

Dann dachte ich, dass ich wahrscheinlich die Fragmente initialisieren muss, also fügte ich in meinem hinzuonCreate Nach dem Einstellen der Inhaltsansicht:

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

Dann sagte ich, vielleicht ist es nichtSupportMapFragment aber ich sollte mich eigentlich auf das eigentliche Fragment beziehen, und in meinemonResume Ich tat:

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 ist danach wieder null.

Dann habe ich gesehen, dass es eine gibtMapsInitializer Klasse, also dachte ich, vielleicht sollte ich das zuerst nennen.

Also habe ich den Code hinzugefügt, bevor ich das Fragment im obigen Code erhalten habe:

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

Bei diesem Logcat wird die Warnung gemeldet (Zeile 313 ist dieMapsInitializer.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)

Während meiner Versuche meldete Logcat die folgende Warnung:

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

Dies könnte ein / der Schuldige sein, aber ich habe keine Lösung gefunden.

Zu diesem Zeitpunkt habe ich keine Ideen mehr. Ich habe mehrere Threads gelesenHier, Hier, Hier aber keiner der Vorschläge löste das Problem. Auf letzterer schlagen sie vor, die Projektabhängigkeit nicht einzuschließen und nur die JAR-Datei einzuschließen. Nun, das hat auch nicht geklapptgoogle-play-services.jar von demgoogle-play-services_lib/libs Ordner oder mein eigenes Glas aus diesem Projekt exportieren.

Übrigens laufe ich auf einem aktuellen Gerät (2.3.5 und einem Tablet mit 3.2), nicht auf dem Emulator.

Jede Hilfe von ganzem Herzen dankbar. :)

AKTUALISIEREN:

Die Lösung ist unten per Qubit.

Wenn Sie die Bibliotheksabhängigkeit exportieren, sollten Sie einen einfachen Weg wählen, um nicht damit umgehen zu müssen (was beim Umgang mit Repositorys ein Problem ist)FatJar und exportieren Sie diegoogle_play_services_lib Projekt (von dem ich KEINE lokale Kopie erstellt habe, weil ich beim Aktualisieren keine neue Kopie importieren möchte) und die Ausgabe-Fat-JAR-Datei als andere JAR-Datei in Ihr Projekt einbinde. HINWEIS: Bei der Auswahl der JAR-Dateien, die im Fat Jar enthalten sein sollen, musste ich die ausschließenannotations.jar Datei, da sie bereits im Lieferumfang enthalten war und Fehler beim Duplizieren verursachte. Jetzt muss ich nur noch diegoogle_play_services_rev_3.jar in meinem Projektlibs Ordner und ich bin gut zu gehen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage