Otorisasi Google Maps Android API v2 gagal

95

Langkah saya:

  • mendapat kode SHA1 dari debug.keystore
  • buat aplikasi di konsol google apis
  • mengaktifkan google map api v2
  • masukan SHA1; my.package.name
  • dapatkan kunci API
  • membuat file 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>
  • membuat tata letak

  • letakkan "google-play-services.jar" ke libs

Setelah kompilasi, saya mengalami 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.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)

Setelah itu saya mengubah tata letak menjadi:

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

dan mengubah MyActivity menjadi

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

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

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

Hasilnya, aplikasi dijalankan, tetapi saya tidak melihat petanya.

Log konsol:

ERROR/Google Maps Android API(10369): Authorization failure.
Rusfearuth
sumber
1
OH TUHAN! saya selalu kesalahan yang sama R $ stylable class tidak ditemukan. Sekarang saya mengubah kode saya ke cara terprogram Anda untuk mengimplementasikan MapFragment dan berhasil! Terima kasih! Tetapi Anda perlu membuat kunci Anda seperti yang dijelaskan di bawah ini
Informatic0re

Jawaban:

104

Langkah-langkahnya :

  • untuk memastikan bahwa perangkat memiliki APK layanan Google Play
  • untuk menginstal rev. Layanan Google Play. lebih dari 2

masukkan deskripsi gambar di sini

  • untuk membuat proyek di https://code.google.com/apis/console/
  • untuk mengaktifkan "Google Maps Android API v2" masukkan deskripsi gambar di sini
  • untuk mendaftar SHA1 dalam proyek ( SEKARANG, ANDA PERLU MENULIS SHA1; nama.paket.apanda.anda ) di konsol API dan dapatkan KUNCI API
  • untuk menyalin direktori ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_lib ke root proyek Anda
  • untuk menambahkan baris berikutnya ke properti_proyek / proyek.anda

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

  • untuk menambahkan baris berikutnya ke YOUR_PROJECT/proguard-project.txt

.

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

Sekarang Anda siap untuk membuat aplikasi Google Map Anda sendiri dengan menggunakan Google Map API V2 untuk Android.

Jika Anda membuat aplikasi dengan min SDK = 8, gunakan pustaka dukungan android v4 + SupportMapFragment sebagai ganti MapFragment.

Rusfearuth
sumber
Instruksi ini tidak melakukan keseluruhan pekerjaan. Saya perlu menyalin proguard.cfg dari aplikasi contoh API peta. Baru kemudian itu mulai bekerja.
Yoel Gluschnaider
Juga, saya perhatikan bahwa Signature Algorithm HARUS SHA1withRSA dan BUKAN SHA256withRSA (default dibuat oleh eclipse untuk kunci debug).
Yoel Gluschnaider
1
Terima kasih! to enable "Google Maps Android API v2" -langkah memecahkan masalah saya.
Johan
1
@YoelGluschnaider: Bagaimana cara mengubah algoritma default dari SHA256withRSA ke SHA1withRSA?
Santhosh
Terima kasih! Saya terselamatkan oleh ide Anda untuk menggunakan SupportMapFragment.
Ilya Kogan
35

Juga periksa posting ini: Kode Sampel Google Map Android Api V2 tidak berfungsi , jika Anda benar-benar yakin Anda melakukan langkah-langkah yang benar kemudian ikuti jawaban kedua, otentikasi disimpan di suatu tempat, coba hapus instalan aplikasi secara manual (seperti yang Anda lakukan dengan aplikasi normal) lalu "Jalankan" lagi proyek tersebut

adelriosantiago
sumber
6
Saya tidak percaya itu berhasil. Terima kasih @Alejandro del Rio :)
phil
Saya yakin, sama seperti saya, 90% orang di sini benar-benar menginginkan jawaban ini dan bukan yang dipilih (meskipun membantu juga)
Kalisky
Dalam kasus saya, cache (?) Telah diperbarui saat saya membaca Stackoverflow dengan pesan kesalahan otentikasi di log. Aplikasi berjalan dengan while screen, setelah beberapa menit peta dimuat dan tidak ada lagi kesalahan autentikasi. Saya kira instal ulang juga akan berhasil.
Yohanes
2
Untuk pembaca selanjutnya. Hapus bindan gen. Bersihkan, bangun kembali, dan kredensial yang di-cache diperbarui.
George Daramouskas
20

