升级至SDK31后Android Studio提示ActivityResultContracts包不存在求助
核心原因
你遇到的ActivityResultContracts包不存在错误,主要和AndroidX包导入错误、项目依赖冲突、以及未完全适配AndroidX环境有关,结合你的情况具体拆解如下:
1. 导入语句错误
ActivityResultContracts属于AndroidX的androidx.activity.result.contract包,很多人会写错导入路径,你需要确认代码里的导入语句是:
import androidx.activity.result.contract.ActivityResultContracts;
如果写成import ActivityResultContracts;或者其他错误路径,必然会报包不存在。
2. 项目已在使用AndroidX,但存在依赖冲突
你配置的依赖(androidx.appcompat、androidx.activity)都是AndroidX库,说明你的项目已经部分启用AndroidX,不存在“未迁移”的情况——反而如果项目里还残留旧的com.android.support系列依赖,会导致AndroidX和旧Support库冲突,引发依赖加载异常。
检查你的build.gradle(app模块),如果有类似com.android.support:appcompat-v7、com.android.support:support-v4这类依赖,全部替换为对应的AndroidX版本:
com.android.support:appcompat-v7→androidx.appcompat:appcompat:1.5.1(你已经添加)com.android.support:support-v4→androidx.core:core:1.9.0
3. Gradle插件版本不匹配
androidx.activity:activity:1.6.1需要对应的Gradle插件版本支持,建议将项目根目录build.gradle中的Gradle插件版本升级到7.0.0及以上:
buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.0.0' // 或更高版本,比如7.4.2 } }
同时确保gradle-wrapper.properties中的Gradle版本和插件版本匹配(比如插件7.0.0对应Gradle 7.0+):
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
4. 类继承问题
registerForActivityResult只能在继承自ComponentActivity或AppCompatActivity的类中使用(AppCompatActivity本身继承自ComponentActivity),你之前改继承ComponentActivity解决过registerForActivityResult的问题,现在要确保当前调用ActivityResultContracts的类也符合这个要求,不能继承旧的android.app.Activity。
5. 构建缓存问题
旧的构建缓存可能导致依赖未正确加载,执行以下操作清理缓存:
- 在Android Studio中点击
File→Invalidate Caches...→ 选择Invalidate and Restart - 或者在终端执行:
./gradlew clean build
额外定位权限适配提示
针对SDK31的定位权限变更,除了权限请求代码,还需要注意:
- 在
AndroidManifest.xml中添加ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION权限,若需要后台定位,还要添加ACCESS_BACKGROUND_LOCATION(SDK29+需要) - 请求权限时,先请求
ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION,用户允许后,再请求ACCESS_BACKGROUND_LOCATION(不能一次性请求三个,否则会被系统拒绝)
内容的提问来源于stack exchange,提问作者Justin

