开发出租车App遇GoogleCertificatesRslt权限异常,求解决
Google Maps 集成权限异常排查与解决
异常信息
Unable to update local snapshot for com.google.android.libraries.consentverifier#com.example.starttaksi, may result in stale flags. java.util.concurrent.ExecutionException: java.lang.SecurityException: GoogleCertificatesRslt: not allowed: pkg=com.example.starttaksi, sha256=[f77957bb7143c0754d3c5e22d6c03f0af501037c4a3a8423ada13308aa8eaa05], atk=false, ver=234414038.true (go/gsrlt) at m.apa.s(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):21) at m.apa.get(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):5) at m.aqk.g(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):9) at m.yy.c(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):1) at m.zf.run(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):5) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:487) 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:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Caused by: java.lang.SecurityException: GoogleCertificatesRslt: not allowed: pkg=com.example.starttaksi, sha256=[f77957bb7143c0754d3c5e22d6c03f0af501037c4a3a8423ada13308aa8eaa05], atk=false, ver=234414038.true (go/gsrlt) at android.os.Parcel.createExceptionOrNull(Parcel.java:3023) at android.os.Parcel.createException(Parcel.java:3007) at android.os.Parcel.readException(Parcel.java:2990) at android.os.Parcel.readException(Parcel.java:2932) at m.fe.c(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):11) at m.sg.a(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):39) at m.jr.e(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):11) at m.kp.u(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):10) at m.kp.v(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):22) at m.kp.e(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):16) at m.kt.handleMessage(:com.google.android.gms.dynamite_mapsdynamite@234414038@23.44.14 (190400-0):774)
相关代码(MainFragment)
@AndroidEntryPoint class MainFragment : Fragment(R.layout.fragment_main), OnMapReadyCallback { private val binding by viewBinding(FragmentMainBinding::bind) private lateinit var map: GoogleMap private var locationPermissionGranted: Boolean = false private var lastKnownLocation: Location? = null private lateinit var fusedLocationProviderClient: FusedLocationProviderClient companion object { val REQUEST_CODE_LOCATION = 32 private const val DEFAULT_ZOOM = 15 private const val PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1 } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { binding.mapView.onCreate(savedInstanceState) binding.mapView.getMapAsync(this) fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireActivity()) } override fun onMapReady(googleMap: GoogleMap) { map = googleMap if (ActivityCompat.checkSelfPermission( requireContext(), Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions( requireActivity(), arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_CODE_LOCATION ) return } locationPermissionGranted = true map.isMyLocationEnabled = true getDeviceLocation() } private fun getDeviceLocation() { try { if (locationPermissionGranted) { val locationResult = fusedLocationProviderClient.lastLocation locationResult.addOnCompleteListener(requireActivity()) { task -> if (task.isSuccessful) { lastKnownLocation = task.result if (lastKnownLocation != null) { map.moveCamera( CameraUpdateFactory.newLatLngZoom( LatLng( lastKnownLocation!!.latitude, lastKnownLocation!!.longitude ), DEFAULT_ZOOM.toFloat() ) ) } } } } } catch (e: SecurityException) { } } }
问题根源
这个异常核心是Google服务验证不通过:你的应用包名com.example.starttaksi和签名SHA256值未在Google Cloud控制台正确配置,导致Google Maps相关服务拒绝应用请求。
解决步骤
1. 确认签名SHA256值
- Debug签名:在Android Studio打开
Gradle面板,找到应用模块,执行Tasks > android > signingReport,复制控制台输出的SHA256值(需和异常中的值比对一致)。 - Release签名:从签名文件(.jks/.keystore)提取,执行命令:
keytool -list -v -keystore 你的签名文件路径 -alias 签名别名
2. 配置Google Cloud控制台
- 进入Google Cloud控制台的Maps项目,打开
APIs & Services > Credentials页面。 - 找到对应API密钥(无则创建),点击进入详情。
- 在
Application restrictions选择Android apps,点击Add an item,输入应用包名com.example.starttaksi和获取到的SHA256值,保存配置。
3. 检查Manifest权限与密钥配置
确保AndroidManifest.xml添加必要权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />
同时确认Maps API密钥配置正确:
<meta-data android:name="com.google.android.geo.API_KEY" android:value="你的API密钥" />
4. 清理缓存并重建
- 执行
Build > Clean Project,再执行Build > Rebuild Project。 - 在测试设备上清除应用缓存和数据,重新安装应用。
5. 修复代码权限回调漏洞
代码中缺少权限授予后的回调处理,导致用户授权后地图无法自动更新位置,需重写onRequestPermissionsResult方法:
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) locationPermissionGranted = false when (requestCode) { REQUEST_CODE_LOCATION -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { locationPermissionGranted = true if (::map.isInitialized) { if (ActivityCompat.checkSelfPermission( requireContext(), Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED ) { map.isMyLocationEnabled = true getDeviceLocation() } } } } } }
内容的提问来源于stack exchange,提问作者Edgar
相关产品推荐
相关产品推荐

