【问题标题】:Google Maps is showing a blank map谷歌地图显示空白地图
【发布时间】:2018-10-17 06:38:54
【问题描述】:

我目前遇到了这个问题:谷歌地图似乎根本没有加载。请看下图:

这真的让我发疯了。我已经做了以下事情:

  1. 将我的包名 + SHA1(调试密钥库)+ SHA1(发布密钥库)添加到 Google 开发者控制台。
  2. Android 版地图 SDK 已启用。 API 密钥具有 Android 应用限制
  3. 从 Firebase 控制台向我的应用添加了 google-services.json
  4. 添加了必要的权限:
  5. 在清单文件中添加了 API 密钥 - 来自 Google 开发者控制台
  6. 为 gms 版本添加了元数据

这是我的片段的代码:

import android.content.Context;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.ErrorDialogFragment;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends Fragment implements OnMapReadyCallback {

    private MapFragment mapFragment;
    protected boolean readyToGo() {
        GoogleApiAvailability checker=
                GoogleApiAvailability.getInstance();

        int status=checker.isGooglePlayServicesAvailable(getActivity());

        if (status == ConnectionResult.SUCCESS) {
            if (getVersionFromPackageManager(getActivity())>=2) {
                return(true);
            }
            else {
                Toast.makeText(getActivity(), "no maps", Toast.LENGTH_LONG).show();

            }
        }
        else if (checker.isUserResolvableError(status)) {

        }
        else {
            Toast.makeText(getActivity(),"no maps", Toast.LENGTH_LONG).show();

        }

        return(false);
    }
    private static int getVersionFromPackageManager(Context context) {
        PackageManager packageManager=context.getPackageManager();
        FeatureInfo[] featureInfos=
                packageManager.getSystemAvailableFeatures();
        if (featureInfos != null && featureInfos.length > 0) {
            for (FeatureInfo featureInfo : featureInfos) {
                // Null feature name means this feature is the open
                // gl es version feature.
                if (featureInfo.name == null) {
                    if (featureInfo.reqGlEsVersion != FeatureInfo.GL_ES_VERSION_UNDEFINED) {
                        return getMajorVersion(featureInfo.reqGlEsVersion);
                    }
                    else {
                        return 1; // Lack of property means OpenGL ES
                        // version 1
                    }
                }
            }
        }
        return 1;
    }
    private static int getMajorVersion(int glEsVersion) {
        return((glEsVersion & 0xffff0000) >> 16);
    }
    public static MapsActivity newInstance() {
        MapsActivity fragment = new MapsActivity();
        return fragment;
    }

    public MapsActivity() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        readyToGo();

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_maps, null, false);

        SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        return view;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng augsburg = new LatLng(48.348527, 10.915952);

        if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        googleMap.setMyLocationEnabled(true);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(augsburg, 13));

        googleMap.addMarker(new MarkerOptions()
                .title("Augsburg Zoo")
                .snippet("Der coolste Zoo der Welt")
                .position(augsburg));
    }
}

这是我的布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/constraintLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <TextView
        android:id="@+id/textView15"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Coming soon!"
        android:textColor="@color/colorPrimary"
        android:textSize="30sp"
        android:visibility="invisible" />
</RelativeLayout>

谁能告诉我我还缺少什么?

LOGCAT:

10-17 15:33:25.917 1637-1648/system_process I/ActivityManager: Killing 2335:com.google.android.apps.maps/u0a39 (adj 15): empty #17
10-17 15:33:43.441 3591-3591/com.apptechgateway.AppTech I/DynamiteModule: Considering local module com.google.android.gms.maps_dynamite:0 and remote module com.google.android.gms.maps_dynamite:220
    Selected remote version of com.google.android.gms.maps_dynamite, version >= 220
10-17 15:33:43.464 3800-3800/? E/dex2oat: Failed to create oat file: /data/dalvik-cache/x86_64/data@data@com.google.android.gms@app_chimera@m@00000006@MapsDynamite.apk@classes.dex: Permission denied
10-17 15:33:43.465 3591-3591/com.apptechgateway.AppTech W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg  --debuggable --instruction-set=x86_64 --instruction-set-features=smp,ssse3,sse4.1,sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86_64 --instruction-set-features=default --dex-file=/data/data/com.google.android.gms/app_chimera/m/00000006/MapsDynamite.apk --oat-file=/data/dalvik-cache/x86_64/data@data@com.google.android.gms@app_chimera@m@00000006@MapsDynamite.apk@classes.dex) because non-0 exit status
10-17 15:33:43.514 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services client version: 12451000
10-17 15:33:43.517 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services package version: 12874027
10-17 15:33:56.802 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services package version: 12874027

