A API v2 do Google Maps para Android parou de funcionar
-
20-12-2019 - |
Pergunta
O Google Maps estava trabalhando em um aplicativo publicado e agora, por algum motivo, parou de exibir o mapa.Aqui está o manifesto:
<manifest
.....
<permission
android:name="com.x.x.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.x.x.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Maps API needs OpenGL ES 2.0. -->
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
.....
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/map_key" />
<meta-data
android:name="com.google.android.gms.version"
android:value="4030500" />
</application>
Peguei as chaves SHA-1 de depuração e liberação do armazenamento de depuração e liberação e coloquei-as na API Android V2 do Google Maps e coloquei a chave de API no manifesto (codificado e em strings.xml).
Aqui está o layout:
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"/>
Aqui está como tento acessar o SupportMapFragment do fragmento que está sendo exibido:
private void setUpMapIfNeeded()
{
SupportMapFragment fragment = (SupportMapFragment)fManager.findFragmentById(R.id.map);
if (fragment != null)
{
mMap = fragment.getMap();
}
// Check if we were successful in obtaining the map.
if (mMap != null)
setUpMap();
}
No entanto, o fragmento sempre retorna nulo.A certa altura, recebi a mensagem de falha ao autorizar, mas atualmente não vejo isso.Apenas um mapa em branco.
Atualizar:Não parece ser um problema com as chaves, tem a ver com
android:name="com.google.android.gms.maps.SupportMapFragment"
no arquivo de layout.Quando tento obter o fragmento por id ele retorna nulo.O frustrante é que criei um projeto de teste onde a configuração é basicamente idêntica e funciona.No entanto, quando tento o mesmo código neste projeto, ele não funciona.Ambos os projetos apontam para o mesmo projeto de biblioteca do Google Play Services e ambos apontam para a Biblioteca de Suporte v4.Até o manifesto tem as mesmas entradas.Além disso, se eu substituir SupportMapFragment por MapFragment, tudo funcionará bem.
Solução 2
Não sei por que parou de funcionar quando funcionava anteriormente, mas esta foi a solução:
SupportMapFragment - Linha 2 do arquivo xml binário:Erro ao inflar o fragmento de classe
Outras dicas
se tudo estiver igual (você não altera o nome do pacote ou a chave e está usando o debug sha1 para a chave da API de depuração) e parou de funcionar, eu diria que você tem um conflito com a versão do jogo Serviços.tente remover a versão codificada aqui
<meta-data
android:name="com.google.android.gms.version"
android:value="4030500" />
provavelmente essa versão não está funcionando com a versão do Google Play Services (você pode verificar a versão real em google-play-services_lib>res>valores>versão.xml).verifique se o jar que você está usando é exatamente essa versão e altere-o se não for.Além disso, se você verificar o log cat, poderá ver algo como
Causado por:java.lang.IllegalStateException:A tag de metadados no AndroidManifest.xml do seu aplicativo não possui o valor certo.
eu mudaria esses metadados para
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
isto é o que Google recomenda e também siga os outros conselhos dessa página
de qualquer forma, se você der uma olhada no logcat (ou postá-lo aqui), provavelmente poderemos obter uma pista sobre os logs em torno de setUpMapIfNeeded()
Bem, de acordo com o Configuração da API Android do GoogleMap, diz
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"/>
que foi o que fiz e funciona.Eu não usei suppotMapFragment, mas neste link aqui, o elemento parece ser
<fragment
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Você provavelmente já verificou a maioria das coisas (como eu).Meu mapa funcionou perfeitamente com o keystore de depuração, mas ficou em branco quando mudei para a chave assinada.Meu problema foi resolvido quando criei uma chave Api (com chave de depuração + nome do pacote do projeto) em uma conta do Google para usar durante o tempo de desenvolvimento....e criei outra chave de API assinada (keystore assinado + nome do pacote do projeto) em outra conta do Google.Aparentemente você não pode ter mais de uma chave de API para o mesmo nome de pacote (mesmo que o keystore seja diferente!) Na mesma conta do Google.