Google 地图在特定位置和缩放级别 15 时崩溃

Google Map crash at specific location and zoom level 15

Google 在 Android 8(API 级别 26)的特定位置(35.670、139.760),地图在缩放级别 15 时崩溃。

其他缩放级别(例如:1、2、10 或 14 等)不会崩溃

崩溃时,Logcat输出为:

E/AndroidRuntime: FATAL EXCEPTION: GLThread 279
              Process: test.map, PID: 5690
              java.lang.WhosebugError: stack size 1038KB
                  at java.util.Collections$UnmodifiableList.<init>(Collections.java:1344)
                  at java.util.Collections$UnmodifiableRandomAccessList.<init>(Collections.java:1437)
                  at java.util.Collections.unmodifiableList(Collections.java:1330)
                  at com.google.maps.api.android.lib6.common.g.<init>(:com.google.android.gms.DynamiteModulesB@11951470:9)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.b(:com.google.android.gms.DynamiteModulesB@11951470:142)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.c(:com.google.android.gms.DynamiteModulesB@11951470:144)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.e(:com.google.android.gms.DynamiteModulesB@11951470:286)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.d(:com.google.android.gms.DynamiteModulesB@11951470:182)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.a(:com.google.android.gms.DynamiteModulesB@11951470:180)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.a(:com.google.android.gms.DynamiteModulesB@11951470:82)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.a(:com.google.android.gms.DynamiteModulesB@11951470:70)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.c(:com.google.android.gms.DynamiteModulesB@11951470:147)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.e(:com.google.android.gms.DynamiteModulesB@11951470:286)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.d(:com.google.android.gms.DynamiteModulesB@11951470:182)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.a(:com.google.android.gms.DynamiteModulesB@11951470:180)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.a(:com.google.android.gms.DynamiteModulesB@11951470:82)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.a(:com.google.android.gms.DynamiteModulesB@11951470:70)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.c(:com.google.android.gms.DynamiteModulesB@11951470:147)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.e(:com.google.android.gms.DynamiteModulesB@11951470:286)
                  at com.google.maps.api.android.lib6.gmm6.indoor.o.d(:com.google.android.gms.DynamiteModulesB@11951470:182)

......

在 Nexus5X Android 8 模拟器 运行 中很容易重现下面的代码

package test.map;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.LinearLayout;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;

public class MainActivity extends AppCompatActivity {

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

        //
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);

        setContentView(ll);

        //    
        MapView mapView = new MapView(this);
        mapView.onCreate(null);
        mapView.onResume();
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(final GoogleMap googleMap) {
                final LatLng latLng = new LatLng(35.670, 139.760);
                final CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, 15.0f);
                googleMap.moveCamera(update);
            }
        });

        ll.addView(mapView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
    }
}

这是 Google Maps SDK 中的一个长期存在的错误,请参阅 https://issuetracker.google.com/issues/35829548

您可以通过禁用室内地图来解决此问题:

@Override public void onMapReady(GoogleMap googleMap) {
    googleMap.setIndoorEnabled(false);
}

问题也是

的重复问题