You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发出租车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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:35:00