Falha de autorização da API Android v2 do Google Maps

95

Meus passos:

  • obteve o código SHA1 de debug.keystore
  • criar aplicativo no google apis console
  • API de mapa do google v2 habilitada
  • input SHA1; my.package.name
  • obter chave API
  • arquivo AndroidManifest criado:

        <permission
                android:name="my.package.name.permission.MAPS_RECEIVE"
                android:protectionLevel="signature"/>
    
        <uses-permission android:name="my.package.name.permission.MAPS_RECEIVE"/>
    
        <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15"/>
    
        <uses-permission android:name="android.permission.INTERNET"/>
        <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="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    
        <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
    
        <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:hardwareAccelerated="true">
    
            <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="MY_API_KEY_HERE" />
    
            <activity android:name="MyActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
        </application>
    </manifest>
    
  • layout criado

  • coloque "google-play-services.jar" em libs

Após a compilação, tenho travamento:

  ERROR/AndroidRuntime(10182): FATAL EXCEPTION: main
                java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable
                at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source)
                at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source)
                at android.app.Activity.onCreateView(Activity.java:4716)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
                at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
                at android.app.Activity.setContentView(Activity.java:1881)
                at com.example.gm2.MyActivity.onCreate(MyActivity.java:16)
                at android.app.Activity.performCreate(Activity.java:5104)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
                at android.app.ActivityThread.access$600(ActivityThread.java:141)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:5039)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                at dalvik.system.NativeStart.main(Native Method)

Depois disso, mudei o layout para:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/map"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />

e mudou MyActivity para

  super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();

    transaction.add(R.id.map, MapFragment.newInstance());           
    transaction.commit();

Como resultado, o aplicativo foi iniciado, mas não vi o mapa.

Log do console:

ERROR/Google Maps Android API(10369): Authorization failure.
Rusfearuth
fonte
1
AMD! sempre tive o mesmo erro R $ classe estilizável não encontrada. Agora mudei meu código para sua forma programática de implementar o MapFragment e funciona! Obrigado! Mas você precisa criar sua chave conforme descrito abaixo
Informatic0re

Respostas:

103

Passos :

  • para garantir que o dispositivo tenha o APK do Google Play Services
  • para instalar o Google Play Service rev. mais de 2

insira a descrição da imagem aqui

  • para criar o projeto em https://code.google.com/apis/console/
  • para habilitar "Google Maps Android API v2" insira a descrição da imagem aqui
  • para registrar o SHA1 no projeto ( AGORA, VOCÊ PRECISA ESCREVER SHA1; your.app.package.name ) no console de APIs e obter a chave API
  • para copiar o diretório ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_lib para a raiz de seu projeto
  • para adicionar a próxima linha a YOUR_PROJECT / project.properties

android.library.reference.1=google-play-services_lib

  • para adicionar as próximas linhas ao YOUR_PROJECT/proguard-project.txt

.

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

Agora você está pronto para criar seu próprio aplicativo Google Map usando as APIs V2 do Google Map para Android.

Se você criar um aplicativo com min SDK = 8, use a biblioteca de suporte do Android v4 + SupportMapFragment em vez de MapFragment.

Rusfearuth
fonte
Essas instruções não fizeram todo o trabalho. Eu precisava copiar proguard.cfg do aplicativo de amostra da API de mapas. Só então começou a funcionar.
Yoel Gluschnaider
Além disso, notei que o algoritmo de assinatura DEVE ser SHA1withRSA e NÃO SHA256withRSA (o padrão criado pelo eclipse para a chave de depuração).
Yoel Gluschnaider
1
Obrigado! to enable "Google Maps Android API v2" -a etapa resolveu meu problema.
Johan
1
@YoelGluschnaider: Como posso alterar o algoritmo padrão de SHA256withRSA para SHA1withRSA?
Santhosh
Obrigado! Fui salvo pela sua ideia de usar SupportMapFragment.
Ilya Kogan
35

Verifique também esta postagem: O código de amostra do Google Map Android Api V2 não está funcionando , se você tiver certeza de que executou os passos corretos, siga a segunda resposta, a autenticação é armazenada em cache em algum lugar, tente desinstalar o aplicativo manualmente (assim como você faz com um aplicação normal) e "Executar" novamente o projeto

