Google Maps Android API v2 인증 실패


95

내 단계 :

  • debug.keystore에서 SHA1 코드를 받았습니다.
  • Google API 콘솔에서 앱 만들기
  • 활성화 된 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>
  • 생성 된 레이아웃

  • libs에 "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
OMG! 나는 항상 동일한 오류 R $ stylable 클래스를 찾을 수 없습니다. 이제 MapFragment를 구현하는 프로그래밍 방식으로 코드를 변경했으며 작동합니다! 감사! 설명처럼하지만 당신은 당신에게 키를 생성해야
Informatic0re

답변:


104

단계 :

  • 기기에 Google Play 서비스 APK가 있는지 확인
  • Google Play 서비스 버전을 설치합니다. 2 이상

여기에 이미지 설명 입력

  • https://code.google.com/apis/console/ 에서 프로젝트를 만들려면
  • "Google Maps Android API v2"를 활성화하려면 여기에 이미지 설명 입력
  • 프로젝트에 SHA1을 등록하려면 ( NOW, YOU WRITE SHA1; your.app.package.nameAPI 콘솔 )에 하고 API KEY를 얻으려면
  • 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();

}

이제 Android 용 Google Map API V2를 사용하여 나만의 Google지도 앱을 만들 준비가되었습니다.

최소 SDK = 8로 애플리케이션을 생성하는 경우 MapFragment 대신 Android 지원 라이브러리 v4 + SupportMapFragment를 사용하세요.


이 지침은 전체 작업을 수행하지 않았습니다. 지도 API 샘플 애플리케이션에서 proguard.cfg를 복사해야했습니다. 그래야만 작동하기 시작했습니다.
Yoel Gluschnaider 2012

또한 서명 알고리즘은 SHA1withRSA 여야하고 SHA256withRSA가 아니어야합니다 (디버그 키에 대해 Eclipse에서 생성 한 기본값).
Yoel Gluschnaider 2012

1
감사! to enable "Google Maps Android API v2" -단계가 내 문제를 해결했습니다.
Johan

1
@YoelGluschnaider : 기본 알고리즘을 SHA256withRSA에서 SHA1withRSA로 어떻게 변경할 수 있습니까?
Santhosh 2013 년

감사합니다! 나는 SupportMapFragment를 사용하는 당신의 아이디어에 의해 저장되었습니다.
Ilya Kogan 2013 년

35

또한이 게시물을 확인하십시오 : Google Map Android Api V2 샘플 코드가 작동하지 않습니다 . 올바른 단계를 수행했다고 확신하는 경우 두 번째 답변을 따르십시오. 인증이 어딘가에 캐시되고 응용 프로그램을 수동으로 제거하십시오 ( 일반 응용 프로그램) 그런 다음 프로젝트를 다시 "실행"합니다.


6
나는 그것이 효과가 있다는 것을 믿을 수 없습니다. 감사합니다 @Alejandro 델 리오 :

난 그냥 나처럼, 사람들의 90 %가 여기에 정말로 원하는 베팅 대답을하지 선택된 하나 (비록 도움이 아니라)
Kalisky

제 경우에는 로그에 인증 오류 메시지와 함께 Stackoverflow를 읽는 동안 캐시 (?)가 업데이트되었습니다. 앱이 화면에서 실행 중이었고 몇 분 후에지도가로드되고 더 이상 인증 오류가 발생하지 않았습니다. 나는 다시 설치했을 것입니다.
John

2
미래의 독자를 위해. 삭제 bingen. 정리, 재 구축 및 캐시 된 자격 증명이 갱신됩니다.
George Daramouskas 2015

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

2.x Android 버전으로 릴리스하는 경우 활동에 지원을 추가해야합니다.

import android.support.v4.app.FragmentActivity;

지도 : 작업 할 항목은 다음과 같습니다.

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

활동 레이아웃 (예 : LinearLayout)에서.

제 경우에는 레이아웃에서 무언가를 변경할 때마다 프로젝트를 정리해야합니다. 버그 인 것 같습니다.

8 단계 : Eclipse-Project-Clean을 사용합니다.

즐겨!


나는 당신의 단계를 따르고 있지만 api 키, 어떤 해결책에 오류가 있습니까?
Hemantvc 2013-06-19

1
+1 for <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 디렉토리를 가리킬 수 있습니다. 그런 다음 자신의 프로젝트 속성에서 참조를 추가합니다.
Scott Kennedy

나는 이클립스 (사용 아이디어)를 사용하지 마십시오
Rusfearuth

Idea에서 도서관 프로젝트가 어떻게 작동하는지 잘 모르겠지만 blogs.jetbrains.com/idea/2010/09/…에 해당 정보가 있어야합니다.
스콧 케네디

17
작동하지 않는 이유를 찾았습니다. Google Map Android API v2 서비스 대신 Google Map 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

나는 위에서 언급 한 Gunnar Bernstein의 제안을 전부는 아니더라도 대부분 따랐지만 여전히 작동하지 않았습니다. 그러나 그의 제안과 다음을 따랐을 때 작동하기 시작했습니다.

  1. Android Studio의 오른쪽 클릭 옵션 목록을 사용하여 새 MapActivity를 만들었습니다. New-> Google- > Google Maps Activity

  2. 그런 다음 자동으로 생성 되는 google_maps_api.xml 파일 을 열고 명시된 링크를 사용하여 새 API 키를 생성했습니다. 모든 단계를 수행하고 현재 프로젝트에 새 키를 저장했습니다. 그런 다음 더 이상 필요하지 않으므로 이전에 등록 된 API 키를 제거했습니다.

  3. Manifest 파일 android:value="@string/google_maps_key에서 KEY를 직접 지정하는 대신 이전 API KEY 값을이 새 XML 파일에서 만든 문자열 바로 가기로 대체했습니다. ".

  4. 마지막으로 새 MapActivity를 제거하되 해당 프로세스에서 생성 된 xml 파일은 유지합니다.

