Помилка авторизації Google Maps Android API v2


95

Мої кроки:

  • отримав код SHA1 з debug.keystore
  • створити програму в консолі google apis - -
  • увімкнено google map api v2 - -
  • вхід SHA1; my.package.name
  • отримати ключ API
  • створений файл 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>
    
  • створений макет

  • помістіть "google-play-services.jar" до libs

Після компіляції у мене аварія:

  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)

Після цього я змінив макет на:

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

і змінив MyActivity на

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

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

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

В результаті додаток було запущено, але я не бачив карти.

Журнал консолі:

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

1
О БОЖЕ МІЙ! у мене завжди була однакова помилка R $ stylable class не знайдена. Тепер я змінив свій код на ваш програмний спосіб реалізації MapFragment, і він працює! Дякую! Але вам потрібно створити свій ключ, як описано нижче
Informatic0re

Відповіді:


103

Кроки :

  • щоб переконатися, що пристрій має APK-сервіси Google Play
  • встановити сервіс Google Play rev. більше 2

введіть тут опис зображення

  • створити проект за адресою https://code.google.com/apis/console/
  • увімкнути "Google Maps Android API v2" введіть тут опис зображення
  • зареєструвати SHA1 у проекті ( ТЕПЕР, ТЕБЕ ТРЕБА НАПИСАТИ SHA1; your.app.package.name ) на консолі API та отримати КЛЮЧ API
  • скопіювати каталог ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_lib у корінь вашого проекту
  • додати наступний рядок до YOUR_PROJECT / project.properties

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

  • додати наступні рядки до YOUR_PROJECT/proguard-project.txt

.

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

Тепер ви готові створити власний додаток Google Map за допомогою API Google Map V2 для Android.

Якщо ви створюєте програму з мінімальним SDK = 8, використовуйте бібліотеку підтримки Android v4 + SupportMapFragment замість MapFragment.


Ці інструкції виконували не всю роботу. Мені потрібно було скопіювати proguard.cfg із зразка програми API карт. Тільки тоді це почало працювати.
Йоель Глушнайдер

Крім того, я помітив, що алгоритм підпису ПОВИНЕН бути SHA1withRSA, а НЕ SHA256withRSA (за замовчуванням, створений eclipse для ключа налагодження).
Йоель Глушнайдер

1
Дякую! to enable "Google Maps Android API v2" -крок вирішив мою проблему.
Йохан

1
@YoelGluschnaider: Як я можу змінити алгоритм за замовчуванням із SHA256withRSA на SHA1withRSA?
Сантош

Дякую! Мене врятувала ваша ідея використовувати SupportMapFragment.
Ілля Коган

35

Також перевірте цю публікацію: Зразок коду Google Map Android Api V2 не працює , якщо ви повністю впевнені, що зробили правильні кроки, виконайте другу відповідь, автентифікація десь кешована, спробуйте видалити програму вручну (як і у випадку з звичайний додаток), потім знову "Запустити" проект


6
Не можу повірити, що щойно спрацювало. Дякую @Alejandro del Rio :)
phil

Б'юся об заклад, так само, як і я, 90% людей тут справді хочуть цієї відповіді, а не обраної (хоча це також корисно)
Каліський

У моєму випадку кеш (?) Був оновлений, коли я читав Stackoverflow із повідомленням про помилку автентифікації в журналі. Додаток працював із екраном while, через кілька хвилин карта була завантажена і помилок автентифікації більше не було. Думаю, перевстановлення теж це зробило б.
Іоанн

2
Для майбутніх читачів. Видалити binта gen. Очищення, відновлення та кешовані облікові дані оновляються.
Джордж Дарамоускас

20

Оскільки я щойно витратив багато часу, щоб API працював, я спробую надати покрокову перевірку для Map API v2:

Крок 1: Подайте заявку на свій ключ API

Якщо ви не знайомі з консоллю Google API, прочитайте дуже добру відповідь Rusfearuth вище.

Крок 2: Перевірте SHA Hash (у цьому випадку я використовую ключ налагодження eclipse):

На машині Windows потрапили до каталогу користувача в командному рядку:

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

Ви отримаєте щось на зразок:

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

Потім подивіться на ім'я вашого пакета діяльності на карті, наприклад com.example.mypackagename

Ви поєднуєте це і перевіряєте, що з вашими налаштуваннями на консолі 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

де ви отримуєте свій API-ключ:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

Крок 3. Маніфест метаданих

Перевірте, чи метадані присутні та містять правильний ключ. Якщо ви випускаєте програму, вам потрібен інший ключ.

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

Крок 4. Особливості маніфесту:

Вам потрібен цей запис, оскільки API карти вимагає певної графічної підтримки:

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

Не хвилюйтеся, 99,7% пристроїв підтримують це.

Крок 5. Маніфест бібліотеки:

Додайте бібліотеку 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.

Крок 6. Прояви дозволів:

Перевірте назву пакета двічі: 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" />

Додайте такі дозволи:

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

Наступні дозволи є необов’язковими та не потрібними, якщо ви просто показуєте карту. Намагайся їх не використовувати.

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

Крок 7. Включіть фрагмент карти у свій макет:

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

Якщо ви випустили версію Android 2.x, вам потрібно додати підтримку у своїй діяльності:

import android.support.v4.app.FragmentActivity;

Для карти: записи для роботи включають

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

у макеті вашої діяльності (наприклад, LinearLayout).

У моєму випадку мені доводиться чистити проект кожного разу, коли я щось змінюю в макеті. Здається, помилка.

Крок 8: Використовуйте Eclipse - Project - Clean.

Насолоджуйтесь!


я слідую вашим крокам, але помилка в ключі api, будь-яке рішення?
Hemantvc

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

16

Вам потрібно використовувати проект бібліотеки, який знаходиться за адресою: ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libproject

Це вирішить вашу першу проблему.

Я не впевнений у вашому другому, але це може бути побічним ефектом першого. Я все ще намагаюся змусити карту працювати у власному додатку :)


Я скопіював додатки / google / google_play_services / libproject / libs / google-play-services.jar у файл MY_PROJECT / libs.
Rusfearuth

Це недостатньо добре. Вам потрібно використовувати весь проект бібліотеки, оскільки він включає багато ресурсів. В Eclipse ви можете імпортувати новий проект Android і просто направити його в каталог libproject. Потім у властивостях власного проекту додайте посилання на нього.
Скотт Кеннеді,

Я не використовую Eclipse (використовую Ідею)
Rusfearuth

Я не впевнений, як працюють бібліотечні проекти в Idea, але blogs.jetbrains.com/idea/2010/09/… повинен мати цю інформацію.
Скотт Кеннеді,

17
Я знайшов, чому це не спрацювало. Я ввімкнув Google Map API v2 замість Google Map Android API v2. = (Ганьба мені ....
Rusfearuth

5

Сьогодні я зіткнувся з цією проблемою. Я використовував Android Studio 2.1.3, Windows 10. Під час налагодження він працює нормально, але якщо я оновлюся до режиму звільнення, він не працює. Я очистив усі умови proguard, оновив, але це не було рішенням.

Рішення пов'язане зі структурою проекту. Файл google_maps_api.xml відрізнявся між app \ src \ debug \ res та app \ src \ release \ res. Я зробив ручне копіювання вставки з налагодження у папку звільнення.

Зараз це працює.


4

Я дотримувався більшості, якщо не всіх, згаданих вище пропозицій Гуннара Бернштейна, і це все одно не спрацювало. Однак це почало працювати після того, як я послухався його пропозицій І наступного:

  1. Я створив нову MapActivity, скориставшись правою клавішею списку параметрів Android Studio: New -> Google -> Google Maps Activity

  2. Потім я відкрив файл google_maps_api.xml, який автоматично генерується, і використав вказане посилання для створення нового КЛЮЧА API. Я зробив усі кроки та зберіг свій новий ключ під своїм поточним проектом. Потім я видалив свій старий зареєстрований КЛЮЧ API, оскільки він більше не потрібен.

  3. У файлі "Маніфест" я замінив старе значення API KEY на ярлик, створений цим новим файлом XML: android:value="@string/google_maps_key", замість того, щоб вказати КЛЮЧ безпосередньо.

  4. Нарешті, видаліть нову MapActivity, але збережіть файл xml, створений у цьому процесі.

Примітка: Створивши таким чином КЛЮЧ API, у стовпці Обмеження в розділі Повноваження тепер зазначено "Додатки Android". Раніше, коли це не спрацьовувало, у колонці було вказано "Додатки Android, 1 API" або щось подібне. Я не знаю, чи має це різницю чи ні. Примітка: Ні, це просто означає, що для цього ключа API я не вибрав певного API (Консоль -> Ключ API -> Обмеження ключів -> Обмеження API).

Примітка: Це схоже на тег метаданих у файлі маніфесту:

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

було замінено на:

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

Я думаю, що обидва можна використовувати, але краще з самого початку, використовуючи останні.

Примітка: Значення, вказане у файлі build.gradle, під android -> defaultConfig -> applicationId має відповідати тексту імені пакета на сторінці облікових даних.


Це те, що саме сталося зі мною, і це рішення зафіксувало попередження з консолі. Якось змінила це йонічна конструкція.
космонавтом

Пошукавши 8 годин, я озираюся назад і застосовую це рішення. Solved!!!
meyasir

3

Просто додайте це у свій файл маніфесту:

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

Наприклад...

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

І, будь ласка, оновіть свою бібліотеку google play lib ... Перейдіть до Вікна -> Android sdk manager-> оновіть google play службу ... встановив її..видаліть стару і збережіть цю. Візьміть це з ANDROID-SDK-DIRECTORY / extras / google / google_play_services /

Дякую..Будь ласка, проголосуйте


3

Я вирішив цю помилку, перевіривши ім'я пакета в маніфесті та програмі build.gradle.

У маніфесті:

Я використовую назву пакету як:

com.app.triapp

У додатку build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

Після зміни на com.app.triappв build.gradle, вирішив мою проблему.


1
Дуже дякую. Ви економите мою тонну часу.
YeeKhin

1
Чудовий брате. У мене все добре, замість цього
Мубашар Джавед

2

Я переходжу з V1 на V2 Карт Google. Я отримав цю помилку, намагаючись запустити програму через Eclipse. Першопричиною для мене було використання мого сховища ключів сертифікату випуску, а не сховища ключів налагодження Android, яке використовується, коли ви запускаєте його через Eclipse. Наступна команда (OSX / Linux) отримає вам ключ SHA1 від налагоджувального сховища:

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

Якщо ви використовуєте Windows 7 замість цього, ви б використали цю команду:

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

Напевно, найкраще повністю видалити програму з пристрою, перш ніж спробувати створити новий ключ, оскільки Android кешує дані безпеки.


1

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

У мене також була ця помилка, вам потрібно: Файл -> імпорт -> Існуючий код Android в робочу область -> Огляд -> SDK Android -> Додатки -> google -> google_play_services -> lib_project -> google_play_services_lib та OK. Перевірте проект і завершіть.

Проект переходить до Package Explorer. Тепер перейдіть до свого проекту (з помилкою) -> властивості -> Android і в Бібліотеці натисніть Додати ... google_play_services_lib повинен бути там! додайте і повторіть спробу :)