adelriosantiago
fonte
6
Não posso acreditar que funcionou. Obrigado @Alejandro del Rio :)
phil
Aposto que, assim como eu, 90% das pessoas aqui realmente querem esta resposta e não a selecionada (embora útil também)
Kalisky
No meu caso, o cache (?) Foi atualizado enquanto eu lia o Stackoverflow com a mensagem de erro de autenticação no log. O aplicativo estava rodando com a tela while, depois de alguns minutos o mapa foi carregado e não houve mais erros de autenticação. Eu acho que uma reinstalação também teria feito isso.
John
2
Para futuros leitores. Exclua bine gen. Limpe, reconstrua e as credenciais em cache sejam renovadas.
George Daramouskas
20

Como acabei de perder muito tempo fazendo a API funcionar, tentarei fornecer uma validação passo a passo para a API do mapa v2:

Etapa 1: Inscreva-se para obter sua chave de API

Se você não está familiarizado com o console da API do Google, leia a excelente resposta de Rusfearuth acima.

Etapa 2: verifique seu SHA Hash (neste caso, eu uso a chave de depuração do eclipse):

Em uma máquina Windows, acesse o diretório do usuário em um prompt de comando:

C:\Users\you>keytool -list -alias androiddebugkey -keystore .android\debug.keyst
ore -storepass android -keypass android

Você obterá algo como:

androiddebugkey, 15.10.2012, PrivateKeyEntry,
Zertifikat-Fingerprint (SHA1): 66:XX:47:XX:1E:XX:FE:XX:DE:XX:EF:XX:98:XX:83:XX:9A:XX:23:A6

Em seguida, observe o nome do seu pacote da atividade do mapa, por exemplo, com.example.mypackagename

Você combina isso e verifica com suas configurações no console de API do Google:

66:XX:47:XX:1E:XX:FE:XX:DE:XX:EF:XX:98:XX:83:XX:9A:XX:23:A6;com.example.mypackagename

onde você obtém sua chave de API:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

Etapa 3. Metadados de manifesto

Verifique se os metadados estão presentes e contêm a chave correta. Se você lançar seu aplicativo, precisará de uma chave diferente.

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

Etapa 4. Recursos do manifesto:

Você precisa desta entrada porque a API do mapa requer algum suporte de grapics:

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

Não se preocupe, 99,7% dos dispositivos suportam isso.

Etapa 5. Biblioteca de manifesto:

Adicione a biblioteca do Google.

    <uses-library
        android:name="com.google.android.maps"
        android:required="false" /> // This is required if you want your app to start in the emulator. I set it to false also if map is not an essential part of the application.

Etapa 6. Permissões de manifesto:

Verifique o nome do pacote duas vezes: com.example.yourpackage

<permission
    android:name="com.example.yourpackage.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.yourpackage.permission.MAPS_RECEIVE" />

Adicione as seguintes permissões:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

As seguintes permissões são opcionais e não necessárias se você apenas mostrar um mapa. Tente não usá-los.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Etapa 7. Inclua o fragmento do mapa em seu layout:

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    class="com.google.android.gms.maps.SupportMapFragment"
    map:cameraTargetLat="47.621120"
    map:cameraTargetLng="-122.349594"
    map:cameraZoom="15" />

Se o seu lançamento para as versões 2.x do Android, você precisa adicionar suporte em sua atividade:

import android.support.v4.app.FragmentActivity;

Para o mapa: entradas para trabalhar incluem

xmlns:map="http://schemas.android.com/apk/res-auto"

no layout de sua atividade (por exemplo, LinearLayout).

No meu caso, tenho que limpar o projeto toda vez que mudo algo no layout. Parece ser um bug.

Etapa 8: Use Eclipse - Projeto - Limpar.

Aproveitar!

Gunnar Bernstein
fonte
Estou seguindo seus passos, mas erro na chave de API, alguma solução?
Hemantvc
1
+1 para <meta-data android: name = "com.google.android.maps.v2.API_KEY" android: value = "AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />
The-null-Pointer-
16

Você precisa usar o projeto de biblioteca localizado em: ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libproject

Isso resolverá seu primeiro problema.

Não tenho certeza sobre o seu segundo, mas pode ser um efeito colateral do primeiro. Ainda estou tentando fazer o mapa funcionar em meu próprio aplicativo :)

