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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top