2015-06-22 6 views
1

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

Прежде всего, я покажу свой код, а затем расскажу, что происходит.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="elephant.tuskapp" 
     android:versionCode="49" 
     android:versionName="4.6"> 

    <uses-sdk android:minSdkVersion="15"/> 
    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true"/> 
    <permission android:name="elephant.tuskapp.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature"/> 
    <uses-permission android:name="elephant.tuskapp.permission.MAPS_RECEIVE"/> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_GPS"/> 
    <uses-permission android:name="android.permission.ACCESS_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.CALL_PHONE"/> 
    <uses-permission android:name="android.permission.WAKE_LOCK"/> 
    <uses-permission android:name="android.permission.SEND_SMS"/> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <uses-permission android:name="android.permission.CAMERA"/> 
    <uses-feature android:name="android.hardware.camera"/> 
    <uses-feature android:name="android.hardware.camera.autofocus"/> 

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/> 

    <permission android:name="elephant.tuskapp.permission.C2D_MESSAGE" android:protectionLevel="signature"/> 
    <uses-permission android:name="elephant.tuskapp.permission.C2D_MESSAGE"/> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:name=".NVtuskapplication" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 

     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 

     <activity 
      android:name=".activity.MainActivity" 
      android:label="@string/activity_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 

     <receiver android:name="elephant.tuskapp.service.AlarmReceiver"></receiver> 

    <receiver android:name="elephant.tuskapp.service.TimeSynchronizer"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_TIME_CHANGED"/> 
       <action android:name="android.intent.action.TIMEZONE_CHANGED"/> 
     </intent-filter> 
    </receiver> 

    <service android:name=".service.GPSService"></service> 
    <service android:name=".service.RouteUpdateService"></service> 

    <meta-data android:name="com.google.android.gms.version" 
       android:value="@integer/google_play_services_version"/> 

    <receiver 
      android:name=".service.GcmBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE"/> 
      <category android:name="elephant.tuskapp"/> 
     </intent-filter> 
    </receiver> 
    <service android:name=".service.GcmIntentService"/> 

    <meta-data 
     android:name="io.fabric.ApiKey" 
     android:value="key" /> 

    <!-- google maps api v2--> 
    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="key"/> 
</application> 

Layout XML

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:name="com.google.android.gms.maps.MapFragment"/> 

Основная деятельность

package elephant.tuskapp.activity; 
import android.app.Activity; 
import android.os.Bundle; 
import elephant.tuskapp.R; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.route_details); 
    } 
} 

Когда я запускаю свое приложение, я вижу пустой холст с логотипом Google в левом нижнем углу. Logcat выдает следующую ошибку:

-22 20:47:24.822 22720-22720/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: free.elephant.tuskapp, PID: 22720 
java.lang.RuntimeException: Unable to start activity ComponentInfo{free.elephant.tuskapp/elephant.tuskapp.activity.MainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2301) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2361) 
     at android.app.ActivityThread.access$800(ActivityThread.java:147) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5232) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:767) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:486) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:418) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:377) 
     at android.app.Activity.setContentView(Activity.java:2161) 
     at elephant.tuskapp.activity.MainActivity.onCreate(MainActivity.java:18) 
     at android.app.Activity.performCreate(Activity.java:5984) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2254) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2361) 
      at android.app.ActivityThread.access$800(ActivityThread.java:147) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5232) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
Caused by: java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml 
     at com.google.maps.api.android.lib6.d.fk.a(Unknown Source) 
     at com.google.maps.api.android.lib6.a.g.a(Unknown Source) 
     at com.google.android.gms.maps.internal.CreatorImpl.b(Unknown Source) 
     at com.google.android.gms.maps.internal.CreatorImpl.b(Unknown Source) 
     at com.google.android.gms.maps.internal.i.onTransact(SourceFile:62) 
     at android.os.Binder.transact(Binder.java:380) 
     at com.google.android.gms.maps.internal.zzc$zza$zza.zzr(Unknown Source) 
     at com.google.android.gms.maps.MapFragment$zzb.zzvu(Unknown Source) 
     at com.google.android.gms.maps.MapFragment$zzb.zza(Unknown Source) 
     at com.google.android.gms.dynamic.zza.zza(Unknown Source) 
     at com.google.android.gms.dynamic.zza.onInflate(Unknown Source) 
     at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source) 
     at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2117) 
     at android.app.Activity.onCreateView(Activity.java:5333) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:737) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:486) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:418) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:377) 
      at android.app.Activity.setContentView(Activity.java:2161) 
      at elephant.tuskapp.activity.MainActivity.onCreate(MainActivity.java:18) 
      at android.app.Activity.performCreate(Activity.java:5984) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2254) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2361) 
      at android.app.ActivityThread.access$800(ActivityThread.java:147) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5232) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