참고 : 이러한 방식으로 API 키를 생성하면 자격 증명 아래의 제한 열에 "Android 앱"이 표시됩니다. 이전에는 작동하지 않았을 때 열에 "Android 앱, 1 API"또는 이와 유사한 내용이 표시되었습니다. 이것이 차이를 만드는지 아닌지는 모르겠습니다. 참고 : 아니요,이 API 키에 대해 선택한 특정 API가 없음을 의미합니다 (콘솔-> API 키-> 키 제한-> API 제한).

참고 : Manifest 파일 아래의 메타 데이터 태그처럼 보입니다.

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

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>

그리고 당신의 구글 플레이 서비스 라이브러리를 업데이트하십시오 ... 창-> 안드로이드 sdk 관리자-> 구글 플레이 서비스 업데이트 ... 설치했습니다 .. 이전 것을 삭제하고 이것을 유지하십시오. ANDROID-SDK-DIRECTORY / extras / google / google_play_services /에서 가져옵니다.

감사합니다 .. 투표 해주세요


3

매니페스트 및 앱에서 패키지 이름 을 확인하여이 오류를 해결했습니다 build.gradle.

매니페스트에서 :

패키지 이름을 다음과 같이 사용하고 있습니다.

com.app.triapp

앱 build.gradle에서 :

 defaultConfig {

        applicationId "com.app.live"
    }

변경 후 com.app.triappbuild.gradle, 내 문제를 해결했다.


1
감사합니다. 당신은 내 많은 시간을 절약합니다.
YeeKhin

1
훌륭한 형제. 내가 대신이 하나, 모든 확인이
Mubashar 자 베드

2

Google지도의 V1에서 V2로 마이그레이션 중입니다. Eclipse를 통해 앱을 실행하는 데 실패했습니다. 저의 근본 원인은 Eclipse를 통해 실행할 때 사용되는 Android 디버그 키 저장소가 아닌 릴리스 인증서 키 저장소를 사용하는 것입니다. 다음 명령 (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

나는 같은 문제가 있었지만 거의 비슷한 패키지 이름 com.bla.bla과 다른 하나의 동일한 SHA-1 지문으로 두 개의 다른 맵 API 키를 만들었 기 때문인 것으로 밝혀졌습니다 com.bla.bla.something.


0

나는 똑같은 문제가 있었고 MapsApiV2의 라이브러리 프로젝트에 대한 SDK를 Android 2.3.3 (API lvl 10)으로 설정해야했습니다.


나는이 물건을 기억할 수
Informatic0re

0

나는 같은 문제가 있었다. 약 2 시간 동안 인터넷 검색, 재시도, API 키 재생성 등을 여러 번 수행 한 후 Google APis 콘솔에서 잘못된 서비스를 활성화 한 것을 발견했습니다. Google Maps API v2 서비스를 활성화 했지만 Android 앱의 경우 Google Maps Android API v2 를 사용해야 합니다 . 올바른 서비스를 활성화 한 후 모든 것이 작동하기 시작했습니다.


0

ECLIPSE는 SHA1 키를 변경할 수 있으므로 여기에서 새 SHA1 키로 Google 키를 다시 생성해야합니다. https://console.developers.google.com/project/watchful-net-796/apiui/credential 그런 다음 새 키를 복사합니다. 매니페스트에 넣고이 Google 페이지를 몇 번 다시로드하면 키가 업데이트되고 프로젝트를 다시 빌드하면 작동합니다. 추신 : 내 오류로 인해 .android 폴더를 삭제하여 Eclipse가 SHA1을 재생성했습니다.


0

Google 문서에 제공된 동일한 단계를 따랐지만 동일한 오류가 발생했습니다. 나중에 나는 app.keystore로 내 앱에 서명하고 API 키를 생성하는 데 사용했던 SHA 키가 디버그 키라는 것을 깨달았습니다.

그래서 나는 단순히에서 제거 signingConfig signingConfig.generic했습니다.build.gradle 파일 하고 내지도가 제대로 작동하기 시작했습니다.

이것이 누군가를 돕기를 바랍니다.


0

나는 같은 문제에 직면했다.

애플리케이션의 릴리스 버전에 대한 API를 발행 한 경우. 그러면 해당 API는 디버그 버전이 아닌 릴리스 버전에서만 작동합니다. 따라서 휴대폰이나 에뮬레이터에서 릴리스 버전을 사용하고 있는지 확인하십시오.


0

저에게는 모든 것이 에뮬레이터와 물리적 장치에서 모두 작동했습니다.

그러나 새로운 API 수준의 에뮬레이터에서 동일한 앱을 디버깅하기 위해 두 번째 컴퓨터를 설정하면 작동이 중지되었습니다.

나는 지문이 그 기계 이 바뀌 었다는 습니다. 기기 로그에서 인증 실패 오류 로그를 확인한 후 Google 개발자 콘솔의 지문과 오류 메시지의 지문을 면밀히 비교했습니다. 그때 제가 그 차이를 보았습니다. 패키지 이름과 함께 개발자 콘솔에 새 지문을 추가 한 후 내 앱이 새 시스템의 에뮬레이터에서 예상대로 작동하기 시작했습니다.

따라서 새 시스템을 설정 한 경우 지문을 다시 확인하십시오!


0
  • SDK for AndroidAPI 콘솔에서 지도 가 활성화되어 있는지 확인하십시오 .
  • 또한 키 사용을 완전히 활성화하려면 패키지 이름과 SHA-1 서명 인증서 지문을 추가해야 할 수도 있습니다.

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.