在 Camera2 API 中切换闪光灯

2023-12-08

我的问题是,当我在不同的 Flash 模式之间切换然后想要捕获图像时,我的 captureBuilder 不会设置所选的 Flash 模式。仅当我关闭并重新打开相机时它才有效。

我拿了https://github.com/googlesamples/android-Camera2Basic作为起点。

我的方法:

   private void captureStillPicture() {
  try {
     final Activity activity = (Activity) context;
     if (null == activity || null == mCameraDevice) {
        return;
     }
     // This is the CaptureRequest.Builder that we use to take a picture.
     CaptureRequest.Builder captureBuilder =
           mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
     captureBuilder.addTarget(mImageReader.getSurface());

     // Use the same AE and AF modes as the preview.
     captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
           CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
     setCurrentFlash(captureBuilder);

     // Orientation
     int rotation = activity.getWindowManager()
           .getDefaultDisplay()
           .getRotation();
     captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));

     CameraCaptureSession.CaptureCallback captureCallback =
           new CameraCaptureSession.CaptureCallback() {

              @Override
              public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                    @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                 super.onCaptureCompleted(session, request, result);
                 Toast.makeText(context, "image captured", Toast.LENGTH_SHORT)
                       .show();
                 unlockFocus();
              }
           };

              mCaptureSession.stopRepeating();
     mCaptureSession.capture(captureBuilder.build(), captureCallback, null);
  } catch (CameraAccessException e) {
     Log.e(this.getClass()
           .getSimpleName(), e.getMessage(), e);
  }

