У меня есть приложение для сканирования штрих-кодов, и я столкнулся с проблемой после замены старой необслуживаемой библиотеки камер на cameraX и MLKit. Проблема в том, что при сканировании штрих-кодов на Google Pixel 8 PRO телефон продолжает менять линзы при приближении к объекту (я предполагаю, что она меняется на широкую линзу). Смена объектива происходит беспорядочно, что усложняет использование сканера. Я пытался воспроизвести эту проблему на Samsung S25, который также имеет автоматическое переключение объектива, но там проблемы не было, потому что в приложении объективы не переключаются автоматически. Чтобы решить эту проблему, я попытался назначить только физическую камеру, чтобы предотвратить автоматическое переключение камеры, но это не решило проблему. Есть ли способ остановить это автоматическое переключение объектива или сделать его менее отвлекающим?
Целевой SDK приложения — 36.
minSDK — 23.
Версии Android на телефоне — 16 (SDK 36).
Код, запускающий камеру:
fun startCamera() {
if (camera != null) {
checkForFlashSetting()
}
toggleFlashIcon()
if (isCameraStarted) return
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
// Used to bind the lifecycle of cameras to the lifecycle owner
cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(viewFinder.surfaceProvider)
}
barcodeAnalyzer = BarcodeAnalyzerMainScreen(barcodeResultListener)
val imageAnalysisUseCase = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.also {
it.setAnalyzer(cameraExecutor, barcodeAnalyzer!!)
}
val cameraProvider = cameraProviderFuture.get()
@OptIn(ExperimentalCamera2Interop::class)
val selectedCameraId = cameraProvider.availableCameraInfos
.map { Camera2CameraInfo.from(it) }
.firstOrNull { camera2Info ->
val focalLengths = camera2Info.getCameraCharacteristic(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)
val capabilities = camera2Info.getCameraCharacteristic(
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES
)
var isLogical = true
// multi camera support was added in SDK level 28
if (SDK_INT >= 28) {
isLogical = capabilities?.contains(
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
) == true
}
val physicalId = camera2Info.getCameraId()
Log.d("CameraDebug", "Camera ID: $physicalId, Focal lengths: ${focalLengths?.joinToString()}, is logical: $isLogical")
val lensFacing = camera2Info.getCameraCharacteristic(CameraCharacteristics.LENS_FACING)
lensFacing == CameraCharacteristics.LENS_FACING_BACK &&
focalLengths?.any { it >= 4.0f } == true && !isLogical
}?.cameraId
@OptIn(ExperimentalCamera2Interop::class)
val cameraSelector = if (selectedCameraId != null) {
CameraSelector.Builder()
.addCameraFilter { cameraInfos ->
cameraInfos.filter { cameraInfo ->
Camera2CameraInfo.from(cameraInfo).cameraId == selectedCameraId
}
}.build()
} else {
// Fallback to default back camera if filtering fails
CameraSelector.DEFAULT_BACK_CAMERA
}
try {
// Unbind use cases before rebinding
cameraProvider?.unbindAll()
camera = cameraProvider?.bindToLifecycle(
lifecycleOwner, cameraSelector, preview, imageAnalysisUseCase
)
isCameraStarted = true
viewFinder.isVisible = true
checkForFlashSetting()
} catch (exc: Exception) {
if (DEBUG_FULL) {
Log.println(Log.DEBUG, "error", "Use case binding failed " + exc)
}
}
}, ContextCompat.getMainExecutor(context))
}
Еще вопрос, есть ли возможность протестировать этот объектив, включив эмулятор или что-то подобное? У меня нет устройства, на котором возникла проблема, чтобы проверить его. В настоящее время мой эмулятор практически непригоден для использования из-за того, насколько плохо он работает, но я хотел бы знать, возможно ли вообще проверить, переключаются ли на нем объективы камеры.
Изменить: теперь я вернулся к своему предыдущему коду, в котором я не назначаю физическую камеру, а логическую, потому что мой приоритет теперь сместился с попытки остановить автоматическое переключение объектива на то, чтобы заставить его работать правильно на всех устройствах:
fun startCamera() {
if (camera != null) {
checkForFlashSetting()
}
toggleFlashIcon()
if (isCameraStarted) return
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(viewFinder.surfaceProvider)
}
barcodeAnalyzer = BarcodeAnalyzerMainScreen(barcodeResultListener)
val imageAnalysisUseCase = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.also {
it.setAnalyzer(cameraExecutor, barcodeAnalyzer!!)
}
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
// Unbind use cases before rebinding
cameraProvider?.unbindAll()
camera = cameraProvider?.bindToLifecycle(
lifecycleOwner, cameraSelector, preview, imageAnalysisUseCase
)
isCameraStarted = true
viewFinder.isVisible = true
checkForFlashSetting()
} catch (exc: Exception) {
if (DEBUG_FULL) {
Log.println(Log.DEBUG, "error", "Use case binding failed " + exc)
}
}
}, ContextCompat.getMainExecutor(context))
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... -to-scan-b
Google Pixel 8 PRO продолжает переключаться на широкоугольную камеру при попытке сканировать штрих-коды ⇐ Android
Форум для тех, кто программирует под Android
1772726612
Anonymous
У меня есть приложение для сканирования штрих-кодов, и я столкнулся с проблемой после замены старой необслуживаемой библиотеки камер на cameraX и MLKit. Проблема в том, что при сканировании штрих-кодов на Google Pixel 8 PRO телефон продолжает менять линзы при приближении к объекту (я предполагаю, что она меняется на широкую линзу). Смена объектива происходит беспорядочно, что усложняет использование сканера. Я пытался воспроизвести эту проблему на Samsung S25, который также имеет автоматическое переключение объектива, но там проблемы не было, потому что в приложении объективы не переключаются автоматически. Чтобы решить эту проблему, я попытался назначить только физическую камеру, чтобы предотвратить автоматическое переключение камеры, но это не решило проблему. Есть ли способ остановить это автоматическое переключение объектива или сделать его менее отвлекающим?
Целевой SDK приложения — 36.
minSDK — 23.
Версии Android на телефоне — 16 (SDK 36).
Код, запускающий камеру:
fun startCamera() {
if (camera != null) {
checkForFlashSetting()
}
toggleFlashIcon()
if (isCameraStarted) return
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
// Used to bind the lifecycle of cameras to the lifecycle owner
cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(viewFinder.surfaceProvider)
}
barcodeAnalyzer = BarcodeAnalyzerMainScreen(barcodeResultListener)
val imageAnalysisUseCase = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.also {
it.setAnalyzer(cameraExecutor, barcodeAnalyzer!!)
}
val cameraProvider = cameraProviderFuture.get()
@OptIn(ExperimentalCamera2Interop::class)
val selectedCameraId = cameraProvider.availableCameraInfos
.map { Camera2CameraInfo.from(it) }
.firstOrNull { camera2Info ->
val focalLengths = camera2Info.getCameraCharacteristic(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)
val capabilities = camera2Info.getCameraCharacteristic(
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES
)
var isLogical = true
// multi camera support was added in SDK level 28
if (SDK_INT >= 28) {
isLogical = capabilities?.contains(
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
) == true
}
val physicalId = camera2Info.getCameraId()
Log.d("CameraDebug", "Camera ID: $physicalId, Focal lengths: ${focalLengths?.joinToString()}, is logical: $isLogical")
val lensFacing = camera2Info.getCameraCharacteristic(CameraCharacteristics.LENS_FACING)
lensFacing == CameraCharacteristics.LENS_FACING_BACK &&
focalLengths?.any { it >= 4.0f } == true && !isLogical
}?.cameraId
@OptIn(ExperimentalCamera2Interop::class)
val cameraSelector = if (selectedCameraId != null) {
CameraSelector.Builder()
.addCameraFilter { cameraInfos ->
cameraInfos.filter { cameraInfo ->
Camera2CameraInfo.from(cameraInfo).cameraId == selectedCameraId
}
}.build()
} else {
// Fallback to default back camera if filtering fails
CameraSelector.DEFAULT_BACK_CAMERA
}
try {
// Unbind use cases before rebinding
cameraProvider?.unbindAll()
camera = cameraProvider?.bindToLifecycle(
lifecycleOwner, cameraSelector, preview, imageAnalysisUseCase
)
isCameraStarted = true
viewFinder.isVisible = true
checkForFlashSetting()
} catch (exc: Exception) {
if (DEBUG_FULL) {
Log.println(Log.DEBUG, "error", "Use case binding failed " + exc)
}
}
}, ContextCompat.getMainExecutor(context))
}
Еще вопрос, есть ли возможность протестировать этот объектив, включив эмулятор или что-то подобное? У меня нет устройства, на котором возникла проблема, чтобы проверить его. В настоящее время мой эмулятор практически непригоден для использования из-за того, насколько плохо он работает, но я хотел бы знать, возможно ли вообще проверить, переключаются ли на нем объективы камеры.
Изменить: теперь я вернулся к своему предыдущему коду, в котором я не назначаю физическую камеру, а логическую, потому что мой приоритет теперь сместился с попытки остановить автоматическое переключение объектива на то, чтобы заставить его работать правильно на всех устройствах:
fun startCamera() {
if (camera != null) {
checkForFlashSetting()
}
toggleFlashIcon()
if (isCameraStarted) return
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(viewFinder.surfaceProvider)
}
barcodeAnalyzer = BarcodeAnalyzerMainScreen(barcodeResultListener)
val imageAnalysisUseCase = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.also {
it.setAnalyzer(cameraExecutor, barcodeAnalyzer!!)
}
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
// Unbind use cases before rebinding
cameraProvider?.unbindAll()
camera = cameraProvider?.bindToLifecycle(
lifecycleOwner, cameraSelector, preview, imageAnalysisUseCase
)
isCameraStarted = true
viewFinder.isVisible = true
checkForFlashSetting()
} catch (exc: Exception) {
if (DEBUG_FULL) {
Log.println(Log.DEBUG, "error", "Use case binding failed " + exc)
}
}
}, ContextCompat.getMainExecutor(context))
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79780652/google-pixel-8-pro-keeps-switching-to-the-wide-lens-camera-when-trying-to-scan-b[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия