Android API31+下EncoderProfiles.getAll无法解析问题求助
解决EncoderProfiles.getAll无法解析的问题
1. 修正API级别注解
EncoderProfiles.getAll()是**API 33(Android 13,对应Build.VERSION_CODES.TIRAMISU)**才新增的方法,你当前用的@RequiresApi(Build.VERSION_CODES.S)对应API31,注解级别不匹配,会导致IDE无法识别方法,同时低版本设备调用会崩溃。需将注解修改为:
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
2. 确保项目与SDK同步
即便你已设置compileSdk=34,仍需确认:
- 本地已下载API34及对应版本的SDK Platform
- 执行
File -> Sync Project with Gradle Files同步项目,让IDE加载新增的API方法 - 若同步后仍无效果,尝试清理缓存:
Build -> Clean Project->Build -> Rebuild Project
3. 兼容多版本的代码逻辑
由于CamcorderProfile仅在API33及以上被标记为弃用,可通过版本分支处理,同时保留对低版本设备的支持:
import android.media.CamcorderProfile import android.media.EncoderProfiles import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraManager import android.os.Build import androidx.annotation.RequiresApi import android.util.Log fun getAvailableEncoderProfiles(cameraManager: CameraManager, cameraId: String): List<Int> { val characteristics = cameraManager.getCameraCharacteristics(cameraId) val cameraDirection = characteristics.get(CameraCharacteristics.LENS_FACING) if (cameraDirection == CameraCharacteristics.LENS_FACING_FRONT) { return listOf(CamcorderProfile.QUALITY_HIGH).also { Log.d("CameraApp", "Front-facing camera detected, using QUALITY_HIGH") } } val qualities = listOf( CamcorderProfile.QUALITY_8KUHD, CamcorderProfile.QUALITY_4KDCI, CamcorderProfile.QUALITY_2160P, CamcorderProfile.QUALITY_1080P, CamcorderProfile.QUALITY_2K, CamcorderProfile.QUALITY_720P, CamcorderProfile.QUALITY_480P, CamcorderProfile.QUALITY_CIF, CamcorderProfile.QUALITY_QVGA, CamcorderProfile.QUALITY_QCIF, CamcorderProfile.QUALITY_LOW, CamcorderProfile.QUALITY_HIGH, ) val availableQualities = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { qualities.filter { quality -> try { EncoderProfiles.getAll(cameraId, quality) != null } catch (e: IllegalArgumentException) { false } } } else { qualities.filter { quality -> CamcorderProfile.hasProfile(cameraId.toInt(), quality) } } availableQualities.forEach { quality -> Log.d("CameraApp", "Available quality: $quality") } return availableQualities }
4. 额外注意事项
- 部分QUALITY常量(如
QUALITY_8KUHD)可能受硬件限制,无法被所有设备支持,捕获IllegalArgumentException的处理方式是合理的 - 若你的
minSdk为26,版本判断可确保低版本设备正常运行
内容的提问来源于stack exchange,提问作者DrDree
相关产品推荐
相关产品推荐

