Android应用授予位置权限后崩溃问题求助(含错误堆栈及Manifest配置)
根据你提供的Logcat报错信息,核心问题是java.lang.NoSuchFieldError:找不到com.google.android.gms.common.api.Api$ApiOptions$NoOptions类里的NO_OPTIONS字段,这个错误发生在初始化FusedLocationProviderClient的时候。下面是针对性的修复方案:
1. 统一Google Play Services依赖版本
这个错误最常见的原因是项目中不同Google Play Services组件的版本不兼容。比如你用了play-services-location:18.0.0,但其他组件(如play-services-ads)用了不同的版本,导致类加载时出现字段缺失。
- 打开Module级别的
build.gradle文件,检查所有以com.google.android.gms:play-services-*开头的依赖,确保它们的版本号完全一致。 - 推荐用版本变量统一管理,避免手动输入出错:
// 在Project级别的build.gradle里定义版本变量 ext { googlePlayServicesVersion = "20.0.0" // 选择一个稳定的最新版本,比如当前的20.x系列 } // 在Module级别的build.gradle里引用变量 implementation "com.google.android.gms:play-services-location:$googlePlayServicesVersion" implementation "com.google.android.gms:play-services-ads:$googlePlayServicesVersion"
2. 修正FusedLocationProviderClient的初始化方式
从报错行RegisterActivity.java:378来看,你应该是手动实例化了FusedLocationProviderClient,而不是用官方推荐的静态方法获取。手动实例化会依赖Google Play Services内部未公开的API,这些API在版本更新时可能被修改。
把初始化代码替换为官方推荐的方式:
// 错误写法:new FusedLocationProviderClient(context) // 正确写法: FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
3. 配置混淆规则(如果开启了代码混淆)
如果你的项目开启了ProGuard/R8混淆,可能是混淆规则把NO_OPTIONS字段误删了。在proguard-rules.pro文件中添加以下规则:
// 保留Google Play Services位置相关类和字段 -keep class com.google.android.gms.location.** { *; } -keep class com.google.android.gms.common.api.Api$ApiOptions$NoOptions { *; } // 通用的Google Play Services混淆规则(可选) -keep class com.google.android.gms.** { *; } -dontwarn com.google.android.gms.**
4. 清理重建项目
完成上述修改后,执行以下步骤确保依赖生效:
- 点击Android Studio菜单栏的
Build -> Clean Project - 再点击
Build -> Rebuild Project - 必要时可以删除项目根目录的
.gradle文件夹和Module下的build文件夹,然后重新同步项目。
5. 检查设备的Google Play Services版本
测试设备上的Google Play Services版本过旧也可能导致兼容性问题。进入设备的设置 -> 应用 -> Google Play Services查看版本,或者通过Google Play商店更新到最新版本。
这些步骤应该能解决你遇到的权限授权后崩溃问题。
内容的提问来源于stack exchange,提问作者otalia

