Flutter获取位置权限时触发IncompatibleClassChangeError异常求助
Flutter位置权限申请时IncompatibleClassChangeError异常解决方法
问题背景
在Android 13设备上,使用location: ^4.4.0和firebase_messaging: ^14.1.2插件时,接受位置权限会触发以下异常:
java.lang.IncompatibleClassChangeError: Found interface com.google.android.gms.location.SettingsClient, but class was expected (declaration of 'com.google.android.gms.location.SettingsClient' appears in /data/app/~~vK3x6kuSR8MsWIHWo0p-pg==/com.wst.occser-5pgr4NMzu9vj5rO5C1Dcew==/base.apk!classes3.dex) E/AndroidRuntime(15597): at com.lyokone.location.FlutterLocation.startRequestingLocation(FlutterLocation.java:422) E/AndroidRuntime(15597): at com.lyokone.location.FlutterLocation.onRequestPermissionsResultHandler(FlutterLocation.java:131) E/AndroidRuntime(15597): at com.lyokone.location.FlutterLocation.onRequestPermissionsResult(FlutterLocation.java:122) E/AndroidRuntime(15597): at io.flutter.embedding.engine.FlutterEngineConnectionRegistry$FlutterEngineActivityPluginBinding.onRequestPermissionsResult(FlutterEngineConnectionRegistry.java:777) E/AndroidRuntime(15597): at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.onRequestPermissionsResult(FlutterEngineConnectionRegistry.java:409) E/AndroidRuntime(15597): at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onRequestPermissionsResult(FlutterActivityAndFragmentDelegate.java:757) E/AndroidRuntime(15597): at io.flutter.embedding.android.FlutterFragment.onRequestPermissionsResult(FlutterFragment.java:915) E/AndroidRuntime(15597): at io.flutter.embedding.android.FlutterFragmentActivity.onRequestPermissionsResult(FlutterFragmentActivity.java:549) E/AndroidRuntime(15597): at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:8619) E/AndroidRuntime(15597): at android.app.Activity.dispatchActivityResult(Activity.java:8476) E/AndroidRuntime(15597): at android.app.ActivityThread.deliverResults(ActivityThread.java:5560) E/AndroidRuntime(15597): at android.app.ActivityThread.handleSendResult(ActivityThread.java:5606) E/AndroidRuntime(15597): at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) E/AndroidRuntime(15597): at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) E/AndroidRuntime(15597): at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) E/AndroidRuntime(15597): at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) E/AndroidRuntime(15597): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2374) E/AndroidRuntime(15597): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime(15597): at android.os.Looper.loopOnce(Looper.java:233) E/AndroidRuntime(15597): at android.os.Looper.loop(Looper.java:344) E/AndroidRuntime(15597): at android.app.ActivityThread.main(ActivityThread.java:8248) E/AndroidRuntime(15597): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(15597): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589) E/AndroidRuntime(15597): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071) E/Parcel (15597): Reading a NULL string not supported here. I/Quality (15597): SlowBinder: com.wst.occser to android.app.IActivityManager cost= 284 code= 7 I/Process (15597): Sending signal. PID: 15597 SIG: 9
原因分析
异常由Google Play Services依赖版本冲突导致:旧版location插件依赖的play-services-location将SettingsClient定义为类,而firebase_messaging引入的新版play-services-location中SettingsClient已改为接口,两者定义不匹配引发错误。
解决步骤
1. 强制统一Play Services依赖版本
在android/build.gradle的allprojects块中添加版本强制配置,确保所有插件使用同一版本的play-services-location:
allprojects { repositories { // 保留原有仓库配置 } configurations.all { resolutionStrategy { // 选择与firebase_messaging兼容的版本,如21.0.1 force 'com.google.android.gms:play-services-location:21.0.1' } } }
2. 升级location插件到兼容版本
location: ^4.4.0版本较旧,未适配新版Play Services。升级到最新稳定版(如^6.0.0及以上),新版本已修复该兼容性问题:
# 修改pubspec.yaml中的依赖 dependencies: location: ^6.0.0 # 替换为最新稳定版 firebase_messaging: ^14.1.2
3. 清理缓存并重新构建
执行以下命令清除Flutter和Android缓存,确保依赖生效:
flutter clean flutter pub get cd android && ./gradlew clean cd .. && flutter run
内容的提问来源于stack exchange,提问作者Vasu
相关产品推荐
相关产品推荐

