Błąd autoryzacji w Google Maps Android API v2


95

Moje kroki:

  • dostałem kod SHA1 z debug.keystore
  • stwórz aplikację w konsoli Google API
  • włączona mapa google api v2
  • wprowadź SHA1; my.package.name
  • pobierz klucz API
  • utworzono plik AndroidManifest:

        <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>
  • utworzony układ

  • wstaw „google-play-services.jar” do biblioteki libs

Po kompilacji mam awarię:

  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)

Potem zmieniłem układ na:

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

i zmienił MyActivity na

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

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

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

W rezultacie aplikacja została uruchomiona, ale nie widziałem mapy.

Dziennik konsoli:

ERROR/Google Maps Android API(10369): Authorization failure.

1
O MÓJ BOŻE! Zawsze miałem ten sam błąd R $ nie znaleziono klasy stylable. Teraz zmieniłem kod na programistyczny sposób implementacji MapFragment i działa! Dzięki! Ale musisz utworzyć swój klucz, jak opisano poniżej
Informatic0re

Odpowiedzi:


104

Kroki :

  • aby upewnić się, że urządzenie ma pakiet APK usług Google Play
  • aby zainstalować Google Play Service rev. więcej niż 2

wprowadź opis obrazu tutaj

  • aby stworzyć projekt na https://code.google.com/apis/console/
  • aby włączyć „Google Maps Android API v2” wprowadź opis obrazu tutaj
  • zarejestrować SHA1 w projekcie ( TERAZ POTRZEBUJESZ NAPISAĆ SHA1; your.app.package.name ) w konsoli API i uzyskać KLUCZ API
  • aby skopiować katalog ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_lib do katalogu głównego twojego projektu
  • aby dodać następny wiersz do TWÓJ_PROJEKT / projekt.properties

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

  • aby dodać kolejne wiersze do YOUR_PROJECT/proguard-project.txt

.

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

Teraz możesz stworzyć własną aplikację Google Map przy użyciu interfejsów API Map Google V2 dla Androida.

Jeśli tworzysz aplikację z min SDK = 8, użyj biblioteki obsługi Androida v4 + SupportMapFragment zamiast MapFragment.


Te instrukcje nie wykonały całej pracy. Musiałem skopiować proguard.cfg z przykładowej aplikacji API map. Dopiero wtedy zaczęło działać.
Yoel Gluschnaider,

Zauważyłem również, że algorytm podpisu MUSI być SHA1withRSA, a NIE SHA256withRSA (domyślny utworzony przez eclipse dla klucza debugowania).
Yoel Gluschnaider,

1
Dzięki! to enable "Google Maps Android API v2" -krok rozwiązał mój problem.
Johan

1
@YoelGluschnaider: Jak mogę zmienić domyślny algorytm z SHA256withRSA na SHA1withRSA?
Santhosh

Dziękuję Ci! Uratował mnie Twój pomysł, aby użyć SupportMapFragment.
Ilya Kogan

35

Sprawdź również ten post: Przykładowy kod Google Map Android Api V2 nie działa , jeśli jesteś całkowicie pewien, że wykonałeś właściwe kroki, postępuj zgodnie z drugą odpowiedzią, uwierzytelnianie zostanie gdzieś zapisane w pamięci podręcznej, spróbuj ręcznie odinstalować aplikację (tak jak w przypadku normalna aplikacja), a następnie ponownie „Uruchom” projekt


6
Nie mogę uwierzyć, że to po prostu zadziałało. Dzięki @Alejandro del Rio :)
phil

