Ошибка авторизации Google Maps Android API v2
мои действия:
- получил код SHA1 от отладки.хранилища ключей
- создать приложение в Google apis console
- включен 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-услуги.jar " to libs
после компиляция у меня есть crash:
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.access0(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.
16 ответов:
шаги:
- чтобы убедиться, что устройство имеет Google Play services APK
- установить Google Play услуг перераб. больше, чем 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.свойства
android.library.reference.1=google-play-services_lib
- добавить следующие строки
YOUR_PROJECT/proguard-project.txt
.
-keep class * extends java.util.ListResourceBundle { protected Object[][] getContents(); }
Теперь вы готовы создать свое собственное приложение Google Map с помощью Google Map APIs V2 для Android.
Если вы создаете приложение с min SDK = 8, пожалуйста, используйте библиотеку поддержки android v4 + SupportMapFragment вместо MapFragment.
также проверьте этот пост: Google Map Android Api V2 пример кода не работает, Если вы полностью уверены, что сделали правильные шаги, то следуйте второму ответу, аутентификация кэшируется где-то, попробуйте удалить приложение вручную (так же, как вы делаете с обычным приложением), затем "запустите" снова проект
так как я просто потратил много времени на то, чтобы 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.образец.имя_моего_пакета
вы объединяете это и проверяете это с вашими настройками в консоли 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.образец.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.
наслаждайтесь!
вы должны использовать проект библиотеки, расположенный по адресу: ANDROID-SDK-каталог / дополнительно / google / google_play_services / libproject
это исправит вашу первую проблему.
Я не уверен насчет второй, но это может быть побочным эффектом первого. Я все еще пытаюсь заставить карту работать в моем собственном приложении:)
сегодня я столкнулся с этой проблемой. Я использовал Android Studio 2.1.3, windows 10. Во время отладки он работает нормально, но если я обновляю режим выпуска, он не работает. Я очистил все условия proguard, обновил, но это не было решением.
решение связано со структурой проекта. В google_maps_api.XML-файл отличается от приложения\НИЦ\отладки\Res и приложения\НИЦ\выпуск\рез. Я сделал вручную копировать вставить из debug в папке release.
теперь все работает.
я решил эту ошибку путем проверки имя пакета в манифесте и приложение
build.gradle
.в манифесте:
я использую имя пакета как:
com.app.triapp
в приложения build.Gradle в:
defaultConfig { applicationId "com.app.live" }
после изменено на
com.app.triapp
наbuild.gradle
, решил мою проблему.
Я мигрирую с 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 кэширует учетные данные безопасности.
просто добавьте это в ваш файл манифеста:
**<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/
спасибо..Пожалуйста, проголосуйте
я следовал большинству, если не всем, предложениям Гуннара Бернштейна, упомянутым выше, и это все еще не сработало. Однако он начал работать после того, как я последовал его предложениям и следующим:
Я создал новую MapActivity с помощью правой кнопки мыши Android Studio список опций: Новый - > Google - > Google Maps Activity
затем я открыл google_maps_api.xml файл, который автоматически генерируется и использовал указанную ссылку для создания нового ключа API. Я сделал все шаги и сохранил мой новый ключ под моим текущим проектом. Я затем удалил мой старый зарегистрированный ключ API, поскольку он больше не требовался.
в файле манифеста Я заменил старое значение ключа API на ярлык строки, созданный этим новым XML-файлом:
android:value="@string/google_maps_key
", вместо указания ключа непосредственно.наконец, удалите новый MapActivity, но сохраните xml-файл, который был созданный в этом процесс.
Примечание: путем создания ключа API таким образом столбец ограничений, под учетными данными, теперь указано "Android apps". Ранее, когда он не работал, в столбце говорилось "приложения для Android, 1 API" или что-то подобное. Я не знаю, имеет ли это значение или нет.
Примечание: это похоже на тег метаданных под файлом Манифеста:
android:name="com.google.android.maps.v2.API_KEY
заменено:
android:name="com.google.android.geo.API_KEY"
Я думаю, что оба могут быть использованы, но это лучше с самого начала пользуюсь последним.
Примечание: значение, указанное в построении.файл Gradle, под android - > defaultConfig - > applicationId должен соответствовать имя пакета текст на странице учетные данные.
" java.ленг.NoClassDefFoundError: com.гуглить.андроид.СБМ.R$styleable"
У вас тоже была эта ошибка, вам нужно: Файл - > импорт - > существующий код Android в рабочую область - > обзор - > Android sdks - > дополнительно - > google - > google_play_services - > lib_project - > google_play_services_lib и OK. Проверьте проект и закончите.
проект переходит в Обозреватель пакетов. Теперь перейдите в свой проект (с ошибкой) -> свойства -> Android и в библиотеке нажмите кнопку Добавить... этот google_play_services_lib должен быть там! добавьте и повторите попытку:)
у меня была такая же проблема, но оказалось, что это было потому, что я создал два разных ключа Map API с одним и тем же отпечатком пальца SHA-1 с почти одинаковым именем пакета
com.bla.bla
и другиеcom.bla.bla.something
.
У меня была точно такая же проблема, и мне просто нужно было установить SDK для проекта библиотеки MapsApiV2 на Android 2.3.3 (API lvl 10)
У меня была та же проблема. Примерно через два часа гугля, повторных попыток, многократного восстановления ключа API и т. д. я обнаружил, что включил неправильную службу в консоли API Google. Я включил сервис Google Maps API v2, но для Android-приложений нужно использовать Google Maps Android API v2. После включения правильного сервиса все заработало.
ваше затмение, возможно, изменило ключ SHA1, поэтому вы должны восстановить свой ключ google с новым ключом SHA1 здесь: https://console.developers.google.com/project/watchful-net-796/apiui/credential После этого скопируйте новый ключ в манифест и перезагрузите эту страницу google несколько раз, и ваш ключ будет обновлен, перестроит ваш проект, он будет работать. P / S: для моей ошибки, я удалил .Android папка так затмение regen SHA1.
я следовал тому же шагу, предусмотренному в документе Google, но я получал ту же ошибку. Позже я понял, что подписываю свое приложение с помощью своего приложения.хранилище ключей и ключ SHA, который я использовал для создания ключа API, был отладочным.
поэтому я просто удалил
signingConfig signingConfig.generic
сbuild.gradle
файл и моя карта начали работать нормально.надеюсь, это кому-то поможет.