java.util.concurrent.ExecutionException: java.lang.SecurityE



我正在开发MVVM应用程序,在使用GoogleMap可组合的位置跟踪时,我收到了以下错误:

2022-10-02 18:43:48.734 31711-31750/com.park.reserved W/MobStoreFlagStore: Unable to update local snapshot for com.google.android.libraries.consentverifier#com.park.reserved, may result in stale flags.
java.util.concurrent.ExecutionException: java.lang.SecurityException: GoogleCertificatesRslt: not allowed: pkg=com.park.reserved, sha256=[462925ab37c5ec4ab8550323438372023f34e9897a556848dd8c35d18c4e71c6], atk=false, ver=223616044.true (go/gsrlt)
at ahn.s(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):3)
at ahn.get(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):2)
at aix.g(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):2)
at xq.d(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):1)
at xs.run(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):0)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:463)
at java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
at java.lang.Thread.run(Thread.java:1012)
Caused by: java.lang.SecurityException: GoogleCertificatesRslt: not allowed: pkg=com.park.reserved, sha256=[462925ab37c5ec4ab8550323438372023f34e9897a556848dd8c35d18c4e71c6], atk=false, ver=223616044.true (go/gsrlt)
at android.os.Parcel.createExceptionOrNull(Parcel.java:2426)
at android.os.Parcel.createException(Parcel.java:2410)
at android.os.Parcel.readException(Parcel.java:2393)
at android.os.Parcel.readException(Parcel.java:2335)
at em.c(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):2)
at rc.a(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):4)
at it.e(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):2)
at js.t(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):2)
at js.u(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):3)
at js.e(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):2)
at jw.handleMessage(:com.google.android.gms.dynamite_mapsdynamite@223616044@22.36.16 (190400-0):69)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.os.HandlerThread.run(HandlerThread.java:67)

当这种情况发生时,应用程序仍然运行,但GoogleMap compose上的位置跟踪不起作用[我可以成功地跟踪手机位置,但当我试图在GoogleMapcompose上显示位置时出现异常]

Gradle:

implementation "com.google.maps.android:maps-compose:2.7.2"
implementation "com.google.android.gms:play-services-maps:18.1.0"

我看了下面类似的StackOverflow帖子,但我得到的错误不同:SecurityException-GoogleCertificatesRslt:不允许


我能够解决这个问题的唯一方法是在NavHost之外创建viewModel。位置跟踪以这种方式工作,但异常仍然会在Logcat中抛出

这是代码:

我有SharedLocationManager类作为位置数据源:

class SharedLocationManager constructor(
private val context: Context,
// The Fused Location Provider provides access to location APIs
private val fusedLocationClient: FusedLocationProviderClient =
LocationServices.getFusedLocationProviderClient(context)
) {

. . . 
}

我有LocationRepository类:

class LocationRepository @Inject constructor(
private val sharedLocationManager: SharedLocationManager
) {
// Observe flow for device last location updates
fun lastLocation(): Flow<Location> = sharedLocationManager.lastLocationFlow()
//  Observable flow for device location updates
fun getLocationFlow(): SharedFlow<Location?> = sharedLocationManager.locationFlow()
}

我有采用LocationRepository:的viewModel

@HiltViewModel
class FindParkingViewModel @Inject constructor(
private val repository: LocationRepository // Data store from which to receive location updates via Flow, injected via Hilt
) : ViewModel() {
. . .
}

然后,我有一个可组合文件,它接受viewModel参数,从viewModel中获取位置,并将其显示在GoogleMaps:上

@Composable
fun FindParking(findParkingViewModel: FindParkingViewModel) {
findParkingViewModel location has value
val deviceCurrentLoc by findParkingViewModel.location.collectAsState(initial = null)
. . . 
val cameraPosState = rememberCameraPositionState {
position = CameraPosition.fromLatLngZoom(deviceCurrentLocLatLng, 12f)
}

GoogleMap(
modifier = modifier,
cameraPositionState = cameraPositionState,
properties = mapProperties,
uiSettings = uiSettings,
onMapLoaded = onMapLoaded
) {

}
}

最后,我有了NavHost:

@Composable
fun MapAppNavHost(
navController: NavHostController,
modifier: Modifier = Modifier
) {
// ** Creating the viewModel here solves the issue
location tracking val findParkingViewModel: FindParkingViewModel = hiltViewModel()
NavHost(
navController = navController,
startDestination = TopLevelDestination.Parking.route,
modifier = modifier
) {
composable(route = TopLevelDestination.Parking.route) {
FindParking(findParkingViewModel)
}
. . .

}

按以下方式执行会引发异常:

我更喜欢#1方法,因为代码更干净。

#1.将viewModel指定为默认参数会引发错误:

@Composable
fun FindParking(findParkingViewModel: FindParkingViewModel = hiltViewModel()) {
. . .
}

#2NavHostComposable函数中创建viewModel也抛出错误:

NavHost(
navController = navController,
startDestination = TopLevelDestination.Parking.route,
modifier = modifier
) {
composable(route = TopLevelDestination.Parking.route) {
// ---> creating this here breaks it
val findParkingViewModel: FindParkingViewModel = hiltViewModel()
FindParking(findParkingViewModel)
}
}

我尝试了几乎所有可用的解决方案,唯一对我有帮助的是:从模拟器中卸载应用程序,然后重新安装。这听起来可能很愚蠢,但对我有效。

相关内容

最新更新