Ошибка авторизации Google Maps Android API v2


95

Мои шаги:

  • получил код SHA1 из debug.keystore
  • создать приложение в консоли API Google
  • включен API карты Google 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" в библиотеки

После компиляции произошел сбой:

  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 not found. Теперь я изменил свой код на ваш программный способ реализации MapFragment, и он работает! Спасибо! Но вам нужно создать свой ключ, как описано ниже
Informatic0re

Ответы:


104

Шаги :

  • чтобы убедиться, что на устройстве есть APK сервисов Google Play
  • для установки Google Play Service 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 V2 для Android.

Если вы создаете приложение с минимальным SDK = 8, используйте библиотеку поддержки Android v4 + SupportMapFragment вместо MapFragment.


Эти инструкции не сделали всю работу. Мне нужно было скопировать proguard.cfg из примера приложения Maps API. Только после этого заработало.
Йоэль Глушнайдер

Кроме того, я заметил, что алгоритм подписи ДОЛЖЕН быть SHA1withRSA, а НЕ SHA256withRSA (значение по умолчанию, созданное eclipse для ключа отладки).
Йоэль Глушнайдер

1
Спасибо! to enable "Google Maps Android API v2" -шаг решил мою проблему.
Johan

1
@YoelGluschnaider: Как я могу изменить алгоритм по умолчанию с SHA256withRSA на SHA1withRSA?
Santhosh

Спасибо! Меня спасла ваша идея использовать SupportMapFragment.
Илья Коган

35

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


6
Не могу поверить, что это сработало. Спасибо @Alejandro del Rio :)
Фил

Бьюсь об заклад, как и я, 90% людей здесь действительно хотят этот ответ, а не выбранный (хотя тоже полезный)
Калиски

В моем случае кеш (?) Был обновлен, когда я читал Stackoverflow с сообщением об ошибке аутентификации в журнале. Приложение работало с экраном while, через несколько минут карта была загружена и ошибок аутентификации больше не было. Думаю, переустановка тоже сделала бы это.
Джон

2
Для будущих читателей. Удалите binи gen. Очистите, перестройте и обновите кэшированные учетные данные.
Георгий Дарамовскас 02

20

Так как я потратил много времени на то, чтобы заставить API работать, я постараюсь провести пошаговую проверку для Map API v2:

Шаг 1. Подайте заявку на получение ключа API

Если вы не знакомы с консолью Google API, прочитайте очень хороший ответ Rusfearuth выше.

Шаг 2: проверьте свой SHA-хэш (в этом случае я использую ключ отладки 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, вам необходимо добавить поддержку в Activity:

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

Это устранит вашу первую проблему.

Я не уверен насчет второго, но это может быть побочный эффект первого. Я все еще пытаюсь заставить карту работать в моем собственном приложении :)


Я скопировал extras / google / google_play_services / libproject / libs / google-play-services.jar в MY_PROJECT / libs.
Rusfearuth

Этого недостаточно. Вам нужно использовать весь проект библиотеки, так как он включает в себя множество ресурсов. В Eclipse вы можете импортировать новый проект Android и просто указать его в каталоге libproject. Затем в свойствах вашего собственного проекта добавьте ссылку на него.
Скотт Кеннеди

Я не использую Eclipse (используйте Idea)
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 KEY, поскольку он больше не нужен.

  3. В файле манифеста я заменил старое значение API KEY на ярлык строки, созданный этим новым XML-файлом: android:value="@string/google_maps_key"вместо того, чтобы указывать 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 должно соответствовать тексту имени пакета на странице учетных данных.


Это именно то, что случилось со мной, и это решение устранило предупреждение с консоли. Каким-то образом билд Ionic изменил это.
космонавт

После поиска в течение 8 часов я оглядываюсь назад и применяю это решение. Solved!!!
meyasir 01

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 ... Перейдите в Окно -> 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 Maps. У меня возникла эта ошибка при попытке запустить приложение через 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"

У A тоже была эта ошибка, вам необходимо: Файл -> импорт -> Существующий код Android в рабочую область -> Обзор -> Android SDK -> дополнительные функции -> google -> google_play_services -> lib_project -> google_play_services_lib и ОК. Проверить проект и Готово.

Проект переходит в обозреватель пакетов. Теперь перейдите в свой проект (с ошибкой) -> свойства -> 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

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


0

ВАШ ECLIPSE МОЖЕТ БЫТЬ ИЗМЕНЕН КЛЮЧОМ 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.