Scott Kennedy
fonte
Copiei extras / google / google_play_services / libproject / libs / google-play-services.jar para MY_PROJECT / libs.
Rusfearuth
Isso não é bom o suficiente. Você precisa usar todo o projeto da biblioteca, pois inclui muitos recursos. No Eclipse, você pode importar um novo projeto Android e apenas apontá-lo para o diretório libproject. Em seguida, nas propriedades do seu próprio projeto, adicione uma referência a ele.
Scott Kennedy
Eu não uso o Eclipse (uso o Idea)
Rusfearuth
Não tenho certeza de como os projetos de biblioteca funcionam no Idea, mas blogs.jetbrains.com/idea/2010/09/… deve ter essa informação.
Scott Kennedy
17
Eu descobri por que não funcionou. Ativei a API do Google Maps v2 em vez do serviço Google Map Android API v2. = (Que vergonha ...
Rusfearuth
5

Hoje enfrentei esse problema. Usei o Android Studio 2.1.3, windows 10. Durante a depuração, ele funciona bem, mas se eu atualizar para o modo de lançamento, ele não funcionará. Limpei todas as condições do Proguard, atualizei, mas essa não era a solução.

A solução está relacionada com a estrutura do projeto. O arquivo google_maps_api.xml era diferente entre app \ src \ debug \ res e app \ src \ release \ res. Eu copiei e colei manualmente do debug para a pasta de lançamento

Agora funciona.

Yaya
fonte
4

Eu segui a maioria, senão todas, as sugestões de Gunnar Bernstein mencionadas acima e ainda não funcionou. No entanto, começou a funcionar depois que segui suas sugestões E o seguinte:

  1. Eu criei uma nova MapActivity usando a lista de opções do botão direito do Android Studio: Novo -> Google -> Atividade do Google Maps

  2. Em seguida, abri o arquivo google_maps_api.xml que é gerado automaticamente e usei o link indicado para criar uma nova chave de API. Eu fiz todas as etapas e salvei minha nova chave no projeto atual. Em seguida, removi minha antiga CHAVE API registrada, pois ela não era mais necessária.

  3. No arquivo Manifest, substituí o antigo valor API KEY pelo atalho de string criado por este novo arquivo XML: android:value="@string/google_maps_key", em vez de declarar a KEY diretamente.

  4. Finalmente, remova a nova MapActivity, mas mantenha o arquivo xml que foi criado nesse processo.

Nota: Ao criar a API KEY desta forma, a coluna Restrictions, em Credentials, agora declarada "Android apps". Anteriormente, quando não funcionava, a coluna dizia "Aplicativos Android, 1 API" ou algo semelhante. Não sei se isso faz diferença ou não. Nota: Não, isso significa apenas que não tenho uma API específica selecionada para esta chave API (Console -> Chave API -> Restrições de chave -> Restrições API).

Observação: parece a tag de metadados no arquivo Manifest:

android:name="com.google.android.maps.v2.API_KEY

foi substituído por:

android:name="com.google.android.geo.API_KEY"

Eu acho que ambos podem ser usados, mas é melhor usar o último desde o início.

Nota: O valor declarado, no arquivo build.gradle, em android -> defaultConfig -> applicationId deve corresponder ao texto do nome do pacote na página Credenciais.

Goldenmaza
fonte
Foi exatamente isso o que aconteceu comigo e essa solução corrigiu o aviso do console. De alguma forma, a construção Ionic mudou isso.
astronauta de
Após pesquisar 8 horas, olho para trás e aplico esta solução. Solved!!!
meyasir 01 de
3

Basta adicionar isso ao seu arquivo de manifesto:

**<uses-library android:name="com.google.android.maps" />**

Por exemplo...

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
    <uses-library android:name="com.google.android.maps" />

    <activity
        android:name=".California"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

E, por favor, atualize a biblioteca do serviço google play ... Vá para a janela -> gerenciador de SDK do Android-> atualizar serviço google play ... instalei ... apague o antigo e mantenha este. Obtenha isso em ANDROID-SDK-DIRECTORY / extras / google / google_play_services /

Obrigado .. Por favor, vote

Mitul Goti
fonte
3

Resolvi esse erro verificando o nome do pacote no manifesto e no aplicativo build.gradle.

No manifesto:

Estou usando um nome de pacote como:

com.app.triapp

No app build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

Depois de alterado para com.app.triappem build.gradle, resolvi meu problema.

Steve
fonte
1
Muito obrigado. Você economiza muito tempo.
YeeKhin de
1
Excelente irmão. Eu tenho tudo OK, em vez deste
Mubashar Javed
2

Estou migrando de V1 para V2 do Google Maps. Eu estava recebendo essa falha ao tentar executar o aplicativo via Eclipse. A causa raiz para mim foi usar meu armazenamento de chaves de certificado de liberação em vez do armazenamento de chaves de depuração do Android, que é o que é usado quando você o executa via Eclipse. O seguinte comando (OSX / Linux) obterá a chave SHA1 do armazenamento de chaves de depuração:

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

Se você estiver usando o Windows 7 em vez disso, use este comando:

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

Provavelmente, é melhor desinstalar o aplicativo completamente do dispositivo antes de tentar com uma nova chave, pois o Android armazena em cache as credenciais de segurança.

Chris Knight
fonte
1

"java.lang.NoClassDefFoundError: com.google.android.gms.R $ styleable"

Também houve esse erro, você precisa: Arquivo -> importar -> Código Android existente no espaço de trabalho -> Navegar -> SDK do Android -> extras -> google -> google_play_services -> lib_project -> google_play_services_lib e OK. Verifique o projeto e finalize.

O projeto vai para Package Explorer. Agora vá para o seu projeto (com erro) -> propriedades -> Android e na Biblioteca clique em Adicionar ... o google_play_services_lib deve estar lá! adicione e tente novamente :)