Karena saya hanya membuang banyak waktu untuk mengaktifkan API, saya akan mencoba memberikan validasi langkah demi langkah untuk Map API v2:

Langkah 1: Ajukan permohonan untuk kunci API Anda

Jika Anda tidak terbiasa dengan konsol Google API, baca jawaban yang sangat bagus dari Rusfearuth di atas.

Langkah 2: Periksa Anda SHA Hash (dalam hal ini saya menggunakan kunci debug dari eclipse):

Di mesin Windows, masuk ke direktori pengguna Anda pada prompt perintah:

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

Anda akan mendapatkan sesuatu seperti:

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

Kemudian lihat nama paket Anda dari aktivitas peta, misalnya com.example.mypackagename

Gabungkan ini dan periksa dengan setelan Anda di konsol 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

di mana Anda mendapatkan kunci API Anda:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

Langkah 3. Manifestasikan meta data

Periksa apakah meta-data ada dan berisi kunci yang benar. Jika Anda merilis aplikasi, Anda memerlukan kunci yang berbeda.

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

Langkah 4. Fitur manifes:

Anda memerlukan entri ini karena API peta memerlukan beberapa dukungan grafik:

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

Jangan khawatir, 99,7% perangkat mendukung ini.

Langkah 5. Perpustakaan manifes:

Tambahkan perpustakaan 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.

Langkah 6. Izin manifes:

Periksa nama paket dua kali: 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" />

Tambahkan izin berikut:

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

Izin berikut ini opsional dan tidak diperlukan jika Anda hanya menampilkan peta. Cobalah untuk tidak menggunakannya.

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

Langkah 7. Sertakan fragmen peta ke dalam tata letak Anda:

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

Jika rilis Anda ke versi Android 2.x, Anda perlu menambahkan dukungan dalam Aktivitas Anda:

import android.support.v4.app.FragmentActivity;

Untuk peta: entri untuk bekerja termasuk

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

dalam layout aktivitas Anda (misalnya LinearLayout).

Dalam kasus saya, saya harus membersihkan proyek setiap kali saya mengubah sesuatu di tata letak. Sepertinya bug.

Langkah 8: Gunakan Eclipse - Project - Clean.

Nikmati!

Gunnar Bernstein
sumber
saya mengikuti langkah Anda tetapi kesalahan dalam kunci api, solusi apa saja?
Hemantvc
1
+1 untuk <meta-data android: name = "com.google.android.maps.v2.API_KEY" android: value = "AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />
The-null-Pointer-
16

Anda perlu menggunakan proyek perpustakaan yang terletak di: ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libproject

Ini akan memperbaiki masalah pertama Anda.

Saya tidak yakin tentang yang kedua, tetapi itu mungkin efek samping dari yang pertama. Saya masih mencoba membuat peta berfungsi di aplikasi saya sendiri :)

