Android 7中的Camera Preview黑色

时间:2016-12-11 21:20:47

标签: android camera preview

我正在使用直接前进Camera API,以实现向后兼容性。相机视图本身被imageview略微覆盖,我的surfaceChanged会这样做:

camera.setPreviewCallback((data, arg1) -> LiveView.this.invalidate());
camera.setPreviewDisplay(mHolder);
camera.startPreview();

适用于所有旧设备。我将预览大小设置为surfaceCreated中较早的最大可用大小。 然而,在Android 7.1上,它突然变黑(在Nexus 6和Moto X Play上,可能是其他的 - 所以在不同的设备上)。 SurfaceView本身在Layout InspectorwillNotDraw = true)中显示为灰色,但VISIBLE(和硬件加速)。 奇怪的是,我仍然能够拍摄照片,没有预览的事件,预览回调中的数据包含图像。

同时我得到以下日志

E/mm-camera: mct_pipeline_send_ctrl_events: Send Set Parm events
E/QCamera2HWI: static void* qcamera::QCameraCbNotifier::cbNotifyRoutine(void*) : cb message type 32768 not enabled!
E/QCamera2HWI: static void* qcamera::QCameraCbNotifier::cbNotifyRoutine(void*) : cb message type 32768 not enabled!
D/QCameraParameters: setSnapshotSkipHint: preview hint 3 fps 15.019738

还有其他人在Android 7中遇到过完全黑的图像吗?有没有简单的修复方法? (比如直接绘制数据内容?)

4 个答案:

答案 0 :(得分:3)

由于您在Android 7设备上没有相机权限,因此出现黑屏

转到设置 - > apps->选择您的应用 - >权限 - >启用相机权限并检查

您也可以在代码中处理此问题

向您的清单添加以下权限

            Value  1s_for_the_last_5days
date                                    
2016-01-01      0                      0
2016-01-02      1                      1
2016-01-03      1                      2
2016-01-04      0                      2
2016-01-05      1                      3
2016-01-06      1                      4
2016-01-08      1                      5

要获得许可,您可以这样打电话。

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

检查访问相机的权限

ActivityCompat.requestPermissions(this,
                   new String[]{Manifest.permission.CAMERA},
                   MY_PERMISSIONS_REQUEST_CAMERA);

如果用户已执行任何操作,现在进行回调。

if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {
}

这是完整的例子

@Override
public void onRequestPermissionsResult(int requestCode,
                                   String permissions[], int[] grantResults) {
switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_CAMERA: {
        Log.i("Camera", "G : " + grantResults[0]);
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, yay! Do the
            // contacts-related task you need to do.

            openCamera();

        } else {

            // permission denied, boo! Disable the
            // functionality that depends on this permission.

            if (ActivityCompat.shouldShowRequestPermissionRationale
                            (this, Manifest.permission.CAMERA)) {

                showAlert();

            } else {

            }
        }
        return;
    }

    // other 'case' lines to check for other
    // permissions this app might request

}
}

答案 1 :(得分:0)

就像@apk之前说的那样,黑屏正在出现,因为你没有处理代码中的权限。如果您正在使用targetSdkVersion 23(及更高版本),则必须在运行时向用户请求权限。

之前的评论向您解释如何直接通过SDK的操作解决问题,但我更喜欢在这些情况下使用优秀的第三方库:Karumi/Dexter

答案 2 :(得分:0)

检查Android运行时摄像头权限

如果不允许,相机将显示空白屏幕。

了解更多详情:

https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

答案 3 :(得分:0)

我遇到了这个问题,并在相机上快速修复,并将此代码添加到cameraPreview 只需在 startPreview()之前添加 camera.stopPreview()

public void surfaceCreated(SurfaceHolder surfaceHolder) {
    try {
        this.mCamera.stopPreview();
        this.mCamera.setPreviewDisplay(surfaceHolder);
        this.mCamera.startPreview();
    } catch (IOException unused) {
        Log.d("camera", "Error setting camera preview: " + unused.getMessage());
    }
}