Edwell
fonte
1

Eu tive o mesmo problema, mas descobri que era porque eu criei duas chaves de API de mapa diferentes com a mesma impressão digital SHA-1 com nome de pacote quase semelhante com.bla.blae outro com.bla.bla.something.

Zamrony P. Juhara
fonte
0

Eu tive exatamente o mesmo problema e só precisei definir o SDK para o projeto de biblioteca do MapsApiV2 para Android 2.3.3 (API lvl 10)

Informatic0re
fonte
Não consigo me lembrar dessas coisas
Informatic0re
0

Eu tive o mesmo problema. Após cerca de duas horas de pesquisa no Google, novas tentativas, regeneração da chave API muitas vezes, etc., descobri que habilitei o serviço errado no console do Google APis. Eu habilitei o serviço Google Maps API v2 , mas para aplicativos Android você tem que usar Google Maps Android API v2 . Depois de habilitar o serviço correto, tudo começou a funcionar.

Nino Stella
fonte
0

SUA ECLIPSE TALVEU CHAVE SHA1, então você deve regenerar sua chave do google com a nova chave SHA1 aqui: https://console.developers.google.com/project/watchful-net-796/apiui/credential Depois disso, copie a nova chave no manifesto e recarregue esta página do google algumas vezes, e sua chave será atualizada, reconstrua seu projeto e funcionará. P / S: Por meu erro, excluí a pasta .android, então eclipse regen SHA1.

nobjta_9x_tq
fonte
0

Eu segui a mesma etapa fornecida no Google Doc, mas estava recebendo o mesmo erro. Mais tarde, percebi que estava assinando meu aplicativo com meu app.keystore e a chave SHA que estava usando para gerar a chave de API era a de depuração.

Então, simplesmente removi o arquivo signingConfig signingConfig.genericdo build.gradlearquivo e meu mapa começou a funcionar bem.

Espero que isso ajude alguém.

SKP
fonte
0

Eu enfrentei o mesmo problema.

Se você emitiu uma API para sua versão de lançamento do aplicativo. Então, essa API só funcionará para a versão de lançamento, não para a versão de depuração. Portanto, certifique-se de usar a versão de lançamento em seu telefone ou emulador.

Salman Saleh
fonte
0

Para mim, tudo estava funcionando tanto em um emulador quanto em um dispositivo físico.

No entanto, ele parou de funcionar para mim quando configurei uma segunda máquina para depurar o mesmo aplicativo em um emulador com um nível de API mais recente.

Eu não percebi que a impressão digital daquela máquina mudou. Depois de ver o log de erro de falha de autenticação no Log do dispositivo, comparei de perto a impressão digital em meu Google Developer Console com a da mensagem de erro. Foi quando eu vi a diferença. Depois de adicionar a nova impressão digital ao console do desenvolvedor (em combinação com o nome do pacote), meu aplicativo começou a funcionar conforme o esperado no emulador no novo sistema.

Portanto, se você configurar um novo sistema, verifique suas impressões digitais novamente!

DankMemester 'Andrew Servania'
fonte
0
  • Certifique-se de que o Maps SDK for Androidesteja ativado no console da API.
  • Também pode ser necessário adicionar o nome do pacote e a impressão digital do certificado de assinatura SHA-1 para restringir o uso de sua chave para ser totalmente habilitado.

insira a descrição da imagem aqui

this.Mitch
fonte