Crash when opening the map
Environment details
- maps compose version 5.0.3
- Jetpack compose version 1.6.7
- Material3 version 1.2.1
Code example
GoogleMap(
modifier = Modifier.fillMaxSize()
) {
MapEffect(key1 = clusterItems) { map ->
}
}
)
Stack trace
android.net.ConnectivityManager$TooManyRequestsException
at android.net.ConnectivityManager.convertServiceException(ConnectivityManager.java:4165)
at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4357)
at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4364)
at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4746)
at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4716)
at m.fef.c(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:41)
at m.fef.<init>(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:140)
at com.google.maps.api.android.lib6.impl.ib.<init>(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:7)
at com.google.android.gms.maps.internal.CreatorImpl.d(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:1151)
at com.google.android.gms.maps.internal.CreatorImpl.logInitialization(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:60)
at com.google.android.gms.maps.internal.i.bq(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:73)
at m.bcw.onTransact(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:21)
at android.os.Binder.transact(Binder.java:1183)
at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@18.2.0:2)
at com.google.android.gms.maps.internal.zze.zzl(com.google.android.gms:play-services-maps@@18.2.0:4)
at com.google.android.gms.maps.MapsInitializer.initialize(com.google.android.gms:play-services-maps@@18.2.0:12)
at com.google.android.gms.maps.MapsInitializer.initialize(com.google.android.gms:play-services-maps@@18.2.0:1)
at com.google.android.gms.maps.zzai.zzb(com.google.android.gms:play-services-maps@@18.2.0:2)
at com.google.android.gms.maps.zzai.createDelegate(com.google.android.gms:play-services-maps@@18.2.0:1)
at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaf(com.google.android.gms:play-services-base@@18.3.0:6)
at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreate(com.google.android.gms:play-services-base@@18.3.0:1)
at com.google.android.gms.maps.MapView.onCreate(com.google.android.gms:play-services-maps@@18.2.0:4)
at com.google.maps.android.compose.GoogleMapKt.lifecycleObserver$lambda$12(GoogleMap.kt:209)
at com.google.maps.android.compose.GoogleMapKt.$r8$lambda$OyhSHZmxT3lf78-uP6q1KJOt96o(Unknown Source:0)
at com.google.maps.android.compose.GoogleMapKt$$ExternalSyntheticLambda0.onStateChanged(Unknown Source:4)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:322)
at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.kt:199)
at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:184)
at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:180)
at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:83)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1295)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984)
at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005)
at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1099)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:3599)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:3599)
at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:633)
Thanks!
Hi @JeevanRupacha ,
The error strack trace does not seem to be related to the code snippet. Are you doing something else besides trying to cluster, like executing a network call?
@kikoso I am doing clustering based on already fetched data. I mean even I didn't do any clustering and just run the only above code I got crash. By the way this crash happens when I try to open google map quickly after app launch and if I wait minute or more and execute then works very fine.
Just This code:
GoogleMap(){{}
I have the same issue with maps compose 6.1.1, compose 1.6.10, kotlin 2.0.0. App just hangs for a second and then crashes with the same stacktrace
private val StaticMapUi = MapUiSettings(
zoomControlsEnabled = false,
zoomGesturesEnabled = false,
compassEnabled = false,
indoorLevelPickerEnabled = false,
mapToolbarEnabled = false,
myLocationButtonEnabled = false,
rotationGesturesEnabled = false,
scrollGesturesEnabled = false,
scrollGesturesEnabledDuringRotateOrZoom = false,
tiltGesturesEnabled = false
)
...
@Composable
fun Test() {
Column {
....
val markerPosition = LatLng(20.0, 20.0)
val cameraPositionState = rememberCameraPositionState {
position = CameraPosition.fromLatLngZoom(markerPosition, MapZoom)
}
GoogleMap(
cameraPositionState = cameraPositionState,
modifier = Modifier.Companion
.fillMaxWidth()
.height(RestaurantMapHeight)
.clip(MaterialTheme.shapes.large),
uiSettings = StaticMapUi,
) {
Marker(
state = MarkerState(position = markerPosition),
)
}
....
}
}
same here.
We experience the same issue:
https://byairapp-sl.sentry.io/share/issue/7a338366b2a24cc5b451e9bb5e5260d1/
upd: Our issue was not related to google maps itself. We use coil for loading images. For each image we have a custom image loader (for a puprose). And it happened that way, each image loader request inits network observer by default. 100+ images initiate the same amount of network observers whech leads to the crash when user opens google map (which registers own network observer).
I have the same problem.
If you do not open the map for more than 15 minutes after running the app, the above conflict will occur.
There are currently two collisions: m.fdy.c and m.feb.c.
Below is my stack.
- m.fdy.c
- Fatal Exception: android.net.ConnectivityManager$TooManyRequestsException: at android.net.ConnectivityManager.convertServiceException(ConnectivityManager.java:4236) at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4437) at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4444) at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4826) at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4796) at m.fdy.c(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:29) at com.google.maps.api.android.lib6.impl.q.b(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:29) at com.google.maps.api.android.lib6.impl.co.aZ(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:3) at com.google.maps.api.android.lib6.impl.co.D(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:32) at com.google.maps.api.android.lib6.impl.ek.k(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:11) at com.google.android.gms.maps.internal.r.dispatchTransaction(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:14) at m.bco.onTransact(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:13) at android.os.Binder.transact(Binder.java:1190) at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@19.0.0:2) at com.google.android.gms.maps.internal.zzl.onStart(com.google.android.gms:play-services-maps@@19.0.0:2) at com.google.android.gms.maps.zzah.onStart(com.google.android.gms:play-services-maps@@19.0.0:1) at com.google.android.gms.dynamic.zaf.zab(com.google.android.gms:play-services-base@@18.4.0:1) at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaf(com.google.android.gms:play-services-base@@18.4.0:1) at com.google.android.gms.dynamic.DeferredLifecycleHelper.onStart(com.google.android.gms:play-services-base@@18.4.0:1) at com.google.android.gms.maps.MapView.onStart(com.google.android.gms:play-services-maps@@19.0.0:1) at com.google.maps.android.compose.GoogleMapKt.lifecycleObserver$lambda$12(GoogleMap.kt:214) at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:314) at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.kt:192) at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:185) at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:181) at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:83) at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1295) at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984) at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:639) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551) at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41) at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109) at androidx.compose.ui.platform.AndroidUiDispatcher.access$setScheduledFrameDispatch$p(AndroidUiDispatcher.android.kt) at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt) at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1666) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1677) at android.view.Choreographer.doCallbacks(Choreographer.java:1190) at android.view.Choreographer.doFrame(Choreographer.java:1056) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1647) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:222) at android.os.Looper.loop(Looper.java:314) at android.app.ActivityThread.main(ActivityThread.java:8602) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:565) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
- m.feb.c
- Fatal Exception: android.net.ConnectivityManager$TooManyRequestsException: at android.net.ConnectivityManager.convertServiceException(ConnectivityManager.java:4236) at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4437) at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4444) at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4826) at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4796) at m.feb.c(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:29) at m.feb.
(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:140) at com.google.maps.api.android.lib6.impl.hw. (:com.google.android.gms.policy_maps_core_dynamite@[email protected]:6) at com.google.android.gms.maps.internal.CreatorImpl.b(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:1142) at com.google.android.gms.maps.internal.CreatorImpl.logInitialization(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:16) at com.google.android.gms.maps.internal.i.dispatchTransaction(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:73) at m.bdb.onTransact(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:13) at android.os.Binder.transact(Binder.java:1067) at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@19.0.0:2) at com.google.android.gms.maps.internal.zze.zzl(com.google.android.gms:play-services-maps@@19.0.0:4) at com.google.android.gms.maps.MapsInitializer.initialize(com.google.android.gms:play-services-maps@@19.0.0:12) at com.google.android.gms.maps.MapsInitializer.initialize(com.google.android.gms:play-services-maps@@19.0.0:1) at com.google.android.gms.maps.zzai.zzb(com.google.android.gms:play-services-maps@@19.0.0:2) at com.google.android.gms.maps.zzai.createDelegate(com.google.android.gms:play-services-maps@@19.0.0:1) at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaf(com.google.android.gms:play-services-base@@18.4.0:6) at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreate(com.google.android.gms:play-services-base@@18.4.0:1) at com.google.android.gms.maps.MapView.onCreate(com.google.android.gms:play-services-maps@@19.0.0:4) at com.google.maps.android.compose.GoogleMapKt.lifecycleObserver$lambda$12(GoogleMap.kt:210) at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:314) at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.kt:192) at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:185) at com.google.maps.android.compose.GoogleMapKt$MapLifecycle$1.invoke(GoogleMap.kt:181) at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:83) at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1295) at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984) at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:639) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551) at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41) at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109) at androidx.compose.ui.platform.AndroidUiDispatcher.access$setScheduledFrameDispatch$p(AndroidUiDispatcher.android.kt) at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt) at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1127) at android.view.Choreographer.doCallbacks(Choreographer.java:918) at android.view.Choreographer.doFrame(Choreographer.java:824) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1112) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:241) at android.os.Looper.loop(Looper.java:342) at android.app.ActivityThread.main(ActivityThread.java:8131) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:583) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
We have been running into this issue for some months now, and all optimizations to avoid memory leaks have not helped. Here is the crash log
` Fatal Exception: android.net.ConnectivityManager$TooManyRequestsException:
at android.net.ConnectivityManager.convertServiceException(ConnectivityManager.java:4447)
at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4723)
at android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4846)
at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:5228)
at android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:5198)
at m.fdi.c(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:29)
at com.google.maps.api.android.lib6.impl.m.b(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:29)
at com.google.maps.api.android.lib6.impl.cg.ba(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:3)
at com.google.maps.api.android.lib6.impl.cg.E(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:32)
at com.google.maps.api.android.lib6.impl.eo.l(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:11)
at com.google.android.gms.maps.internal.r.bt(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:14)
at m.axe.onTransact(:com.google.android.gms.policy_maps_core_dynamite@[email protected]:21)
at android.os.Binder.transact(Binder.java:1192)
at com.google.android.gms.internal.maps.zza.zzc(com.google.android.gms:play-services-maps@@19.0.0:2)
at com.google.android.gms.maps.internal.zzl.onStart(com.google.android.gms:play-services-maps@@19.0.0:2)
at com.google.android.gms.maps.zzah.onStart(com.google.android.gms:play-services-maps@@19.0.0:1)
at com.google.android.gms.dynamic.zaf.zab(com.google.android.gms:play-services-base@@18.4.0:1)
at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaf(com.google.android.gms:play-services-base@@18.4.0:1)
at com.google.android.gms.dynamic.DeferredLifecycleHelper.onStart(com.google.android.gms:play-services-base@@18.4.0:1)
at com.google.android.gms.maps.MapView.onStart(com.google.android.gms:play-services-maps@@19.0.0:1)
at com.premise.android.design.designsystem.compose.MapLifecycleEventObserver.invokeEvent(GoogleMapComposable.kt:181)
at com.premise.android.design.designsystem.compose.MapLifecycleEventObserver.moveUp(GoogleMapComposable.kt:172)
at com.premise.android.design.designsystem.compose.MapLifecycleEventObserver.moveToLifecycleState(GoogleMapComposable.kt:154)
at com.premise.android.design.designsystem.compose.MapLifecycleEventObserver.onStateChanged(GoogleMapComposable.kt:131)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.jvm.kt:320)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.jvm.kt:257)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.jvm.kt:293)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.jvm.kt:142)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.jvm.kt:124)
at androidx.fragment.app.FragmentViewLifecycleOwner.handleLifecycleEvent(FragmentViewLifecycleOwner.java:100)
at androidx.fragment.app.Fragment.performStart(Fragment.java:3199)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:648)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:304)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1675)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3259)
at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:3184)
at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:274)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:358)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
at com.premise.android.base.PremiseActivity.onStart(PremiseActivity.kt:152)
at com.premise.android.base.PremiseAuthenticatedActivity.onStart(PremiseAuthenticatedActivity.kt:151)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1582)
at android.app.Activity.performStart(Activity.java:8767)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3922)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:225)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:205)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:187)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2547)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loopOnce(Looper.java:242)
at android.os.Looper.loop(Looper.java:362)
at android.app.ActivityThread.main(ActivityThread.java:8393)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:992)
```
I have the same issue. Anyone managed to get it right?
I have the same issue. Anyone managed to get it right?
@christiankipala our issue was the same with @maximality's -> "each image loader request inits network observer by default"
Hi @panosx2-dsq thanks for the response, so your issue was not related to GoogleMap?
Hi @panosx2-dsq thanks for the response, not sure if you described the fix but could you please elaborate
Hi @christiankipala
In our case, the problem was related to Coil's ImageLoader. By default, every time you create an ImageLoader, it initializes a network observer automatically. However, Google Maps also sets up its own network observer. This results in too many network observers, which causes a ConnectivityManager$TooManyRequestsException.
We resolved this issue by disabling the network observer in Coil's ImageLoader:
coil.ImageLoader.Builder(context)
// other configurations
.networkObserverEnabled(false) // <--
.build()
I hope this helps!
Thank you @panosx2-dsq , makes sense plus I do use coil's ImageLoader in my project. Just tell me, was the issue occurring randomly or consistently? In my project, it's quite random. I will disable the observer, monitor it, and give an update. Thanks again
In my case depends on the amount of image loaded before open the map, so in order to simulate properly I create a test page that load about 100 images in a list and at the end I added the map view, the app crashed every time. Since I needed to have a custom ImageLoader I used the LocalContext.current.imageLoader provided by the coil 2.6.0. In case you are using coil3 use the singleton feature explained on https://coil-kt.github.io/coil/image_loaders/.
Closing this issue, since it seems to be related to the parallel execution of Coil's and Maps network observers.