Google Maps Android API v2 lança GooglePlayServicesNotAvailableException, desatualizado, SupportMapFragment.getMap () retorna null

Estou tentando incorporar a nova API do Android do Google Maps v2 em um aplicativo usando a Biblioteca de suporte do Android. Eu passei por muitas iterações para tentar chegar a algum lugar para trabalhar e agora desisti e pensei que deveria perguntar aqui.

Fui ao Console de APIs, criei um projeto, ativei a API do Google Maps v2 para Android, criei uma chave de depuração conforme necessário e colei-a no manifesto. Nenhum problema de autenticação ou qualquer coisa assim. Tenho certeza que fiz isso direito.

No meu projetolibs pasta eu coloqueiandroid-support-v4.jar (via projeto clique com o botão direito-> Android-> Adicionar Biblioteca de Suporte ...). No Eclipse, eu fiz File-> Import-> Android-> Existing Android Code Into Workspace e importei o último (rev 3) do android-sdk / google / google_play_services / libproject / google-play-services_lib. Então eu adicionei como uma biblioteca de dependência para o meu projeto (projeto clique com o botão direito-> Propriedades-> Android-> Adicione-o como uma dependência de biblioteca na parte inferior.

No meu manifesto eu tenho:

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

No meu mainview.xml eu tenho:

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

Agora no MainView.java eu ​​tenho:

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

Então eu pensei que provavelmente precisaria inicializar os fragmentos então eu adicionei no meuonCreate depois de definir a exibição de conteúdo:

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

Então eu disse, talvez não sejaSupportMapFragment mas eu realmente deveria me referir ao fragmento real, e na minhaonResume Eu fiz:

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 é novamente nulo depois disso.

Então eu vi que há umMapsInitializer classe, então eu pensei que talvez eu deveria chamar isso primeiro.

Então, adicionei o código antes de obter o fragmento no código acima:

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

Com este Logcat relatou o aviso (a linha 313 é aMapsInitializer.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)

Durante minhas tentativas, a Logcat reportou o seguinte aviso:

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

Este poderia ser o culpado, mas não encontrei solução.

Neste ponto, estou sem ideias. Eu li vários tópicosAqui, Aqui, Aqui mas nenhuma das sugestões resolveu o problema. No último, eles sugerem não incluir a dependência do projeto e apenas incluir o arquivo jar. Bem, isso não funcionou nem usandogoogle-play-services.jar degoogle-play-services_lib/libs pasta ou exportando meu próprio jar desse projeto.

Pela maneira que eu estou correndo em um dispositivo real (2.3.5 e um tablet com 3.2), não o emulador.

Qualquer ajuda sincera apreciada. :)

ATUALIZAR:

A solução está abaixo por qubit.

No que diz respeito à exportação da dependência de bibliotecas, uma maneira legal de não ter que lidar com isso (o que é um problema ao lidar com repositórios) é usarFatJar e exportar ogoogle_play_services_lib project (que NÃO criei uma cópia local porque, quando atualiza, não quero reimportar) e incluo o arquivo jar do fat output em seu projeto como outro arquivo jar. NOTA: Ao escolher quais arquivos jar incluir no frasco de gordura, eu tive que excluirannotations.jar arquivo como já foi pré-incluído e estava causando erros de duplicação. Agora tudo o que tenho a fazer é incluir ogoogle_play_services_rev_3.jar no meu projetolibs pasta e eu estou pronto para ir.

questionAnswers(3)

yourAnswerToTheQuestion