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

Мои шаги:

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

Действия

  • чтобы гарантировать, что устройство имеет службы Google Play APK
  • для установки сервиса Google Play. более 2

enter image description here

  • для создания проекта https://code.google.com/apis/console/
  • чтобы включить "Google Maps Android API v2" enter image description here
  • зарегистрировать SHA1 в проекте (СЕЙЧАС, ВАМ НУЖНО WRITE 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.

Ответ 2

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

Ответ 3

Поскольку я просто потратил много времени на то, чтобы заставить 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" />

Если ваш выпуск версии 2.x Android вам нужно добавить поддержку в свою деятельность:

import android.support.v4.app.FragmentActivity;

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

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

в вашем макете действий (например, LinearLayout).

В моем случае я должен очищать проект каждый раз, когда я что-то меняю в макете. Кажется, это ошибка.

Шаг 8: Используйте Eclipse - Project - Clean.

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

Ответ 4

Вам необходимо использовать проект библиотеки, расположенный по адресу: ANDROID-SDK-DIRECTORY/дополнительные/Google/google_play_services/libproject

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

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

Ответ 5

Сегодня я столкнулся с этой проблемой. Я использовал Android Studio 2.1.3, Windows 10. Хотя отладка работает нормально, но если я обновляюсь до режима выпуска, это не сработает. Я очистил все условия proguard, обновил их, но это не было решением.

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

Теперь он работает.

Ответ 6

Я решил эту ошибку, проверив имя пакета в манифесте и приложении build.gradle.

В манифесте:

Я использую имя пакета как:

com.app.triapp

В приложении build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

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

Ответ 7

Просто добавьте это в файл манифеста:

**<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... Идите в Window → Android sdk manager- > обновите сервис google play... установили его.. удалите старый и сохраните его. Возьмите это из ANDROID-SDK-DIRECTORY/extras/google/google_play_services/

Спасибо... Пожалуйста, проголосуйте

Ответ 8

Я переношу с 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 кэширует учетные данные безопасности.

Ответ 9

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

  1. Я создал новую MapActivity, используя список щелчков правой кнопкой мыши Android Studio: Новый → Google → Активность в Google Картах

  2. Затем я открыл файл google_maps_api.xml, который автоматически генерируется и использует указанную ссылку для создания нового API-ключа. Я сделал все шаги и сохранил свой новый ключ в рамках моего текущего проекта. Затем я удалил свой старый зарегистрированный API-ключ, поскольку он больше не требуется.

  3. В файле Manifest я заменил старое значение API KEY ярлыком строки, созданным этим новым XML файлом: android:value="@string/google_maps_key ", вместо того, чтобы напрямую android:value="@string/google_maps_key KEY.

  4. Наконец, удалите новую MapActivity, но сохраните файл xml, который был создан в этом процессе.

Примечание: создав API-ключ таким образом, в разделе "Ограничения" в разделе "Учетные данные" теперь говорится "Приложения для Android". Раньше, когда он не работал, в колонке указывались "Android-приложения, 1 API" или что-то подобное. Я не знаю, имеет ли это значение или нет.

Примечание. Он выглядит как тег метаданных в файле манифеста:

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

был заменен на:

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

Я думаю, что оба они могут быть использованы, но лучше с самого начала использовать последний.

Примечание. Значение, указанное в файле build.gradle, под android → defaultConfig → applicationId, должно соответствовать тексту имени пакета на странице Credentials.

Ответ 10

"java.lang.NoClassDefFoundError: com.google.android.gms.R $стиль"

A тоже имела эту ошибку, вам необходимо: Файл → import → Существующий код для Android в рабочей области → Обзор → Android sdks → extras → google → google_play_services → lib_project → google_play_services_lib и ОК. Проверьте проект и Готово.

Проект отправляется в Package Explorer. Теперь перейдите в свой проект (с ошибкой) → свойства → Android и в библиотеке нажмите Добавить... google_play_services_lib должен быть там! добавьте и попробуйте еще раз:)

Ответ 11

У меня была такая же проблема, но оказалось, что это было потому, что я создал два разных ключа API карты с одним отпечатком SHA-1 с почти похожим именем пакета com.bla.bla и другим com.bla.bla.something.

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

Итак, я просто удалил файл signingConfig signingConfig.generic из build.gradle, и моя карта начала работать нормально.

Надеюсь, это поможет кому-то.

Ответ 16

Я столкнулся с той же проблемой.

Если вы выпустили api для своей версии приложения. Тогда api будет работать только для версии релиза, а не для отладочной версии. Поэтому убедитесь, что вы используете версию выпуска в своем телефоне или эмуляторе.