Założę się, że tak jak ja, 90% ludzi tutaj naprawdę chce tej odpowiedzi, a nie wybranej (choć również
pomocnej

W moim przypadku pamięć podręczna (?) Została zaktualizowana podczas czytania Stackoverflow z komunikatem o błędzie uwierzytelniania w dzienniku. Aplikacja działała na ekranie while, po kilku minutach mapa została załadowana i nie było więcej błędów autoryzacji. Myślę, że ponowna instalacja również by to zrobiła.
Jan

2
Dla przyszłych czytelników. Usuń bini gen. Wyczyść, odbuduj, a buforowane poświadczenia zostaną odnowione.
George Daramouskas

20

Ponieważ zmarnowałem dużo czasu, aby API działało, spróbuję przeprowadzić weryfikację krok po kroku dla Map API v2:

Krok 1: Złóż wniosek o klucz API

Jeśli nie znasz konsoli Google API, przeczytaj bardzo dobrą odpowiedź Rusfearuth powyżej.

Krok 2: Sprawdź SHA Hash (w tym przypadku używam klucza debugowania eclipse):

Na komputerze z systemem Windows dostałem się do katalogu użytkownika w wierszu polecenia:

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

Otrzymasz coś takiego:

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

Następnie spójrz na nazwę swojego pakietu działania mapy, np. Com.example.mypackagename

Łączysz to i sprawdzasz ze swoimi ustawieniami w konsoli Google API:

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

gdzie otrzymujesz swój klucz API:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

Krok 3. Manifestuj metadane

Sprawdź, czy metadane są obecne i zawierają właściwy klucz. Jeśli wydasz aplikację, potrzebujesz innego klucza.

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

Krok 4. Manifest cechy:

Potrzebujesz tego wpisu, ponieważ interfejs API map wymaga obsługi grafik:

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

Nie martw się, 99,7% urządzeń to obsługuje.

Krok 5. Biblioteka manifestów:

Dodaj bibliotekę 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.

Krok 6. Manifest uprawnień:

Sprawdź dwukrotnie nazwę pakietu: 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" />

Dodaj następujące uprawnienia:

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

Poniższe uprawnienia są opcjonalne i nie są wymagane, jeśli wyświetlasz tylko mapę. Staraj się ich nie używać.

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

Krok 7. Dołącz fragment mapy do swojego układu:

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

Jeśli Twoja wersja na Androida to 2.x, musisz dodać obsługę w swojej Aktywności:

import android.support.v4.app.FragmentActivity;

Do mapy: wpisy do pracy obejmują

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

w układzie działania (np. LinearLayout).

W moim przypadku muszę wyczyścić projekt za każdym razem, gdy zmieniam coś w layoucie. Wydaje się, że to błąd.

Krok 8: Użyj Eclipse - Project - Clean.

Cieszyć się!


podążam za twoimi krokami, ale błąd w kluczu API, jakieś rozwiązanie?
Hemantvc

1
+1 dla <meta-data android: name = "com.google.android.maps.v2.API_KEY" android: value = "AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />
The-null-Pointer-

16

Musisz użyć projektu biblioteki znajdującego się pod adresem: ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libproject

To rozwiąże Twój pierwszy problem.

Nie jestem pewien co do twojego drugiego, ale może to być efekt uboczny pierwszego. Nadal staram się, aby mapa działała we własnej aplikacji :)


Skopiowałem dodatki / google / google_play_services / libproject / libs / google-play-services.jar do MY_PROJECT / libs.
Rusfearuth

To nie wystarczy. Musisz wykorzystać cały projekt biblioteki, ponieważ zawiera on wiele zasobów. W Eclipse możesz zaimportować nowy projekt systemu Android i po prostu wskazać go w katalogu libproject. Następnie we właściwościach własnego projektu dodaj do niego odwołanie.
Scott Kennedy

Nie używam Eclipse (użyj Idea)
Rusfearuth

Nie jestem pewien, jak działają projekty biblioteczne w Idea, ale blogs.jetbrains.com/idea/2010/09/… powinien zawierać te informacje.
Scott Kennedy