Scott Kennedy
sumber
Saya menyalin ekstra / google / google_play_services / libproject / libs / google-play-services.jar ke MY_PROJECT / libs.
Rusfearuth
Itu tidak cukup. Anda perlu menggunakan seluruh proyek perpustakaan, karena mencakup banyak sumber daya. Di Eclipse, Anda dapat mengimpor proyek Android baru, dan mengarahkannya ke direktori libproject. Kemudian di properti proyek Anda sendiri, tambahkan referensi ke sana.
Scott Kennedy
Saya tidak menggunakan Eclipse (gunakan Idea)
Rusfearuth
Saya tidak yakin bagaimana proyek perpustakaan bekerja di Idea, tetapi blogs.jetbrains.com/idea/2010/09/… harus memiliki informasi itu.
Scott Kennedy
17
Saya telah menemukan mengapa itu tidak berhasil. Saya mengaktifkan Google Map API v2, bukan layanan Google Map Android API v2. = (Malu padaku ....
Rusfearuth
5

Hari ini saya menghadapi masalah ini. Saya menggunakan Android Studio 2.1.3, windows 10. Sementara debugging berfungsi dengan baik, tetapi jika saya memperbarui ke mode rilis itu tidak berfungsi. Saya menghapus semua kondisi proguard, diperbarui, tetapi ini bukan solusi.

Solusinya terkait dengan struktur proyek. File google_maps_api.xml berbeda antara app \ src \ debug \ res dan app \ src \ release \ res. Saya melakukan copy paste manual dari debug ke folder rilis.

Sekarang berhasil.

Yaya
sumber
4

Saya mengikuti sebagian besar, jika tidak semua, saran Gunnar Bernstein yang disebutkan di atas dan masih tidak berhasil. Namun, itu mulai bekerja setelah saya mengikuti sarannya DAN yang berikut ini:

  1. Saya membuat MapActivity baru dengan menggunakan daftar opsi klik kanan Android Studio: New -> Google -> Google Maps Activity

  2. Saya kemudian membuka file google_maps_api.xml yang secara otomatis dihasilkan dan menggunakan tautan yang dinyatakan untuk membuat KUNCI API baru. Saya melakukan semua langkah dan menyimpan kunci baru saya di bawah proyek saya saat ini. Saya kemudian menghapus KUNCI API lama saya yang terdaftar karena tidak lagi diperlukan.

  3. Di bawah file Manifes, saya mengganti nilai API KEY lama dengan pintasan string yang dibuat oleh file XML baru ini: android:value="@string/google_maps_key", alih-alih menyatakan KUNCI secara langsung.

  4. Terakhir, hapus MapActivity baru, tetapi pertahankan file xml yang telah dibuat dalam proses itu.

Catatan: Dengan membuat API KEY dengan cara ini, kolom Pembatasan, di bawah Kredensial, sekarang menyatakan "Aplikasi Android". Sebelumnya, jika tidak berhasil, kolom menyatakan "Aplikasi Android, 1 API" atau yang serupa. Saya tidak tahu apakah ini membuat perbedaan atau tidak. Catatan: Tidak, itu hanya berarti saya tidak memiliki API khusus yang dipilih untuk kunci API ini (Konsol -> Kunci API -> Batasan kunci -> Batasan API).

Catatan: Sepertinya tag meta-data di bawah file Manifes:

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

telah digantikan oleh:

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

Saya rasa keduanya dapat digunakan tetapi lebih baik dari awal menggunakan yang terakhir.

Catatan: Nilai yang dinyatakan, dalam file build.gradle, di bawah android -> defaultConfig -> applicationId harus cocok dengan teks Nama paket di bawah halaman Kredensial.

goldenmaza
sumber
Inilah yang sebenarnya terjadi pada saya dan solusi ini memperbaiki peringatan dari konsol. Entah bagaimana build ionic mengubahnya.
spaceman
Setelah mencari selama 8 jam, saya melihat ke belakang dan menerapkan solusi ini. Solved!!!
meyasir
3

Tambahkan saja ini ke file manifes Anda:

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

Sebagai contoh...

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

Dan mohon perbarui lib layanan google play Anda ... Buka Window -> Android sdk manager-> perbarui layanan google play ... pasang itu..hapus yang lama dan simpan yang ini. Ambil ini dari ANDROID-SDK-DIRECTORY / extras / google / google_play_services /

Terima kasih..Silakan pilih

Mitul Goti
sumber
3

Saya memecahkan kesalahan ini dengan memeriksa nama paket di manifes dan aplikasi build.gradle.

Dalam manifes:

Saya menggunakan nama paket sebagai:

com.app.triapp

Dalam app build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

Setelah berubah menjadi com.app.triappdi build.gradle, memecahkan masalah saya.

Steve
sumber
1
Terima kasih banyak. Anda menghemat banyak waktu saya.
YeeKhin
1
Luar biasa Bro. Saya memiliki semuanya baik-baik saja, alih-alih yang ini
Mubashar Javed
2

Saya bermigrasi dari V1 ke V2 dari Google Maps. Saya mendapatkan kegagalan ini saat mencoba menjalankan aplikasi melalui Eclipse. Akar masalah bagi saya adalah menggunakan keystore sertifikat rilis saya daripada keystore debug Android yang digunakan saat Anda menjalankannya melalui Eclipse. Perintah berikut (OSX / Linux) akan memberi Anda kunci SHA1 dari keystore debug:

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

Jika Anda menggunakan Windows 7, Anda akan menggunakan perintah ini:

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

Mungkin yang terbaik adalah mencopot pemasangan aplikasi Anda sepenuhnya dari perangkat Anda sebelum mencoba dengan kunci baru karena Android menyimpan cache kredensial keamanan.

Chris Knight
sumber
1

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

A mengalami kesalahan ini juga, Anda perlu: File -> import -> Kode Android yang Ada Ke Ruang Kerja -> Jelajahi -> Android sdks -> ekstra -> google -> google_play_services -> lib_project -> google_play_services_lib dan OK. Periksa proyek dan Selesai.

Proyek masuk ke Package Explorer. Sekarang masuk ke proyek Anda (dengan kesalahan) -> properti -> Android dan di Perpustakaan klik Tambah ... google_play_services_lib seharusnya ada di sana! tambahkan dan coba lagi :)