Знакомое право? Вы видите это во многих других вопросах. Я думаю, что отличает мой вопрос от других, у меня может возникнуть проблема с разными вкусами моего приложения.

Чтобы устранить ошибки, с которыми столкнулись другие, я сделал следующее: - Убедитесь, что мои ключи api находятся в теге файла манифеста. - Убедитесь, что Google Maps API v2 для Android включен в консолях Google - Я использую Службы Google Play через Gradle (прокрутите вниз для моего фрагмента градиента) - Я удостоверился, что установлены все основные разрешения - Я обязательно включил glEsVersion.

Что я думаю о проблеме?

Я думаю, что у меня возникла проблема с моим вкусом «free.elephant.tuskapp» для аутентификации с серверами googles. В моем Gradle строить, я поддерживать две различные ароматы моего приложения, и я, кажется, получаю сообщение об ошибке с аутентификацией:

Ensure that the "Google Maps Android API v2" is enabled. 
Ensure that the following Android Key exists: 
API Key: myAPIKEY 
Android Application (<cert_fingerprint>;<package_name>): SHA-1;free.elephant.tuskapp 

Я получил мой API с помощью «elephant.tuskapp» имени пакета, а не «бесплатно .elephant.tuskapp»

Вот мой Gradle строить, если это какой-либо помощи: Gradle

buildscript { 
     repositories { 
      maven { 
       url 'https://maven.fabric.io/public' 
      } 
     } 

     dependencies { 
      classpath 'io.fabric.tools:gradle:1.+' 
     } 
    } 
    apply plugin: 'com.android.application' 
    apply plugin: 'io.fabric' 

    repositories { 
     maven { 
      url 'https://maven.fabric.io/public' 
     } 
    } 


    android { 
     compileSdkVersion 22 
     buildToolsVersion "23.0.0 rc2" 

     defaultConfig { 
      applicationId "elephant.tuskapp" 
      minSdkVersion 15 
      targetSdkVersion 15 
     } 

     productFlavors { 
      demo { 
       applicationId "demo.elephant.tuskapp" 
      } 
      free { 
       applicationId "free.elephant.tuskapp" 
      } 
     } 

     buildTypes { 
      release { 
       minifyEnabled false 
       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
      } 
     } 
    } 

    dependencies { 
     compile 'com.google.android.gms:play-services:7.5.0' 
     compile 'com.google.zxing:core:3.2.0' 
     compile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
      transitive = true; 
     } 
    } 

Am I отсутствует на что-то? Или это действительно связано с моими сборками аромата? Если это ароматы, вызывающие проблемы, как я должен справиться с этим? Я создал новые ключи api для всех моих вкусов, но я не вижу, как я должен делать эту работу в файле манифеста, а также выглядеть элегантно.

ответ

0

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

SHA1; имя_пакет

Затем нажмите клавишу ВВОД

SHA1; packagename2 (аромат)

В моем случае это было:

SHA1;elephant.tuskapp 
SHA1;free.elephant.tuskapp 
SHA1;demo.elephant.tuskapp 
2

В соответствии с вашим logcat, он говорит что-то не так с вашей картой фрагмента карты. Кроме того, я обнаружил, что в вашем MainActivity ничего не найдено, я думаю, что вы должны иметь исходную карту. Для получения дополнительной информации вы можете обратиться к коду here.

Пример код:

public class MainActivity extends FragmentActivity { 

    GoogleMap mGoogleMap; 
    private static LatLng MountainView = new LatLng(37.42, -122.08); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Initial Map 
     try { 

      if (mGoogleMap == null) { 
       mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true); 
     mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
     mGoogleMap.getUiSettings().setZoomGesturesEnabled(true); 

     mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(MountainView, 15)); 

     Marker marker = mGoogleMap.addMarker(new MarkerOptions() 
       .position(MountainView) 
       .title("Have a nice day!")); 

    } 
} 
+0

Спасибо за ответ. Я попробовал это, но это разбило мое приложение. Поэтому я попробовал другой пример, но похоже, и теперь приложение показывает логотип google внизу, но карта не загружается. Это пустой холст карты: /. Никаких сообщений об ошибках от Logcat. –

+1

Итак, для серой карты это означает, что у вас что-то не так с вашим api-ключом, пожалуйста, следуйте [this] (https://www.youtube.com/watch?v=8ADb5bNOFHE), чтобы наконец показать карту. – bjiang

+0

Итак, я последовал за видео до конца, и у меня было все настроено, и в конце он указал на общую ошибку, которую я испытывал. Оказывается, мой api аутентифицируется с помощью моего free.elephant.driverapp. Могу ли я поддержать один апики для нескольких вкусов? –