Google 地图 API v2 Android Studio 地图未加载

Google Maps API v2 Android Studio Map not loading

请记住,我已经阅读了数百个类似的问题,但我似乎划掉了关于如何获得 Google 地图开始工作。

首先,我将展示我的代码,然后我将讲述发生的事情。

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>

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

主要Activity

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);
    }
}

当我 运行 我的应用程序时,我看到一个空白 canvas,左下角有 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.access0(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.access0(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.access0(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 控制台上 Android 的 Google 地图 API v2 已启用 - 我正在通过 Gradle 使用 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

我通过使用 'elephant.tuskapp' 包名称而不是 'free.elephant.tuskapp'

获得了我的 API

这是我的 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:2.3.2@aar') {
            transitive = true;
        }
    }

我是不是错过了什么?或者它真的与我的口味有关吗?如果是味道造成的麻烦,我该如何处理呢?我为我的所有风格生成了新的 api 键,但我不明白我应该如何在清单文件中使它工作并使其看起来优雅。

根据您的 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!"));

    }
}

由于我的应用有多种风格,我收到了一个错误,提示我的 api-keys 没有被验证。解决此问题的方法是确保将项目的所有包添加到 Google Developer Console 中。

SHA1;程序包名称

然后按回车键

SHA1;包名 2(风味)

在我的例子中是:

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