private void createCameraPreview() { try { SurfaceHolder holder = previewView.getHolder(); holder.setFixedSize(size.getWidth(), size.getHeight()); holder.setKeepScreenOn(true); final Surface surface = holder.getSurface(); captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(surface); cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { public void onConfigured(CameraCaptureSession session) { try { CaptureRequest captureRequest = captureRequestBuilder.build(); session.setRepeatingRequest(captureRequest, null, null); }catch (CameraAccessException e) { e.printStackTrace(); } } public void onConfigureFailed(CameraCaptureSession session) { Toast.makeText(Diary.this, "Failed to configure camera", Toast.LENGTH_SHORT).show(); } }, null); }catch (CameraAccessException e) { e.printStackTrace(); } }
时间: 2023-12-26 18:05:56 浏览: 131
这段代码是用来创建相机预览的,首先通过SurfaceHolder获取Surface,并设置Surface的大小和保持屏幕常亮。然后通过CameraDevice创建一个CaptureRequestBuilder对象,用CameraDevice.TEMPLATE_PREVIEW模板创建一个捕获请求,并将Surface作为目标添加到该请求中。接着使用CameraDevice.createCaptureSession()方法创建一个相机捕获会话,将Surface作为输出目标传递给该方法。在会话创建完成后,通过会话设置一个重复请求,即不断捕获相机预览画面并显示在Surface上。如果出现CameraAccessException异常,会打印错误信息。如果会话配置失败,则会显示一个Toast提示。
相关问题
SurfaceView surfaceView = blankFragment.surfaceView; mSurfaceHolder = surfaceView.getHolder();以上代码出现 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.SurfaceHolder android.view.SurfaceView.getHolder()' on a null object reference的报错
这个错误通常会出现在 `SurfaceView` 还没有被正确地初始化之前就尝试访问它的 `getHolder()` 方法。可能是因为你在 `Fragment` 中的视图还没有被创建,或者你的视图中没有包含正确的 `SurfaceView`。
在你的代码中,你可以尝试在 `surfaceView` 上调用 `getHolder()` 方法之前检查 `surfaceView` 是否为 `null`。例如:
```
if (surfaceView != null) {
mSurfaceHolder = surfaceView.getHolder();
}
```
如果 `surfaceView` 仍然为 `null`,那么可能是因为你的视图还没有被正确地初始化。在这种情况下,你需要确保你正确地调用了 `setContentView()` 或者在 `onCreateView()` 方法中正确地返回了视图。
另外,还有可能是因为你的布局文件中没有包含正确的 `SurfaceView`。请确保你在布局文件中使用了 `<SurfaceView>` 标签,并且将其设置为你想要显示的样式和属性。
如果你仍然无法解决这个问题,请提供更多的代码和错误信息,以便更好地诊断问题。
翻译并解释下面代码的功能package com.example.application; import android.graphics.Canvas; import android.view.SurfaceHolder; public class UpdateThread extends Thread { private long time; private final int fps = 20; private boolean toRun = false; private MovementView movementView; private SurfaceHolder surfaceHolder; public UpdateThread(MovementView rMovementView) { movementView = rMovementView; surfaceHolder = movementView.getHolder(); } public void setRunning(boolean run) { toRun = run; } public void run() { Canvas c; while (toRun) { long cTime = System.currentTimeMillis(); if ((cTime - time) <= (1000 / fps)) { c = null; try { c = surfaceHolder.lockCanvas(null); movementView.updatePhysics(); movementView.onDraw(c); } finally { if (c != null) { surfaceHolder.unlockCanvasAndPost(c); } } } time = cTime; } }}
这段代码定义了一个名为 UpdateThread 的类,它继承了 Thread 类。该类的主要作用是在一个 SurfaceView 上更新物理效果和绘制图像。
UpdateThread 类有以下变量:
- time: 上一次更新画面的时间戳
- fps: 帧率,即每秒钟绘制多少次画面
- toRun: 用于控制线程是否运行的标志位
- movementView: SurfaceView 的实例
- surfaceHolder: 用于管理 SurfaceView 的 SurfaceHolder 实例
UpdateThread 类有以下方法:
- UpdateThread(): 构造函数,接收一个 MovementView 实例并将其赋值给 movementView 变量,同时获取 SurfaceHolder 实例并将其赋值给 surfaceHolder 变量。
- setRunning(boolean run): 设置 toRun 变量的值,用于控制线程的运行状态。
- run(): 重写了 Thread 类的 run() 方法。在该方法中,通过一个 while 循环不断更新画面。在每次循环中,计算当前时间戳与上一次更新时间戳的差值,如果小于等于每帧的时间间隔(即 1000 / fps),则获取 Canvas 实例,调用 movementView 的 updatePhysics() 方法更新物理效果,再调用 movementView 的 onDraw(Canvas c) 方法绘制图像。最后,释放 Canvas 实例并更新时间戳。如果 toRun 变量的值为 false,则跳出循环,线程结束。
总的来说,这段代码实现了一个在 SurfaceView 上更新物理效果和绘制图像的线程,并控制线程的运行状态。
阅读全文