Автофокус не работает в Samsung S8

Обновление 2: Любые режимы фокусировки, по-видимому, не работают

Обновление 1: проблема, кажется, изолирована от моего устройства Samsung S8. Он работает с телефонами Nexus 5X и Xiaomi

Я пытался сделать работу FOCUS_MODE_CONTINUOUS_PICTURE но безрезультатно. Я подтвердил, что мое устройство поддерживает непрерывное автоматическое изображение через getSupportedFocusModes() , и не уверен, почему оно не работает.

Вот мой код, непрерывная автофокусировка устанавливается в startCamera() :

 class CaptureReceiptFragment : Fragment(), CaptureReceiptContract.View { private val MY_PERMISSIONS_REQUEST_CAMERA = 1 private var camera: Camera? = null private var hasCameraPermission: Boolean? = null private lateinit var preview: CameraPreview override var presenter: CaptureReceiptContract.Presenter? = null private val picture = Camera.PictureCallback { data, camera -> val pictureStorageDir = File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), getAppName()) presenter?.saveReceipt(pictureStorageDir, data) } override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { val root = inflater!!.inflate(R.layout.capturereceipt_frag, container, false) return root } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) hasCameraPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED if (hasCameraPermission!!) { showCameraErrorMsg() } else { capturereceipt_button_capturereceipt.setOnClickListener { captureReceipt() } startCameraOnCreate() } } override fun onResume() { super.onResume() presenter?.start() if (hasCameraPermission!!) { showCameraErrorMsg() } else { startCamera() setCameraRotation() } } override fun onPause() { super.onPause() camera?.release() camera = null } override fun gotoReceiptList() { //TODO } override fun goBack() { //TODO } private fun startCameraOnCreate() { preview = CameraPreview(context) capturereceipt_framelayout_viewfinder.addView(preview) startCamera() } private fun startCamera() { if (camera == null) { camera = Camera.open() if (camera == null) { showCameraErrorMsg() } else { val params: Camera.Parameters? = camera!!.parameters if (params!!.getSupportedFocusModes() .contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { params.focusMode = Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE; } camera?.parameters = params preview.camera = camera capturereceipt_textview_cameraerrormsg.visibility = View.GONE capturereceipt_framelayout_viewfinder.visibility = View.VISIBLE } } } private fun showCameraErrorMsg() { capturereceipt_textview_cameraerrormsg.visibility = View.VISIBLE capturereceipt_framelayout_viewfinder.visibility = View.GONE } override fun captureReceipt() { camera?.takePicture(null, null, picture) } private fun getOutputPictureFile(): File? { val appName = getAppName() val pictureStorageDir = File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), appName) if (!pictureStorageDir.exists()) { pictureStorageDir.mkdirs() } val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date()) return File(pictureStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg") } private fun getAppName(): String { val appInfo = context.getApplicationInfo() val stringId = appInfo.labelRes if (stringId == 0) { return appInfo.nonLocalizedLabel.toString() } else { return this.getString(stringId) } } fun setCameraDisplayOrientation() { val info = Camera.CameraInfo() Camera.getCameraInfo(CAMERA_FACING_BACK, info) val rotation = activity.windowManager.defaultDisplay.rotation var degrees = 0 when (rotation) { Surface.ROTATION_0 -> degrees = 0 Surface.ROTATION_90 -> degrees = 90 Surface.ROTATION_180 -> degrees = 180 Surface.ROTATION_270 -> degrees = 270 } var result: Int if (info.facing == CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360 result = (360 - result) % 360 // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360 } camera?.setDisplayOrientation(result); } fun setCameraRotation() { val info: Camera.CameraInfo = Camera.CameraInfo() Camera.getCameraInfo(CAMERA_FACING_BACK, info) val rotation = activity.windowManager.defaultDisplay.rotation var degrees = 0 when(rotation) { Surface.ROTATION_0 -> degrees = 0 Surface.ROTATION_90 -> degrees = 90 Surface.ROTATION_180 -> degrees = 180 Surface.ROTATION_270 -> degrees = 270 } val rotate = (info.orientation - degrees + 360) % 360 camera?.setDisplayOrientation(rotate) val params: Camera.Parameters = camera!!.parameters params.setRotation(rotate) camera?.parameters = params } companion object { @JvmStatic fun newInstance(): CaptureReceiptFragment { return CaptureReceiptFragment() } } 

}

Любая помощь будет оценена по достоинству. Благодаря!

Я, наконец, понял – похоже, что параметры режима автофокусировки должны быть установлены по-разному в Samsung S8.

Вот что я пробовал, что не удалось:

  1. Настройка любых режимов автофокусировки (AUTO, CONTINUOUS_PICTURE, INFINITY) перед началом просмотра
  2. Запланированная camera.autoFocus() запускать каждую секунду сразу после камеры.

Вот что я пробовал:

  1. Включение непрерывной фокусировки или camera.autoFocus() с помощью кнопки onClick
  2. Отсрочка установки непрерывной фокусировки на 1 секунду после camera.open() <- это то, что решило мою проблему

Мой код для # 2:

 private val autoFocusExecutor = ScheduledThreadPoolExecutor(1) fun startCamera() { if (camera == null) { camera = Camera.open() if (camera == null) { showCameraErrorMsg() } else { preview.camera = camera capturereceipt_textview_cameraerrormsg.visibility = View.GONE capturereceipt_framelayout_viewfinder.visibility = View.VISIBLE autoFocusExecutor.schedule(Sc{ val params: Camera.Parameters = camera!!.parameters if (params.getSupportedFocusModes() .contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { //TODO: Auto focus not working params.focusMode = Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE } camera?.parameters = params }, 1000, TimeUnit.MILLISECONDS) } } }