Front Camera2 API GLSurfaceview

Posted

技术标签:

【中文标题】Front Camera2 API GLSurfaceview【英文标题】: 【发布时间】:2016-10-01 00:20:00 【问题描述】:

我正在尝试使用实际设备通过 Camera2 API 访问前置摄像头

尝试时出现问题

cameraManager.openCamera(..,..,..)

try 
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraID);
            if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) 
                throw new RuntimeException("Time out waiting to lock camera opening.");
            
            manager.openCamera(mCameraID, mStateCallback, mBackgroundHandler);
         catch (CameraAccessException e) 
            Log.e("mr", "OpenCamera - Camera Access Exception");
         catch (IllegalArgumentException e) 
            Log.e("mr", "OpenCamera - Illegal Argument Exception");
         catch (SecurityException e) 
            e.printStackTrace();
            Log.e("mr", "OpenCamera - Security Exception:");
         catch (InterruptedException e) 
            Log.e("mr", "OpenCamera - Interrupted Exception");
        

摄影师说

I/CameraManagerGlobal:连接到相机服务

来自这个CameraManager.java函数

private void connectCameraServiceLocked() 
            // Only reconnect if necessary
            if (mCameraService != null) return;

            Log.i(TAG, "Connecting to camera service");

然后我的 GLSurfaceView 仍然是空白

androidMainfest.xml

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

附注:

可与后置摄像头配合使用 它适用于 nexus 6 API 23 模拟器 Android M 在运行时请求权限 我正在使用 GLSurfaceView 作为取景器 前置摄像头在使用普通 CameraAPITextureView 的设备上完美运行 尝试卸载/重启/清除缓存 我使用的设备是 Sony Z5 高级版

我正在使用这个例子Render camera preview using OpenGL ES 2.0 on Android API 21 or higher

【问题讨论】:

明确一点:您将 Camera2 输出提供给 SurfaceTexture,然后使用 GLES 渲染外部纹理?您尝试过的事情列表看起来相当不错......如果确切的设置适用于后置摄像头,但不适用于前置摄像头,那么这有点奇怪。如果改变的只是相机选择常数,那么这限制了可能出错的事情的集合。为什么不只使用 TextureView?你在应用着色器吗? @fadden 我正在尝试将 Camera2 输出提供给 GLSurfaceView,我使用的是普通的 TextureView,它运行良好,但我需要绘制/截取屏幕截图,这就是我要迁移到 GLSurfaceView 的原因带着色器 【参考方案1】:

如果您只是复制该示例,我注意到它具有以下行:

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

前置摄像头可能不支持这一点,因为它可能没有闪光灯。您需要检查实际支持哪些 AE 模式 - 样本集的各种其他设置也是如此,它不检查设备实际支持的设置。

也就是说,如果值不正确,您应该会收到错误消息,但它可能会出现在 CameraCaptureSession.CaptureListener.onCaptureFailed 上,并且示例没有监听这些错误。如果您查看所有日志记录,而不仅仅是您自己的应用程序的日志,则可能还有来自相机服务的一些 logcat。

但是尝试删除该行,看看它是否有效。

【讨论】:

谢谢你的建议,是的,我相信这也是一个很好的提及。但它甚至没有达到那个功能。无论如何我都试图删除它,但它没有工作 请添加更多关于您在哪里看到第一个问题的详细信息,最好带有链接以完成启动 logcat 输出。【参考方案2】:

我已将 Sony Xperia Z5 高级版 更改为另一台设备,它运行良好。 正如我在以下链接中看到的那样,索尼似乎在使用新 API 时遇到了一些问题:

Sony Camera2 API limitations

可能有一个变通办法,但无论如何我正在为特定目的制作应用程序,我不希望它在所有设备上工作

【讨论】:

【参考方案3】:

先得到Camera这样的服务

CameraManager cameraManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);

【讨论】:

以上是关于Front Camera2 API GLSurfaceview的主要内容,如果未能解决你的问题,请参考以下文章

Android Camera API/Camera2 API 相机预览及滤镜贴纸等处理

Android 10(api 29)camera2 api回归与广角相机

Android Camera API/Camera2 API 相机预览及滤镜贴纸等处理

Android:如何检查设备是不是实现了 Camera2 api 功能?

只有一个带有 Camera2 和旧相机 API 的 APK

camera2 api 连拍