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.