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

如何在三星设备上使用Multi-Camera API?Logical Camera识别异常求助

我正在三星Galaxy A32和S20设备上使用multi-camera api,但无法从cameraIdList中获取到任何逻辑摄像头(Logical Camera),请问有没有人尝试过该API并成功获取到逻辑摄像头?

以下是MainActivity.kt代码:

class MainActivity : AppCompatActivity() {

    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        if(!CameraPermissionHelper.hasCameraPermission(this)){
            CameraPermissionHelper.requestCameraPermission(this)
            return
        }

        startCameraSession()

    }

    private fun startCameraSession(){

        val cameraManager : CameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager

        if(cameraManager.cameraIdList.isEmpty()){
            Toast.makeText(applicationContext, "There is not any camera", Toast.LENGTH_SHORT).show()
            return
        }

        for (s in cameraManager.cameraIdList) {
            val characteristics = cameraManager.getCameraCharacteristics(s)
            val capabilities = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)!!.contains(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA)
            if(capabilities){
                Log.i("TEST_CAMERA", "This is a Logical Camera $s")
            }else{
                Log.e("TEST_CAMERA", "No Logical Camera $s")
            }
        }
    }

    object CameraPermissionHelper{
        private const val CAMERA_PERMISSION_CODE = 0
        private const val CAMERA_PERMISSION = android.Manifest.permission.CAMERA

        fun hasCameraPermission(activity: Activity): Boolean{
            return ContextCompat.checkSelfPermission(activity, CAMERA_PERMISSION) == PackageManager.PERMISSION_GRANTED
        }

        fun requestCameraPermission(activity: Activity){
            ActivityCompat.requestPermissions(activity, arrayOf(CAMERA_PERMISSION), CAMERA_PERMISSION_CODE)
        }

        fun shouldShowRequestPermissionRationale(activity: Activity): Boolean{
            return ActivityCompat.shouldShowRequestPermissionRationale(activity, CAMERA_PERMISSION)
        }

        fun launchPermissionSetting(activity: Activity){
            val intent = Intent()
            intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
            intent.data = Uri.fromParts("package", activity.packageName, null)
            activity.startActivity(intent)
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (!CameraPermissionHelper.hasCameraPermission(this)){
            Toast.makeText(this, "Camera permission is needed to run this application", Toast.LENGTH_LONG).show()
            if (!CameraPermissionHelper.shouldShowRequestPermissionRationale(this)){
                CameraPermissionHelper.launchPermissionSetting(this)
            }
            finish()
        }
        recreate()
    }
}

我使用的minSDK版本为29。另外我在A32设备上测试时,仅能获取到3个摄像头的访问权限,但控制台中的CameraGlobalManager显示设备摄像头数量大于3,我不清楚为什么会出现这种情况。


解决方案

  • 核心原因是三星的系统限制:多数三星机型默认不会对普通第三方应用开放逻辑多摄接口,只有系统内置相机、通过三星开发者认证的特殊应用才能枚举到逻辑摄像头,普通应用默认只能拿到独立的物理摄像头列表。
  • 摄像头枚举数量不足是因为Android 10(API 29)引入了摄像头权限过滤规则,同时三星在系统层面做了额外限制,未认证的第三方应用最多只能枚举到前后共3个可用物理摄像头,其余的长焦、微距等摄像头会被系统隐藏。
  • 可按以下步骤排查优化:
    1. 在AndroidManifest.xml中补充多摄相关特性声明:
      <uses-feature android:name="android.hardware.camera" android:required="false" />
      <uses-feature android:name="android.hardware.camera.full" android:required="false" />
      <uses-feature android:name="android.hardware.camera.logical_multi_camera" android:required="false" />
      
    2. 你当前仅校验了REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA能力标记,部分三星设备不会正确填充该标记,可额外读取CameraCharacteristics.REQUEST_AVAILABLE_PHYSICAL_CAMERA_IDS字段,若该字段返回的列表非空,对应摄像头就是逻辑摄像头。
    3. 若需要访问全部物理摄像头,可到三星开发者平台申请多摄访问授权,完成对应机型的白名单申请后即可枚举到全部摄像头。
    4. S20系列需升级到OneUI 3.0及以上版本,系统才会开放部分逻辑多摄能力给第三方应用。

内容的提问来源于stack exchange,提问作者BrandonJR29

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:15:02