You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:50:21