LocationServices运行时错误:FusedLocationProviderClient非法访问类问题
java.lang.IllegalAccessError:FusedLocationProviderClient访问内部类失败的问题 这个问题我之前帮同事排查过,核心原因几乎都是Google Play服务依赖版本不兼容或冲突导致的!下面给你一步步的解决方案:
问题根源
IllegalAccessError在这里的本质是:你的FusedLocationProviderClient来自某个版本的Play服务,但它试图访问的内部类com.google.android.gms.internal.zzbce却来自另一个版本(或者权限被版本更新改变了),导致JVM认为这是非法的跨类访问。
具体解决步骤
统一所有Play服务依赖的版本
这是最常见的解决办法!建议在项目根目录的build.gradle中定义一个全局版本变量,确保所有Play服务相关依赖都用同一个版本:ext { googlePlayServicesVersion = "20.0.0" // 替换成最新稳定版,或和你项目兼容的版本 }然后所有模块的Play服务依赖都引用这个变量,比如定位模块:
implementation "com.google.android.gms:play-services-location:${googlePlayServicesVersion}"别忘了检查其他Play服务依赖(比如地图、认证等),确保它们的版本完全一致。
清理编译缓存并重建项目
旧的编译缓存可能残留了版本冲突的文件,执行以下操作:- 点击Android Studio菜单栏的
Build > Clean Project - 接着点击
Build > Rebuild Project - 也可以手动删除项目根目录的
.gradle文件夹和各模块下的build文件夹,然后重新同步项目。
- 点击Android Studio菜单栏的
排查第三方库的依赖冲突
有些第三方库会偷偷引入旧版本的Play服务,导致版本冲突。你可以用这个命令查看完整依赖树:./gradlew app:dependencies # macOS/Linux # 或者Windows用:gradlew.bat app:dependencies搜索
play-services-location,如果发现有多个版本,就用exclude语句排除第三方库带的旧版本,比如:implementation('com.example:some-third-party-lib:1.0.0') { exclude group: 'com.google.android.gms', module: 'play-services-location' }更新设备上的Google Play服务
如果测试设备上的Play服务版本过低,也可能出现这种兼容性问题。让用户去Google Play商店更新Google Play服务到最新版本,或者在模拟器中安装对应版本的Play服务APK。
额外提示
如果你用了Jetpack的androidx.core:core-location库,也要确保它和Play服务版本的兼容性,建议参考官方文档确认版本对应关系。
内容的提问来源于stack exchange,提问作者Ciprian Ivan

