问题标签 [android-textureview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
47 浏览

android - 如何在 android 的 TextureView 上显示 SurfaceTextures

我正在尝试查看SurfaceTexturesTextureView我正在SurfaceTextures从回调中获取

上面的代码片段仅显示第一个纹理,然后textureView冻结(如下图所示)

在此处输入图像描述

应用程序处于冻结状态时的一些日志附在此处

我想知道SurfaceTexture在android中查看是否正确,如果是的话,上面的代码有什么问题,

我对这个android领域很安静,一起度过了一天,任何与这个问题相关的帮助或线索对我来说都是很大的帮助

0 投票
1 回答
443 浏览

android - 如何将 cameraX 与 SurfaceView/TextureView 一起使用?

我打算将相机 api 迁移到 camerax。目前我正在使用 SurfaceView 来显示相机预览。我注意到 camerax 正在使用 PreviewView 来显示相机预览。由于这个库仍处于 alpha 阶段,那么替代方案是什么?

我知道 previewView 在内部使用 SurfaceView/TextureView。

如何显式配置和使用 SurfaceView/TextureView?

0 投票
1 回答
32 浏览

android - Camera2:SurfaceTexture 缓冲区大小被覆盖

我正在使用 Camera2 API 编写一个应用程序,它应该显示来自相机的预览并拍照。目前我的代码工作如下:

  1. 当Camera Fragment被实例化时,等待TextureView.SurfaceTextureListener.onSurfaceTextureAvailable被调用
  2. 在 ViewModel 中从 CameraCharacteristics 获取可用且合适的图片和预览大小,并使用 LiveData 将找到的预览大小发送到 Fragment
  3. Fragment 观察预览大小 LiveData 并setDefaultBufferSize为其TextureView's调用新大小SurfaceTexture
  4. 设置新尺寸后,创建捕获会话,并设置重复预览请求,因此TextureView开始显示来自相机的图像
  5. 为了避免干扰其他相机应用程序的工作,所有与相机相关的东西都在 Fragment 之后被清除,onPause并且在之后再次执行步骤 1-4onResume
  6. Surface实例在 Fragment 和相机逻辑类之间共享:共享变量在其中初始化,并在调用TextureView.SurfaceTextureListener.onSurfaceTextureAvailable时设置为 nullTextureView.SurfaceTextureListener.onSurfaceTextureDestroyed

这适用于一些流行品牌的现代 Android 版本的设备,但该应用程序应该可以在具有 Android 6 (“ ”)的特定通用中国平板电脑上CameraManager: Using legacy camera HAL运行,我遇到了一个问题。

  • 当相机实例化并开始预览时,我看到预览尺寸为 640x480(因此图像被拉伸),但是,传递给的尺寸setDefaultBufferSize为 1280x720
  • Logcat 也充满了连续的Surface::setBuffersUserDimensions(this=0x7f55fb5200,w=640,h=480)消息
  • 我在 SO 上发现,在某些配备 Android 5 的三星设备上,Camera2 可能无法真正使用某些分辨率,但是当我关闭应用程序并再次打开它时,预览分辨率为 1280x720
  • 所以我的猜测是我可能setDefaultBufferSize在第一次设置相机片段时调用得太早,并且只有在应用程序最小化后重新创建视图时,才会“拾取”所需的分辨率
  • 我还尝试调用setDefaultBufferSize传递给的 lambda TextureView.post它解决了问题,除了我应该请求用户对相机片段的权限(即当用户第一次打开相机时),所以片段被暂停了几次显示权限弹出窗口。但是,在主线程中也调用了 without ,所以我猜这是这里的游戏规则改变TextureView.post setDefaultBufferSize者造成的延迟TextureView.post
  • 同样在setDefaultBufferSize文档中我看到:新的默认缓冲区大小将在图像生产者下一次请求填充缓冲区时生效。对于 Canvas,这将是下一次 Surface.lockCanvas 被调用。对于 OpenGL ES,应该销毁 EGLSurface(通过 eglDestroySurface),使其变为非当前(通过 eglMakeCurrent),然后重新创建(通过 eglCreateWindowSurface)以确保新的默认大小已经生效。在我看来,这可能与案件有关