请注意,当我对其他地图项目使用相同的 API_KEY 时,它可以正常工作。地图似乎没有显示在我的应用程序上,但正在处理其他项目。

这些是我的依赖:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0-rc02'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:support-v4:28.0.0'

    implementation 'com.google.android.gms:play-services-maps:15.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.mikhaellopez:circularimageview:3.2.0'
    implementation 'gr.pantrif:easy-android-splash-screen:0.0.1'
    implementation 'com.github.GrenderG:Toasty:1.3.0'
    implementation 'com.github.adrielcafe:AndroidAudioRecorder:0.3.0'
    implementation 'com.google.firebase:firebase-core:16.0.1'
    implementation 'com.crashlytics.sdk.android:crashlytics:2.9.5'
    implementation 'com.android.volley:volley:1.1.0'
    compile 'com.github.ybq:Android-SpinKit:1.1.0'
    implementation 'com.google.firebase:firebase-database:16.0.1'
    compile 'com.android.support:cardview-v7:28.0.0'
    compile 'com.github.bumptech.glide:glide:3.6.0'
    compile 'com.github.clans:fab:1.6.4'
    compile 'com.github.blikoon:QRCodeScanner:0.1.2'
    compile 'com.github.droidbyme:DroidDialog:c6decc7167'
    implementation 'com.android.support:multidex:1.0.3'
    compile project(':library')

}
apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'

这是我AndroidManifest.xml的内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.sample.x">

    <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.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />




    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="MY_API_KEY" />

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.com.vansuita.pickimage.provider"
            android:exported="false"
            android:grantUriPermissions="true"
            tools:replace="android:authorities">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/picker_provider_paths"
                tools:replace="android:resource" />
        </provider>

        <activity
            android:name=".SplashscreenActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MapsMarkerActivity"
            android:label="MAPS" />
        <activity
            android:name=".MapsActivity2"
            android:label="@string/title_activity_maps2"></activity>
    </application>

</manifest>

【问题讨论】:

  • 你的 logcat 说什么?
  • 在显示地图活动时提供 logcat
  • Show tour logcat 应该有异常。
  • 我已经添加了 logcat @FaizMir
  • 您是否尝试过更新设备的播放服务版本?

标签: android google-maps android-maps


【解决方案1】:

我昨天在公司设计客户时遇到了这个问题。与我身后的客户一起解决问题是两天的疯狂。我所做的是:

  1. 从 Google Dashboard API 中删除当前密钥(API 密钥)。 从 Google 仪表板 API 中删除 firebase 网络密钥。创建一个 新的 Android 密钥 API,注册 SHA-1 和包名称。和 添加项目android studio;

  2. 在 FIrebase 项目中删除 SHA-1 代码以再次添加。下载 google-services.json,并添加到项目中;

  3. 在发布模式下生成应用,在商店发布,然后下载 在某些设备上,应用程序运行时应正常显示地图;

  4. 如果不是,它会在 LogCat 中显示错误,说你必须 注册以下 SHA-1 密钥:XXXXXXXXXXXXXXXXXX 和包 名称:com.your.packagename;

  5. 只需在 Google API 中注册此密钥,它就可以在少数情况下使用 秒,甚至无需更新商店中的应用程序。