17
Odkryłem, dlaczego to nie zadziałało. Włączyłem Google Map API v2 zamiast usługi Google Map Android API v2. = (Wstyd mi ....
Rusfearuth

5

Dziś stanąłem przed tym problemem. Użyłem Android Studio 2.1.3, Windows 10. Podczas debugowania działa dobrze, ale jeśli zaktualizuję do trybu wydania, to nie działa. Usunąłem wszystkie warunki proguard, zaktualizowałem, ale to nie było rozwiązanie.

Rozwiązanie jest związane ze strukturą projektu. Plik google_maps_api.xml był inny w plikach app \ src \ debug \ res i app \ src \ release \ res. Zrobiłem ręczne kopiowanie wklejania z debugowania do folderu wydania.

Teraz działa.


4

Postępowałem zgodnie z większością, jeśli nie wszystkimi, sugestiami Gunnara Bernsteina wspomnianymi powyżej i nadal nie działały. Jednak zaczęło działać po tym, jak zastosowałem się do jego sugestii ORAZ następujących:

  1. Utworzyłem nową MapActivity za pomocą listy opcji dostępnych po kliknięciu prawym przyciskiem myszy w Android Studio: Nowy -> Google -> Aktywność w Mapach Google

  2. Następnie otworzyłem plik google_maps_api.xml , który jest generowany automatycznie i użyłem podanego linku do utworzenia nowego KLUCZA API. Wykonałem wszystkie kroki i zapisałem nowy klucz w bieżącym projekcie. Następnie usunąłem mój stary zarejestrowany klucz API, ponieważ nie był już potrzebny.

  3. W pliku Manifest zastąpiłem starą wartość KLUCZA API ciągiem skrótów utworzonym przez ten nowy plik XML: android:value="@string/google_maps_key"zamiast bezpośredniego podawania KEY.

  4. Na koniec usuń nowy MapActivity, ale zachowaj plik xml, który został utworzony w tym procesie.

Uwaga: Tworząc w ten sposób KLUCZ API, kolumna Ograniczenia w obszarze Poświadczenia zawiera teraz nazwę „Aplikacje na Androida”. Wcześniej, gdy to nie działało, w kolumnie było napisane „Aplikacje na Androida, 1 API” lub coś podobnego. Nie wiem, czy to robi różnicę, czy nie. Uwaga: Nie, to po prostu oznacza, że ​​nie mam określonego API wybranego dla tego klucza API (Konsola -> Klucz API -> Ograniczenia klucza -> Ograniczenia API).

Uwaga: wygląda to tak, jak tag metadanych w pliku manifestu:

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

został zastąpiony przez:

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

Wydaje mi się, że można użyć obu, ale od początku lepiej jest używać tego drugiego.

Uwaga: Podana wartość w pliku build.gradle w obszarze android -> defaultConfig -> applicationId musi być zgodna z tekstem Nazwa pakietu na stronie Poświadczenia.


Tak właśnie się stało ze mną i to rozwiązanie naprawiło ostrzeżenie z konsoli. W jakiś sposób wersja Ionic to zmieniła.
spaceman

Po 8 godzinach wyszukiwania patrzę wstecz i stosuję to rozwiązanie. Solved!!!
meyasir

3

Po prostu dodaj to do swojego pliku manifestu:

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

Na przykład...

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

I zaktualizuj bibliotekę usługi Google Play ... Przejdź do okna -> Menedżer sdk systemu Android -> zaktualizuj usługę Google Play ... zainstaluj ją ... usuń starą i zachowaj tę. Weź to z ANDROID-SDK-DIRECTORY / extras / google / google_play_services /

Dzięki. Głosuj proszę


3

Rozwiązałem ten błąd, sprawdzając nazwę pakietu w manifeście i aplikacji build.gradle.

W oczywisty sposób:

Używam nazwy pakietu jako:

com.app.triapp

W aplikacji build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

Po zmianie na com.app.triappw build.gradlerozwiązano mój problem.


1
Wielkie dzięki. Oszczędzasz mi mnóstwo czasu.
YeeKhin

1
Doskonale Bro. Mam wszystko OK, zamiast tego
Mubashar Javed

2

Migracja z wersji 1 do wersji 2 Map Google. Otrzymywałem ten błąd podczas próby uruchomienia aplikacji przez Eclipse. Główną przyczyną dla mnie było użycie mojego magazynu kluczy certyfikatów wydania, a nie magazynu kluczy debugowania Androida, który jest używany, gdy uruchamiasz go przez Eclipse. Następujące polecenie (OSX / Linux) zapewni ci klucz SHA1 do magazynu kluczy debugowania:

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

Jeśli zamiast tego używasz systemu Windows 7, użyj tego polecenia:

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

Prawdopodobnie najlepiej jest całkowicie odinstalować aplikację z urządzenia, zanim spróbujesz użyć nowego klucza, ponieważ system Android buforuje dane uwierzytelniające.


1

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

A miał również ten błąd, musisz: Plik -> Importuj -> Istniejący kod Androida do obszaru roboczego -> Przeglądaj -> Android sdks -> dodatki -> google -> google_play_services -> lib_project -> google_play_services_lib i OK. Sprawdź projekt i zakończ.

Projekt trafia do Eksploratora pakietów. Teraz przejdź do swojego projektu (z błędem) -> właściwości -> Android iw Bibliotece kliknij Dodaj ... google_play_services_lib powinno tam być! dodaj i spróbuj ponownie :)


