gpt4 book ai didi

Android Jetpack 撰写 : Using google map got crash on map create

转载 作者:行者123 更新时间:2023-12-04 13:54:34 30 4
gpt4 key购买 nike

我试图在 google compose 示例项目调用 的帮助下实现 google map起重机 在这里:
https://github.com/android/compose-samples/tree/main/Crane
我使用相同的实现并使用 MapViewUtils 为 map 实现 lifeCycler 并防止重新编写内容等等......我将所有 android map key 和权限都放在 list 上,
但是我的代码在 map 开始时崩溃:
这是我想显示 map 的一点:

@Composable
fun MapScreen(latitude: String, longitude: String) {
// The MapView lifecycle is handled by this composable. As the MapView also needs to be updated
// with input from Compose UI, those updates are encapsulated into the MapViewContainer
// composable. In this way, when an update to the MapView happens, this composable won't
// recompose and the MapView won't need to be recreated.
val mapView = rememberMapViewWithLifecycle()
MapViewContainer(mapView, latitude, longitude)
}

@Composable
private fun MapViewContainer(
map: MapView,
latitude: String,
longitude: String
) {
// var zoom by savedInstanceState { InitialZoom }

AndroidView({ map }) { mapView ->
// Reading zoom so that AndroidView recomposes when it changes. The getMapAsync lambda
mapView.getMapAsync {
val position = LatLng(latitude.toDouble(), longitude.toDouble())
it.addMarker(
MarkerOptions().position(position)
)
it.moveCamera(CameraUpdateFactory.newLatLng(position))
}
}
}
这是在 Util 类中:
@Composable
fun rememberMapViewWithLifecycle(): MapView {
val context = ContextAmbient.current
val mapView = remember {
MapView(context).apply {
id = R.id.map
}
}

// Makes MapView follow the lifecycle of this composable
val lifecycleObserver = rememberMapLifecycleObserver(mapView)
val lifecycle = LifecycleOwnerAmbient.current.lifecycle
onCommit(lifecycle) {
lifecycle.addObserver(lifecycleObserver)
onDispose {
lifecycle.removeObserver(lifecycleObserver)
}
}

return mapView
}

@Composable
private fun rememberMapLifecycleObserver(mapView: MapView): LifecycleEventObserver =
remember(mapView) {
LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_CREATE -> mapView.onCreate(Bundle()) //Crashes here
Lifecycle.Event.ON_START -> mapView.onStart()
Lifecycle.Event.ON_RESUME -> mapView.onResume()
Lifecycle.Event.ON_PAUSE -> mapView.onPause()
Lifecycle.Event.ON_STOP -> mapView.onStop()
Lifecycle.Event.ON_DESTROY -> mapView.onDestroy()
else -> throw IllegalStateException()
}
}
}
我遇到了这个崩溃:
2020-11-05 12:16:09.282 2665-3383/com.google.android.gms.persistent E/ModuleIdSetter: exception when setting module id
java.lang.IllegalStateException: Unable to get current module info in ModuleManager created with non-module Context
at com.google.android.chimera.config.ModuleManager.getCurrentModule(:com.google.android.gms@202414022@20.24.14 (040700-319035315):2)
at aewd.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):4)
at aewg.b(:com.google.android.gms@202414022@20.24.14 (040700-319035315):9)
at aeso.a(Unknown Source:0)
at rpm.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):0)
at rlv.c(:com.google.android.gms@202414022@20.24.14 (040700-319035315):1)
at rlt.b(:com.google.android.gms@202414022@20.24.14 (040700-319035315):1)
at rok.b(:com.google.android.gms@202414022@20.24.14 (040700-319035315):6)
at rok.c(:com.google.android.gms@202414022@20.24.14 (040700-319035315):6)
at rok.b(:com.google.android.gms@202414022@20.24.14 (040700-319035315):10)
at rok.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):17)
at rok.g(:com.google.android.gms@202414022@20.24.14 (040700-319035315):3)
at sdr.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):2)
at scr.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):10)
at sci.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):0)
at scl.handleMessage(:com.google.android.gms@202414022@20.24.14 (040700-319035315):28)
at android.os.Handler.dispatchMessage(Handler.java:107)
at aekz.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):2)
at aekz.dispatchMessage(:com.google.android.gms@202414022@20.24.14 (040700-319035315):14)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:67)

最佳答案

您需要获得访问用户位置的权限,并在显示 map 之前确保您拥有该位置。您可以将变量与 LiveData 一起使用和 ViewModel在授予权限时更新,这是示例的一部分:

class MainViewModel : ViewModel() {
private val _permissionGranted = MutableLiveData(false)
val permissionGranted = _permissionGranted

fun onPermissionGranted() = _permissionGranted.postValue(true)

// ...
}
class MainActivity : AppCompatActivity() {
private val mainViewModel by viewModels<MainViewModel>

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val permissionGranted = mainViewModel.permissionGranted.observeAsState()
if (permissionGranted) {
// logic to show your map
} else {
// logic to ask for permission
}
}
}

override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
// check if it's your request
mainViewModel.onPremissionGranted()
}

// ...
}
您可以在此处获得有关请求权限的更多信息: https://developer.android.com/training/permissions/requesting

关于Android Jetpack 撰写 : Using google map got crash on map create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64690821/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com