1

У мене була та сама проблема, але виявилося, що це було тому, що я створив два різні ключі API мапи з однаковим відбитком пальця SHA-1 з майже подібною назвою пакету com.bla.blaта інший com.bla.bla.something.


0

У мене була така сама проблема, і мені просто потрібно було встановити SDK для бібліотечного проекту MapsApiV2 на Android 2.3.3 (API lvl 10)


Я не пам’ятаю цього
Informatic0re

0

У мене було те саме питання. Приблизно через дві години гуглиння, повторних спроб, багаторазового відновлення ключа API тощо. Я виявив, що ввімкнув неправильну службу в консолі Google APis. Я увімкнув службу Google Maps API v2 , але для додатків Android ви повинні використовувати Google Maps Android API v2 . Після увімкнення правильної служби всі почали працювати.


0

ВАШ ЕКЛІПС МОЖЕ ЗМІНИТИ КЛЮЧ SHA1, тому ви повинні відрегулювати свій ключ Google за допомогою нового ключа SHA1 тут: https://console.developers.google.com/project/watchful-net-796/apiui/credential Після цього скопіюйте новий ключ в маніфест і кілька разів перезавантажте цю сторінку google, і ваш ключ буде оновлений, відновіть свій проект, він буде працювати. P / S: За свою помилку я видалив папку .android, тому eclipse regen SHA1.


0

Я виконував той самий крок, передбачений у Google Doc, але отримував ту саму помилку. Пізніше я зрозумів, що підписую свою програму за допомогою app.keystore, а ключ SHA, який я використовував для створення ключа API, був налагоджувальним.

Тому я просто видалив файл signingConfig signingConfig.genericіз build.gradleфайлу, і моя карта почала працювати нормально.

Сподіваюся, що це комусь допоможе.


0

Я зіткнувся з тим же питанням.

Якщо ви видали API для своєї випускової версії програми. Тоді цей api працюватиме лише для версії випуску, а не для версії для налагодження. Тож переконайтеся, що ви використовуєте релізну версію у своєму телефоні чи емуляторі.


0

Для мене все працювало як в емуляторі, так і на фізичному пристрої.

Однак це перестало працювати для мене, коли я налаштував другу машину для налагодження тієї ж програми в емуляторі з новішим рівнем API.

Я не розумів, що відбиток пальця на цій машині змінився. Побачивши журнал помилок автентифікації в Журналі пристроїв, я уважно порівняв відбиток пальця в моїй консолі розробника Google з тим, що міститься в повідомленні про помилку. Саме тоді я побачив різницю. Після додавання нового відбитка пальця до консолі розробника (у поєднанні з назвою пакету) мій додаток почав працювати, як очікувалося, в емуляторі нової системи.

Тож якщо ви налаштували нову систему, ще раз перевірте свої відбитки пальців!


0
  • Переконайтеся, що Карти SDK for Androidввімкнено в консолі API.
  • Також вам може знадобитися додати назву пакета та відбиток пальця сертифіката підпису SHA-1, щоб обмежити використання для повного ввімкнення ключа.

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.