1

Miałem ten sam problem, ale okazało się, że jest to spowodowane tym, że stworzyłem dwa różne klucze API mapy z tym samym odciskiem palca SHA-1 z prawie podobną nazwą pakietu com.bla.blai drugim com.bla.bla.something.


0

Miałem dokładnie ten sam problem i po prostu musiałem ustawić SDK dla projektu biblioteki MapsApiV2 na Androida 2.3.3 (API lvl 10)


Nie pamiętam tych rzeczy
Informatic0re

0

Miałem ten sam problem. Po około dwóch godzinach wyszukiwania w Google, ponownych prób, wielokrotnego generowania klucza API itp. Odkryłem, że włączyłem niewłaściwą usługę w Google APis Console. Włączyłem usługę Google Maps API v2 , ale w przypadku aplikacji na Androida musisz używać Google Maps Android API v2 . Po włączeniu odpowiedniej usługi wszystko zaczęło działać.



0

Wykonałem ten sam krok, co w dokumencie Google, ale otrzymałem ten sam błąd. Później zdałem sobie sprawę, że podpisuję moją aplikację za pomocą mojego app.keystore, a klucz SHA, którego użyłem do wygenerowania klucza API, był kluczem debugowania.

Więc po prostu usunąłem signingConfig signingConfig.genericfrom by build.gradlefile i moja mapa zaczęła działać dobrze.

Mam nadzieję, że to komuś pomoże.


0

Miałem ten sam problem.

Jeśli wydałeś interfejs API dla swojej wersji aplikacji. Wtedy ten interfejs API będzie działał tylko dla wersji wydania, a nie dla wersji debugowania. Upewnij się więc, że używasz wersji wydania w telefonie lub emulatorze.


0

U mnie wszystko działało zarówno w emulatorze, jak i na fizycznym urządzeniu.

Jednak przestało działać dla mnie, gdy skonfigurowałem drugą maszynę do debugowania tej samej aplikacji w emulatorze z nowszym poziomem API.

Nie zdawałem sobie sprawy, że odcisk palca tej maszyny się zmienił. Po zobaczeniu dziennika błędu uwierzytelniania w dzienniku urządzenia dokładnie porównałem odcisk palca w mojej Konsoli programisty Google z tym w komunikacie o błędzie. Wtedy zobaczyłem różnicę. Po dodaniu nowego odcisku palca do Developer Console (w połączeniu z nazwą pakietu) moja aplikacja zaczęła działać zgodnie z oczekiwaniami w emulatorze w nowym systemie.

Jeśli więc skonfigurujesz nowy system, sprawdź ponownie swoje odciski palców!


0
  • Upewnij się, że Mapy SDK for Androidsą włączone w konsoli API.
  • Konieczne może być również dodanie nazwy pakietu i odcisku palca certyfikatu podpisującego SHA-1, aby ograniczyć użycie klucza, aby był w pełni włączony.

wprowadź opis obrazu tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.