无法启动Android 5.0.1的相机预览,无法连接到相机服务

问题描述 投票:0回答:1

我正在使用Android App来启动Camera预览以便执行一些OCR操作,但我无法使其在Android 5.0.1设备上正常工作。

我在surfaceCreated上遇到错误:

无法连接相机服务

这是我的示例代码:

class OCRActivity : AppCompatActivity()
{
private var mCameraSource by Delegates.notNull<CameraSource>()
private var textRecognizer by Delegates.notNull<TextRecognizer>()
private var tryToOpenView = false

private val PERMISSION_REQUEST_CAMERA = 100


override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ocr)

    supportActionBar?.hide()


    window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)

    .......

    generateOCRView()
}


override fun onResume()
{
    super.onResume()
}


private fun generateOCRView()
{
    //  Create text Recognizer
    textRecognizer = TextRecognizer.Builder(this).build()

    if (!textRecognizer.isOperational)
    {
        Toast.makeText(this, MSG, Toast.LENGTH_LONG ).show()
        finish()
        return
    }

    var bestPreviewSize: Camera.Size? = null

    if (isCameraPermissionGranted())
    {
        // Get best preview size for the camera
        val mCamera = Camera.open()

        if (mCamera != null)
        {
            val mCameraParameters = mCamera.parameters

            if (mCameraParameters != null)
            {
                val thisBestPreviewSize = getBestPreviewSize(mCameraParameters)

                if (thisBestPreviewSize != null)
                {
                    bestPreviewSize = thisBestPreviewSize
                }
            }
        }
    }

    //  Init camera source to use high resolution and auto focus
    mCameraSource = if (bestPreviewSize != null)
    {
        CameraSource.Builder(this, textRecognizer)
            .setFacing(CameraSource.CAMERA_FACING_BACK)
            .setAutoFocusEnabled(true)
            .setRequestedFps(30.0f)
            .setRequestedPreviewSize(bestPreviewSize.height, bestPreviewSize.width)
            .build()
    }
    else
    {
        // Default camera size, can be stretched...
        CameraSource.Builder(this, textRecognizer)
            .setFacing(CameraSource.CAMERA_FACING_BACK)
            .setAutoFocusEnabled(true)
            .setRequestedFps(30.0f)
            .setRequestedPreviewSize(1920, 1080)
            .build()
    }

    surface_camera_preview.holder.addCallback(object : SurfaceHolder.Callback
    {

        override fun surfaceChanged(p0: SurfaceHolder?, p1: Int, p2: Int, p3: Int)
        {
            Log.d("surfaceChanged", "surfaceChanged")
            return
        }

        override fun surfaceDestroyed(p0: SurfaceHolder?)
        {
            Log.d("surfaceDestroyed", "surfaceDestroyed")
            mCameraSource.stop()
        }

        @SuppressLint("MissingPermission")
        override fun surfaceCreated(p0: SurfaceHolder?)
        {
            try
            {
                // If the camera permission is granted
                if (isCameraPermissionGranted())
                {
                    Log.d("surfaceCreated", "surfaceCreated with permission granted")
                    // Show camera preview
                    mCameraSource.start(surface_camera_preview.holder)
                }
                else
                {
                    requestForPermission()
                }
            } catch (e: Exception) {
                Log.e(localClassName, "surfaceCreated error:  ${e.message}")
                finish()
            }
        }
    })

    textRecognizer.setProcessor(object : Detector.Processor<TextBlock>
    {
        override fun release()
        {
            return
        }

        override fun receiveDetections(detections: Detector.Detections<TextBlock>)
        {
            val items = detections.detectedItems

            if (items.size() <= 0)
            {
                return
            }

            tryToOpenView = false

            mrzResult.post {
                val stringBuilder = StringBuilder()

                for (i in 0 until items.size())
                {
                    val item = items.valueAt(i)
                    stringBuilder.append(item.value)
                    stringBuilder.append("\n")
                }

                ...........
            }
        }
    })
}

/**
 * isCameraPermissionGranted function: Check if camera permission is granted.
 *
 * @return Boolean: true if camera permission is granted and false if not.
 */
fun isCameraPermissionGranted(): Boolean
{
    return ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
}

/**
 * requestForPermission function:
 */
private fun requestForPermission()
{
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), PERMISSION_REQUEST_CAMERA)
}


@SuppressLint("MissingPermission")
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray)
{
    // Go back to previous if camera permission is refuses
    if (requestCode != PERMISSION_REQUEST_CAMERA)
    {
        // Go to previous view
        Toast.makeText(this, MSG, Toast.LENGTH_LONG).show()
        finish()
    }
    else
    {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            // If the camera permission is granted
            if (isCameraPermissionGranted())
            {
                // Show camera preview
                mCameraSource.start(surface_camera_preview.holder)
            }
            else
            {
                // Go to previous view
                Toast.makeText(this, MSG, Toast.LENGTH_LONG).show()
                finish()
            }
        }
        else
        {
            // Go to previous view
            Toast.makeText(this, MSG, Toast.LENGTH_LONG).show()
            finish()
        }
    }
}

private fun getBestPreviewSize(parameters: Camera.Parameters): Camera.Size?
{
    var bestSize: Camera.Size? = null
    val sizeList = parameters.supportedPictureSizes

    bestSize = sizeList[0]

    for (i in 1 until sizeList.size)
    {
        if (sizeList[i].width * sizeList[i].height > bestSize!!.width * bestSize.height)
        {
            bestSize = sizeList[i]
        }
    }

    return bestSize
}

}

android kotlin android-camera
1个回答
0
投票

请确保您在清单的顶部设置了这些权限:

<uses-permission android:name="android.permission.CAMERA" />

<uses-feature android:name="android.hardware.camera" />

如果不是这种情况,请将mCamera初始化为方法定义之外的实例变量。希望这会有所帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.