注意:另外,考虑升级 Google 地图和 Google 服务的依赖项。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我假设这可能是由于 SHA 1 指纹不匹配。仔细检查您是否使用相同的密钥库来获取 SHA1。

    或者让我们检查您的 API 密钥是否有效。为此添加以下 MAP_API 作为您的密钥

    AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY
    

    直接将密钥添加到清单

    <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY" />
    

    在您的 AndroidManifest.xml 中添加以下权限(可选/非必需)

     <permission
        android:name="your_pakage_name.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />
    

    构建您的 apk。并进行测试。

    如果地图正在显示,那么我们可以修复您的 API 密钥是问题所在。

    否则

    可能是由于子片段管理器,所以在视图寻呼机中初始化您的片段,如下所示。然后测试一下

     <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="yourpackage.MapsActivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" />
    

    【讨论】:

      【解决方案3】:

      这些方法你试过了吗?

      启用多索引:

      https://stackoverflow.com/a/42827484/9169701

      https://developer.android.com/studio/build/multidex

      注意:如果您的项目配置为使用 minSdkVersion 20 或更低版本的 multidex,并且您部署到运行 Android 4.4(API 级别 20)或更低版本的目标设备,Android Studio 会禁用 Instant Run。 p>

      禁用即时运行:

      https://stackoverflow.com/a/46999705/9169701

      【讨论】:

        【解决方案4】:

        尝试在您的 onMapReady 方法中添加这段代码

        MapsInitializer.initialize(Objects.requireNonNull(getContext()));
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        googleMap.setMyLocationEnabled(true);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(augsburg, 13));
        googleMap.addMarker(new MarkerOptions()
                    .title("Augsburg Zoo")
                    .snippet("Der coolste Zoo der Welt")
                    .position(augsburg));
        

        【讨论】:

          【解决方案5】:

          解决方案:

           I had the same problem in my App so you can try this open your Android studio and
           make sure you are login with the same user id of what you had created 
           `console.developer` account and after that you should do 
          
          
          
           SupportMapFragment mapFragment;
           GoogleMap mMap;
           Marker marker;
           LatLng origin = new LatLng(30.5595, 22.9375);
           LatLng dest = new LatLng(30.5595, 22.9375);
          
            @Override
          public void onMapReady(GoogleMap googleMap) {
              mMap = googleMap;
              googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
              googleMap.addMarker(new MarkerOptions()
                      .position(origin)
                      .title("title")
                      .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
          
              googleMap.addMarker(new MarkerOptions()
                      .position(dest));
          
              googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(origin, 15));
          }
          

          【讨论】:

            【解决方案6】:

            当您在片段中使用地图时,请更改您的代码,如下所示:-

              // Obtain the SupportMapFragment and get notified when the map is ready to be used.
                SupportMapFragment mMapFragment = SupportMapFragment.newInstance();
            
                FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
                transaction.add(R.id.mapContainer, mMapFragment).commit();
                mMapFragment.getMapAsync(this);
            

            将布局中的 fragment 标签更改为 FrameLayout,如下所示:-

            <?xml version="1.0" encoding="utf-8"?>
            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/constraintLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            
                <FrameLayout 
                  android:id="@+id/mapContainer"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                />
            
            
                .....
            </RelativeLayout>
            

            升级你的地图sdk:-

            implementation 'com.google.android.gms:play-services-maps:16.0.0'
            

            【讨论】:

              【解决方案7】:

              有几点需要注意。

              1. 检查运行时权限 (details) - 您的 logcat 显示其中一行权限被拒绝
              2. 尝试在 alfa 或 beta 测试通道中将应用上传到 playstore(以防止在应用通过所有测试之前访问目标用户。) - 除非您的应用已注册,否则某些 API 将无法工作。
              3. 如果问题仍然存在,请尝试在 firebase 中删除并重新注册您的应用。

              4. 另外,请注意,谷歌地图 API 不再像以前一样免费提供。您需要订阅。关注此link 了解更多信息。 希望这会有所帮助。

              【讨论】:

                【解决方案8】:

                我遇到了这个问题。就我而言,我更改了 API 密钥,一切都开始正常工作。检查 logcat 是否存在问题。如果是同样的问题,那就换个密钥,它应该可以工作。

                【讨论】:

                  【解决方案9】:

                  我做了一个简单的修复,现在 Google 地图可以正常运行: 设置-应用-地图-点击右上角3个点-卸载所有更新。 它会给你一个警告,地图将被重置为出厂设置。忽略它,然后按确定。重启手机。

                  【讨论】:

                    【解决方案10】:

                    这是因为您可能更改了系统。因此,使用您当前的系统 sha1 密钥进行更新并生成新的 API。它会起作用的。

                    【讨论】:

                    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center