我目前正在使用谷歌地图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;
}
有人遇到过这个错误吗?我究竟做错了什么 ?如果有人对这个问题有见解,我很乐意讨论。
谢谢!
您可能正在运行多个地图片段。请参阅我关于当前困扰 Google 地图库的致命错误的文章,涉及多个地图片段 - 以及我如何找到解决方法。
Google 目前正在处理此案,并将优先考虑在下一个版本的 Google Play 服务中!
从 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
的解决方法这似乎对我有用。
如果它发生在与谷歌地图相关的 flutter build 中
注意:在运行应用程序之前删除项目中的构建文件夹
如果您想要示例代码如何检查
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,
),
),
),
),
),
),
);
}
}