Android — Не удается запустить камеру из плавающего вида / Сервис — Kotlin

#android #kotlin #android-service #android-camera #android-databinding

Вопрос:

Я пытаюсь создать плавающее представление (что-то вроде плавающего изображения пользователя Facebook Messenger)

Example:
https://www.cnet.com/a/img/YcbyFcLt1YoAYIvkKOLIvUqDZbU=/1200×630/2013/04/12/5b94f150-f0e0-11e2-8c7c-d4ae52e62bcc/Facebook_Messenger_ChatHeads.jpg

Проблема:

Когда я пытаюсь сделать это, используя следующий код — предварительный просмотр камеры никогда не запускается/не заполняется/не отображается, и я не уверен, почему.

Любые предложения/советы/идеи приветствуются.

Исходный Фрагмент кода:

 class FloatingViewService : Service() {

    private val context: Context? = null
    private val mView: View? = null
    private var mParams: WindowManager.LayoutParams? = null
    private var mWindowManager: WindowManager? = null

    private lateinit var binding: OverlayLayoutBinding
    private var imageCapture: ImageCapture? = null

    private var mFloatingView: View? = null
    private var params: WindowManager.LayoutParams? = null
    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    @SuppressLint("ClickableViewAccessibility")
    override fun onCreate() {
        super.onCreate()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) startMyOwnForeground() else startForeground(
            1,
            Notification()
        )
        //Inflate the floating view layout we created
        mFloatingView = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null)
        val LAYOUT_FLAG: Int
            LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
            params = WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                LAYOUT_FLAG,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
            )
        
        startCamera()

        mWindowManager = getSystemService(WINDOW_SERVICE) as WindowManager?
        mWindowManager!!.addView(mFloatingView, params)

        startCamera()

    }

    private fun startCamera() {

        val cameraProviderFuture = ProcessCameraProvider
            .getInstance(this)

        cameraProviderFuture.addListener({

            val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

            val preview = Preview.Builder()
                .build()
                .also { mPreview ->
                    mPreview.setSurfaceProvider(
                        binding.viewFinder.surfaceProvider
                    )
                }
            imageCapture = ImageCapture.Builder()
                .build()

            val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA

            try {
                cameraProvider.unbindAll()
                cameraProvider.bindToLifecycle(
                    (context as LifecycleOwner),
                    cameraSelector,
                    preview, imageCapture
                )

            } catch (e: Exception) {
                Log.d(Constants.TAG, "Camera Failed to Start")
            }
        }, ContextCompat.getMainExecutor(this))
    }

}
 

Полный Источник:

https://pastebin.com/3wG1QP98

https://drive.google.com/file/d/1ClgD3HLZaQ25toalygAZphuR7XUA3QRG/view?usp=sharing

Комментарии:

1. Поскольку вы обрабатываете исключение, проверяли ли вы logcat на наличие каких-либо сообщений типа «Камера не запустилась» ? Также попробуйте распечатать трассировку стека и посмотреть, не происходит ли что-нибудь не так.

2. Да — у меня есть — ошибка не регистрируется, и исключение никогда не возникает, если я устанавливаю точку останова

3. @GokulNathKP — я только что добавил полный источник — возможно, это даст больше информации