尝试在谷歌地图V2 Android应用程序中获取空数组的长度

问题描述 投票:0回答:3

我目前正在使用谷歌地图API开发一个Android应用程序,有时我会因为没有明显的原因而发生奇怪的崩溃(在我看来)。这是崩溃日志:

12-02 16:38:57.071  20796-21137/com.appsolute.ParkYoo E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 4623
    Process: com.appsolute.ParkYoo, PID: 20796
    java.lang.NullPointerException: Attempt to get length of null array
            at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:399)
            at java.nio.ByteBufferAsShortBuffer.put(ByteBufferAsShortBuffer.java:159)
            at com.google.maps.api.android.lib6.gmm6.o.c.a.d.d(Unknown Source)
            at com.google.maps.api.android.lib6.gmm6.o.c.a.d.a(Unknown Source)
            at com.google.maps.api.android.lib6.gmm6.o.a.a(Unknown Source)
            at com.google.maps.api.android.lib6.gmm6.o.c.b(Unknown Source)
            at com.google.maps.api.android.lib6.gmm6.o.c.a(Unknown Source)
            at com.google.maps.api.android.lib6.gmm6.o.l.a(Unknown Source)
            at com.google.maps.api.android.lib6.gmm6.o.l.b(Unknown Source)
            at com.google.maps.api.android.lib6.gmm6.o.cw.k(Unknown Source)
            at com.google.maps.api.android.lib6.gmm6.o.cw.run(Unknown Source)

如您所见,崩溃发生在 google api 中,但代码已被混淆,因此除了前 2 行之外,我没有更多相关信息:

final void put(short[] src, int srcOffset, int shortCount) {
    checkIsAccessible();
    int byteCount = checkPutBounds(SizeOf.SHORT, src.length, srcOffset, shortCount); // here is the error
    this.block.pokeShortArray(offset + position, src, srcOffset, shortCount, order.needsSwap);
    position += byteCount;
  }

@Override
    public ShortBuffer put(short[] src, int srcOffset, int shortCount) {
        byteBuffer.limit(limit * SizeOf.SHORT);
        byteBuffer.position(position * SizeOf.SHORT);
        if (byteBuffer instanceof DirectByteBuffer) {
            ((DirectByteBuffer) byteBuffer).put(src, srcOffset, shortCount);
        } else {
            ((ByteArrayBuffer) byteBuffer).put(src, srcOffset, shortCount);
        }
        this.position += shortCount;
        return this;
    }

有人遇到过这个错误吗?我究竟做错了什么 ?如果有人对这个问题有见解,我很乐意讨论。

谢谢!

android google-maps
3个回答
17
投票

您可能正在运行多个地图片段。请参阅我关于当前困扰 Google 地图库的致命错误的文章,涉及多个地图片段 - 以及我如何找到解决方法。

https://medium.com/aphex-cx/the-google-maps-api-is-broken-on-android-5-heres-a-workaround-for-multiple-map-fragments-6a95655c92fd

Google 目前正在处理此案,并将优先考虑在下一个版本的 Google Play 服务中!


2
投票

https://developers.google.com/android/guides/google-services-plugin

更新了 build.gradle 中的 com.google.gms:google-services 版本(android 级别)

就我而言,是 com.google.gms:谷歌服务:4.3.14

实施了https://github.com/flutter/flutter/issues/105965#issuecomment-1224473127

的解决方法

这似乎对我有用。


0
投票

如果它发生在与谷歌地图相关的 flutter build 中

  1. flutter 3.2或以下版本
  2. https://github.com/flutter/flutter/issues/105965#issuecomment-1224473127使用此代码块并运行应用程序
  3. 检查您是否收到“使用了最新版本的渲染器”日志

注意:在运行应用程序之前删除项目中的构建文件夹

如果您想要示例代码如何检查

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class AltScreen extends StatelessWidget {
  const AltScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Alt screen'),
      ),
      body: Center(
        child: ElevatedButton(
          child: const Text('Push map'),
          onPressed: () => Navigator.of(context, rootNavigator: true).push(
            MaterialPageRoute(
              builder: (ctx) => Scaffold(
                appBar: AppBar(
                  actions: [
                    IconButton(
                      onPressed: Navigator.of(ctx, rootNavigator: true).pop,
                      icon: const Icon(Icons.close),
                    ),
                  ],
                ),
                body: const GoogleMap(
                  initialCameraPosition: CameraPosition(
                    target: LatLng(41.9, 12.5),
                    zoom: 17,
                  ),
                  compassEnabled: false,
                  myLocationButtonEnabled: false,
                  myLocationEnabled: false,
                  scrollGesturesEnabled: true,
                  zoomGesturesEnabled: true,
                  rotateGesturesEnabled: false,
                  zoomControlsEnabled: false,
                  mapToolbarEnabled: false,
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.