edwell
sumber
1

Saya memiliki masalah yang sama tetapi ternyata itu karena saya membuat dua kunci API peta yang berbeda dengan sidik jari SHA-1 yang sama dengan nama paket yang hampir serupa com.bla.bladan yang lainnya com.bla.bla.something.

Zamrony P. Juhara
sumber
0

Saya memiliki masalah yang sama persis dan saya hanya perlu mengatur SDK untuk proyek perpustakaan MapsApiV2 ke Android 2.3.3 (API lvl 10)

Informatic0re
sumber
Saya tidak dapat mengingat hal ini
Informatic0re
0

Saya memiliki masalah yang sama. Setelah sekitar dua jam googling, mencoba lagi, membuat ulang API Key berkali-kali, dll. Saya menemukan bahwa saya mengaktifkan layanan yang salah di Google APis Console. Saya mengaktifkan Layanan Google Maps API v2 , tetapi untuk Aplikasi Android Anda harus menggunakan Google Maps Android API v2 . Setelah mengaktifkan layanan yang tepat, semuanya mulai bekerja.

Nino Stella
sumber
0

ECLIPSE ANDA MUNGKIN BERUBAH KUNCI SHA1, jadi Anda harus memperbarui kunci google dengan kunci SHA1 baru di sini: https://console.developers.google.com/project/watchful-net-796/apiui/credential Setelah itu, salin kunci baru ke dalam manifes dan muat ulang halaman google ini beberapa kali, dan kunci Anda akan diperbarui, membangun kembali proyek Anda, itu akan berfungsi. P / S: Untuk kesalahan saya, saya menghapus folder .android jadi gerhana regen SHA1.

nobjta_9x_tq
sumber
0

Saya mengikuti langkah yang sama yang disediakan di Google Doc tetapi saya mendapatkan kesalahan yang sama. Kemudian saya menyadari bahwa saya menandatangani aplikasi saya dengan app.keystore saya dan kunci SHA yang saya gunakan untuk menghasilkan kunci API adalah kunci debug.

Jadi saya hanya menghapus signingConfig signingConfig.genericdari build.gradlefile dan peta saya mulai berfungsi dengan baik.

Semoga ini bisa membantu seseorang.

SKP
sumber
0

Saya menghadapi masalah yang sama.

Jika Anda mengeluarkan api untuk versi rilis aplikasi Anda. Kemudian api itu hanya akan bekerja untuk versi rilis bukan untuk versi debug. Jadi pastikan Anda menggunakan versi rilis di ponsel atau emulator Anda.

Salman Saleh
sumber
0

Bagi saya, semuanya berfungsi baik di emulator maupun di perangkat fisik.

Namun, itu berhenti berfungsi untuk saya ketika saya menyiapkan mesin kedua untuk men-debug aplikasi yang sama di emulator dengan level API yang lebih baru.

Saya tidak menyadari bahwa sidik jari untuk mesin itu berubah. Setelah melihat log kesalahan kegagalan otentikasi di Log Perangkat, saya membandingkan sidik jari di Konsol Pengembang Google saya dengan sidik jari di pesan kesalahan. Saat itulah saya melihat perbedaannya. Setelah menambahkan sidik jari baru ke Konsol Pengembang (dikombinasikan dengan nama paket) aplikasi saya mulai bekerja seperti yang diharapkan di emulator pada sistem baru.

Jadi, jika Anda menyiapkan sistem baru, periksa sidik jari Anda lagi!

DankMemester 'Andrew Servania'
sumber
0
  • Pastikan Maps SDK for Androiddiaktifkan di konsol API.
  • Anda juga mungkin perlu menambahkan nama paket dan sidik jari sertifikat penandatanganan SHA-1 untuk membatasi penggunaan agar kunci Anda diaktifkan sepenuhnya.

masukkan deskripsi gambar di sini

ini. Nyonya
sumber