这是 setCurrentFlash 方法:

   private void setCurrentFlash(CaptureRequest.Builder requestBuilder) {
  if (mFlashSupported) {
     switch (flashMode.name()) {
        case FLASH_AUTO:
           requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                 CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
           break;
        case FLASH_ON:
           requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                 CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
           break;
        case FLASH_OFF:
           requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
           break;
        default:
           requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                 CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
           break;
     }
  }

有什么想法为什么构建者在捕获之前没有正确设置闪光灯吗?

***** EDIT *****

像 Eddy Talvala 建议的那样,通过在调用 runPrecaptureSequence() 时将 flash 设置为 PreviewRequestBuilder 解决了问题

   private void runPrecaptureSequence() {
  try {
     // This is how to tell the camera to trigger.
     setCurrentFlash(previewRequestBuilder);
     previewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
           CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
     // Tell #mCaptureCallback to wait for the precapture sequence to be set.
     state = STATE_WAITING_PRECAPTURE;
     captureSession.capture(previewRequestBuilder.build(), mCaptureCallback, backgroundHandler);
  } catch (CameraAccessException e) {
     e.printStackTrace();
  }

您还想在预览请求中更新 Flash 模式;通常,当您触发预捕获序列(使用 AE_PRECAPTURE_TRIGGER)时,相机设备想知道您所需的闪光模式,以便它知道是否应该打开预捕获闪光灯,从而确定最终的闪光功率。

通常的事件顺序是:

  1. 将预览闪光模式设置为所需模式
  2. 等待用户按下快门按钮
  3. 发出带有预捕获触发器集的单个预览请求(但否则保持重复预览请求)。
  4. 等待 AE_STATE_PRECAPTURE 停止成为捕获结果中的 AE 状态
  5. 发出最终的捕获请求(保持相同的闪光模式)
  6. 在 ImageReader 中获取最终 JPEG

(这忽略了确保焦点良好,这通常是在开始预捕获序列之前/并行完成的)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Camera2 API 中切换闪光灯 的相关文章

  • 计算Android设备的PPI

    如何计算 Android 设备的 PPI 最特别的是 Android 平板电脑 请注意 我想计算设备的 PPI 而不是 DPI 就像一二三一样简单 让我们来计算一下PPI to Nexus 5 例如 float LCD Diagonal 4
  • 使用 google Directions API 的地图视图绘制方向 - 解码折线

    我正在尝试使用 Google 方向 API 在我的地图视图上显示方向 但我在从 JSON 响应获取数据时遇到困难 我可以获得 级别 和 点 字符串 但无法弄清楚如何将它们解码为地图上的点 任何帮助将非常感激 我有一个类可以为您解码它们 添加
  • Android:使用 OAuth 访问 google 任务时出现问题

    由于 google 任务没有公共 api 我想编写解决方法并像浏览器一样请求数据 然后解析结果以进一步显示 为了访问数据 我使用 google 实现了 OAuth 身份验证来访问此 url https mail google com htt
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Android 上的 SVG 支持

    Android 支持 SVG 吗 有什么例子吗 最完整的答案是这样的 Android 2 x 默认浏览器本身不支持 SVG Android 3 默认浏览器支持 SVG 要将 SVG 支持添加到 2 x 版本的平台 您有两个基本选择 安装功能
  • 从 Android 代码设置的 SECRET_CODE

    我知道如何使用清单文件中的秘密代码 它与此源代码配合良好
  • 使用 ADB 命令获取 IMEI 号码 Android 12

    对于 11 之前的 Android 版本 我使用以下命令从我的设备获取 IMEI 号码 adb shell service call iphonesubinfo 4 cut c 52 66 tr d space or adb shell s
  • 播放 SoundCloud 曲目

    我可以在 Android 应用程序中播放 SoundCloud 中的曲目吗 我正在尝试这段代码 但它不起作用 String res https api soundcloud com tracks 84973999 stream client
  • 调试:在 Android 1.0 中找不到文件

    今天我更新到 Android Studio v 1 0 在尝试编译任何项目时出现以下错误 app build intermediates classes debug 找不到文件 问题是在更新之前我没有任何问题 这是我实际尝试编译的代码 构建
  • 调整浮动操作按钮的图标大小(fab)

    The new floating action button should be 56dp x 56dp and the icon inside it should be 24dp x 24dp So the space between i
  • 如何在android中设置权限WRITE_SECURE_SETTINGS? [复制]

    这个问题在这里已经有答案了 我正在尝试启用 4 0 以上的辅助功能服务设置 但它显示异常 即 引起原因 java lang SecurityException 权限拒绝 写入安全设置需要 android permission WRITE S
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 使用 PhoneGap 使 Android 应用程序易于访问(对于残障人士)

    有人有过使用 PhoneGap 使 Android 应用程序可访问的经验吗 至少我们需要使我们的应用程序符合第 508 条规定 我尝试实现一些标准的辅助功能 文本框标签 向 div 添加标题属性等 但是 当在 Android 中使用 Tal
  • Android:滚动 Horizo​​ntalScrollView 时如何禁用 ScrollView 的垂直滚动?

    我正在开发一个带有带有 ScrollView 的 Activity 的 Android 应用程序 其中包含 Horizo ntalScrollView 等内容 当我触摸 Horizo ntalScrollView 时 我想禁用外部 Scro
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • 如何在android asynctask中使用inputstream作为参数?

    我正在制作一个 Android 应用程序来跟踪股票详细信息 我将通过 csv 雅虎财经 检索数据 据我所知 在android 4 0中 网络连接无法在主线程上完成 因此 我将使用 asynctask 来建立连接 但是 我在参数方面遇到了一些
  • Android:AsyncTask ProgressDialog 将不会在 ActivityGroup 中打开

    我试图在轮询我的服务器时打开一个进度对话框 该类是一个 ActivityGroup 因为它嵌套在选项卡栏中 为了将视图保持在框架内 需要 ActivityGroup 这是我的 ActivityGroup 类的声明 public class
  • Android 中循环事件的星期几和时间选择器

    我想创建一个控件 允许用户在我的 Android 活动中选择一周中的某一天 星期一 和一天中的某个时间 下午 1 00 找不到任何关于此的好帖子 好吧 我想我已经明白了 我只是不喜欢这个解决方案 因为我在一周中的某一天使用的微调器与时间选择
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • 获取其他指针的MotionEvent.getRawX/getRawY

    我可以获取其他指针的MotionEvent getRawX getRawY 值吗 MotionEvent getRawX API 参考 http developer android com reference android view Mo

随机推荐

  • node.js - 使用归档器归档文件夹生成一个空 zip

    我正在尝试使用以下方式存档文件夹archiver 我想要存档的文件夹的路径如下所示 Project app js tmp folderToArchive file1 txt file2 txt file3 txt 我的服务器端代码将生成 z
  • 在 Android 中读取 Zip 存档中的文件并将其内容放入字符串中

    这是我的第一个问题 尽管我已经使用了 Stack Overflow 上的很多技巧 但对于这种情况我还没有找到解决办法 情况是这样的 我有一个压缩文件 我想读取一个特定的文件并将其内容放入一个 String 变量中 该变量将被返回并放入 An
  • 用于检查属性是否存在的简写函数[重复]

    这个问题在这里已经有答案了 你们能帮我制作一个速记函数来确定对象属性是否存在吗 在 99 的情况下 我想用它来检查返回的 json 对象是否包含指定的属性 请注意 不保证必须定义任何父属性甚至 json 对象本身 我是这样想的 functi
  • 模型衍生 API 响应未通过 Jackson 映射

    是否对模型派生 API 的响应对象进行了更新 因为我们在将 3D 模型请求的响应映射回清单和元数据对象时遇到问题 两人都抛出了杰克逊的错误 GetManifest 返回未处理的角色枚举 GetMetadataForGuid 抛出 非法字符
  • 根据邮政编码确定 USPS 邮政区域的公式

    我希望能够更轻松地按 USPS 邮区对数百个信封进行分类 困难在于必须根据原始邮政编码对美国 8 个区域中的每一个区域进行手动排序 91352 http postcalc usps gov ZoneCharts 我有一个包含 ZIP 列的联
  • 对 ? 的行为感到困惑。操作员

    这是我的代码 class Address public bool IsAppartment get set class Employee public string Name get set public Address Address g
  • 关闭选项卡前确认框

    我希望当用户尝试关闭窗口时有一个确认框 window onbeforeunload function evt var message Are you sure you want to leave cause there are some u
  • HTML5 输入模式中的正则表达式无效

    我需要在 HTML 输入中使用这个正则表达式 取自以逗号或逗号和空格分隔的项目列表的正则表达式 s s 所以我将其设置为输入
  • 如何触发 Chrome 扩展按钮的点击?

    我正在建立一个自动化测试套件使用 Selenium Web 驱动程序 在某个时刻 我必须通过以下方式测试页面的工作方式 Chrome 扩展程序打开或关闭 可以将其想象为您想要单击 Adblock 扩展 然后单击对此站点的禁用 然后 再次打开
  • g++ -fdump-class-hierarchy 输出中的第一个 (int (*)(...))0 vtable 条目是什么?

    对于这段代码 class B1 public virtual void f1 class D public B1 public void f1 int main B1 b1 new B1 D d new D return 0 编译后 我得到
  • 使用 CloudWatch Metric Filter 报告内存消耗百分比

    我们广泛使用 AWS Lambda 作为我们基础设施的一部分 为了获得更好的可见性 我希望能够报告一个自定义的 CloudWatch 指标 其值为内存已使用 内存分配 这可以使用 CloudWatch 日志和指标过滤器来实现 考虑以下日志消
  • 当我调用代码格式化程序时,如何避免扩展折叠区域?

    如您所知 Delphi 2010 具有内置代码格式化功能 但是 格式化会展开所有折叠的代码块 有什么想法如何修复它吗 这个 功能 对我来说特别烦人 当我找不到任何关于这个问题的提及时 我真的很惊讶 我尝试过的 寻找替代方案 例如 GExpe
  • 检查所有复选框 Jquery

    我使用此代码来检查树视图中的复选框 HTML div ul li li ul div
  • 如何从Around Advise获取调用者方法信息

    ThisJoinPoint只能获取当前方法信息 反正要获取调用者方法信息 您可以尝试特殊变量thisEnclosingJoinPointStaticPart它保存封闭 JoinPoint 的静态部分 提及here 示例 和here docs
  • 如果更改索引中使用的字段,mongodb 是否会重新索引?

    假设您有一个带有名为 primary key 字段的集合 primary key 1234 name jimmy lastname page 我有一个关于 primary key 的索引 这个集合有数百万行 我想看看更改其中一条记录的pri
  • 如何以编程方式设置文件标签

    当使用 Windows 资源管理器查看文件时 我可以选择设置 标签 类别 或其他属性 对于 JPEG 可以选择一组不同的属性 包括 标签 我希望能够以编程方式设置这些 如何使用 Delphi 以编程方式设置文件标记和其他文件属性 我有 De
  • 如何在 Jupyter 笔记本上从 * .IPYNB 文件执行 * .PY 文件?

    我正在开发一个 Python Notebook 我想要这样大输入代码 输入 打包成 PY 文件并从笔记本中调用该文件 运行 的动作我知道笔记本中的 PY 文件 并且命令在 Linux 或 Windows 之间有所不同 但是 当我执行此操作并
  • 如何移出 IntelliJ IDEA 中自动完成的括号(不使用箭头键)?

    我最近从 Eclipse 切换到 IntelliJ IDEA 并发现自己想知道如何将光标移出一对自动完成的括号 在 Eclipse 中 当我输入完一对括号后 按 Tab 键将使我退出括号 不使用箭头键如何做同样的事情 非常感谢您的帮助 ID
  • 使用 htaccess 创建 SEO 友好的 url

    我正在尝试重写网站的 url 我应该提到的是 index php 现在的工作方式是获取 p 页面 参数并包含适当的文件 所以请求一个页面是这样的 www domain com index php p home www domain com
  • 在 Camera2 API 中切换闪光灯

    我的问题是 当我在不同的 Flash 模式之间切换然后想要捕获图像时 我的 captureBuilder 不会设置所选的 Flash 模式 仅当我关闭并重新打开相机时它才有效 我拿了https github com googlesample