如何在三星设备上使用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个可用物理摄像头,其余的长焦、微距等摄像头会被系统隐藏。
- 可按以下步骤排查优化:
- 在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" /> - 你当前仅校验了
REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA能力标记,部分三星设备不会正确填充该标记,可额外读取CameraCharacteristics.REQUEST_AVAILABLE_PHYSICAL_CAMERA_IDS字段,若该字段返回的列表非空,对应摄像头就是逻辑摄像头。 - 若需要访问全部物理摄像头,可到三星开发者平台申请多摄访问授权,完成对应机型的白名单申请后即可枚举到全部摄像头。
- S20系列需升级到OneUI 3.0及以上版本,系统才会开放部分逻辑多摄能力给第三方应用。
- 在AndroidManifest.xml中补充多摄相关特性声明:
内容的提问来源于stack exchange,提问作者BrandonJR29
相关产品推荐
相关产品推荐

