家具网站建设案例/网站优化检测工具

家具网站建设案例,网站优化检测工具,阳泉做网站公司,想学图文广告哪里有教的一、问题背景 在开发基于Camera2 API的相机应用时,我们遇到了一个棘手的问题:预览功能在所有设备上工作正常,但在某特定安卓设备上点击拍照按钮后无任何响应。值得注意的是,使用旧版Camera API时该设备可以正常拍照。本文记录了完…

一、问题背景

在开发基于Camera2 API的相机应用时,我们遇到了一个棘手的问题:预览功能在所有设备上工作正常,但在某特定安卓设备上点击拍照按钮后无任何响应。值得注意的是,使用旧版Camera API时该设备可以正常拍照。本文记录了完整的排查过程和解决方案。

二、问题现象与初步分析

2.1 异常现象特征

  • 设备特定性:仅在某一品牌设备出现(其他手机/平板正常)
  • 错误静默:无崩溃日志,但捕获失败回调触发
  • 兼容性矛盾:旧版Camera API工作正常

2.2 初始日志定位

    // 提交拍照请求captureSession?.apply {stopRepeating()abortCaptures()capture(captureRequest.build(), object : CameraCaptureSession.CaptureCallback() {override fun onCaptureCompleted(session: CameraCaptureSession,request: CaptureRequest,result: TotalCaptureResult) {super.onCaptureCompleted(session, request, result)Log.e(TAG, "onCaptureCompleted!!!!")// 恢复预览}override fun onCaptureFailed(session: CameraCaptureSession,request: CaptureRequest,failure: CaptureFailure) {super.onCaptureFailed(session, request, failure)Log.e(TAG, "Capture failed with reason: ${failure.reason}")Log.e(TAG, "Failed frame number: ${failure.frameNumber}")Log.e(TAG, "Failure is sequence aborted: ${failure.sequenceId}")}}, null)} ?: Log.e(TAG, "Capture session is null")
} catch (e: CameraAccessException) {Log.e(TAG, "Camera access error: ${e.message}")
} catch (e: IllegalStateException) {Log.e(TAG, "Invalid session state: ${e.message}")
} catch (e: Exception) {Log.e(TAG, "Unexpected error: ${e.message}")
}

在onCaptureFailed回调中发现关键日志:

Capture failed with reason: 1 // ERROR_CAMERA_DEVICE

三、深度排查过程

3.1 对焦模式兼容性验证

通过CameraCharacteristics查询设备支持的自动对焦模式:

// 在初始化相机时检查支持的 AF 模式
val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val afModes = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES) ?: emptyArray()// 选择优先模式
val afMode = when {afModes.contains(CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE) -> CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTUREafModes.contains(CaptureRequest.CONTROL_AF_MODE_AUTO) -> CaptureRequest.CONTROL_AF_MODE_AUTOelse -> CaptureRequest.CONTROL_AF_MODE_OFF
}// 在拍照请求中设置
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, afMode)

调整代码逻辑后错误码变为:

Capture failed with reason: 0 // ERROR_CAMERA_REQUEST
Failed frame number: 1949

3.2 HAL层日志分析

通过ADB获取底层日志:

adb shell setprop persist.camera.hal.debug 3
adb shell logcat -b all -c
adb logcat -v threadtime > camera_log.txt

上述命令运行后,即可操作拍照,然后中断上述命令,调查camera_log.txt中对应时间点的日志。
找到关键错误信息

 V4L2 format conversion failed (res -1)
Pixel format conflict: BLOB(JPEG) & YV12 mixed
SW conversion not supported from current sensor format

3.3 输出格式兼容性验证

通过StreamConfigurationMap查询设备支持格式:

val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
val supportedFormats = configMap?.outputFormats?.toList() ?: emptyList()Log.d(TAG, "Supported formats: ${supportedFormats.joinToString()}")// 检查是否支持 NV21
if (!supportedFormats.contains(ImageFormat.NV21)) {Log.e(TAG, "NV21 is NOT supported on this device")
}

// 输出结果为 [256, 34, 35]
我使用python来做个转换,很舒适:

>>> hex(34)
'0x22'
>>> hex(35)
'0x23'
>>> hex(256)
'0x100'
>>>

格式解码对照表(请查ImageFormat.java源文件):

十进制十六进制Android格式
2560x100ImageFormat.PRIVATE
340x22ImageFormat.YV12
350x23ImageFormat.YUV_420_888

四、核心问题定位

4.1 格式转换失败原因

  1. 硬件限制:设备不支持YU12格式的软件转换
  2. 格式冲突:JPEG(BLOB)与YV12格式混合使用导致HAL层异常

4.2 YUV格式转换关键点

YUV_420_888与NV21格式对比:
冷知识:NV21是Camera API默认的格式;YUV_420_888是Camera2 API默认的格式。而且不能直接将 YUV 原始数据保存为 JPG,必须经过格式转换。

特征YUV_420_888NV21
平面排列半平面+全平面半平面
内存布局Y + U + V平面Y + VU交错
色度采样4:2:04:2:0
Android支持API 21+API 1+

五、解决方案实现

5.1 格式转换核心代码

  //  将 YUV_420_888 转换为 NV21 格式的字节数组private fun convertYUV420ToNV21(image: Image): ByteArray {val planes = image.planesval yBuffer = planes[0].bufferval uBuffer = planes[1].bufferval vBuffer = planes[2].bufferval ySize = yBuffer.remaining()val uSize = uBuffer.remaining()val vSize = vBuffer.remaining()val nv21 = ByteArray(ySize + uSize + vSize)yBuffer.get(nv21, 0, ySize)vBuffer.get(nv21, ySize, vSize)uBuffer.get(nv21, ySize + vSize, uSize)return nv21}/* 将 YUV_420_888 转换为 JPEG 字节数组 */private fun convertYUVtoJPEG(image: Image): ByteArray {val nv21Data = convertYUV420ToNV21(image)  val yuvImage = YuvImage(nv21Data,ImageFormat.NV21,image.width,image.height,null)// 将 JPEG 数据写入 ByteArrayOutputStreamval outputStream = ByteArrayOutputStream()yuvImage.compressToJpeg(Rect(0, 0, image.width, image.height),90,outputStream)return outputStream.toByteArray()}

5.2 保存系统相册示例:

   /* 保存到系统相册 */private fun saveToGallery(jpegBytes: ByteArray) {val contentValues = ContentValues().apply {put(MediaStore.Images.Media.DISPLAY_NAME, "IMG_${System.currentTimeMillis()}.jpg")put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)put(MediaStore.Images.Media.IS_PENDING, 1)  // Android 10+ 需要}}try {// 插入媒体库val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues) ?: throw IOException("Failed to create media store entry")contentResolver.openOutputStream(uri)?.use { os ->os.write(jpegBytes)os.flush()// 更新媒体库(Android 10+ 需要)if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {contentValues.clear()contentValues.put(MediaStore.Images.Media.IS_PENDING, 0)contentResolver.update(uri, contentValues, null, null)}runOnUiThread {Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show()// 触发媒体扫描(针对旧版本)sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri))}}} catch (e: Exception) {Log.e(TAG, "保存失败: ${e.message}")runOnUiThread {Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show()}}}

上述修改后,再次测试验证,这次是可以拍照成功的,并且相册中也会新增刚刚的照片。

六、最后的小经验

排错时别忘记:
设备兼容性检查清单

  • 输出格式支持性验证
  • 对焦模式白名单检查
  • 最大分辨率兼容测试
  • HAL层日志的输出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter旧版本如何下载

1.Jmeter最新版本下载位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter旧版本下载位置 https://archive.apache.org/dist/jmeter/binaries稳定版本:5.4.1

css-grid布局

文章目录 1、布局2、网格轨道3、间距Gap4、网格线5、网格别名 当一个 HTML 元素将 display 属性设置为 grid 或 inline-grid 后,它就变成了一个网格容器,这个元素的所有直系子元素将成为网格元素。 1、布局 启用grid布局类似与flex布局,不过g…

SolidWorks使用显卡教程

操作步骤: 打开注册表编辑器 按下键盘上的 Win R 组合键,输入 regedit 并按回车键,打开注册表编辑器。 导航到显卡信息路径 在注册表中依次展开以下路径: plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…

【C++11】左值引用、右值引用、移动语义和完美转发

🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 📌左值引用和右值引用 🎏左值和左值引用 🎏右值和右值引用 📌左值引用和右值引用比较 🎏左值引用 🎏右值…

【机密计算顶会解读】11:ACAI——使用 Arm 机密计算架构保护加速器执行

导读:本文介绍ACAI,其构建一个基于CCA的解决方案,使得机密虚拟机能够安全地使用加速器,同时保持与现有应用程序的兼容性和安全性,能够实现对加速器的安全访问。 原文链接:ACAI: Protecting Accelerator Ex…

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式(抽象类使用场景) 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法,需要声明,但是又不确定如何实现时&#xff…

深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)

原文链接:从零开始的DeepSeek微调训练实战(SFT) 微调参考示例:由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…

流畅如丝:利用requestAnimationFrame优化你的Web动画体验

requestAnimationFrame 是前端开发中用于优化动画性能的 API。它允许浏览器在下一次重绘之前执行指定的回调函数,通常用于实现平滑的动画效果。 1.作用 优化性能:requestAnimationFrame 会根据浏览器的刷新率(通常是 60Hz,即每秒…

【pytest框架源码分析五】pytest插件的注册流程

前文介绍到pytest整体是运用插件来实现其运行流程的。这里仔细介绍下具体过程。 首先进入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…

IoTDB日志提示Too many open files

问题 时序数据库 IoTDB 1.3.3 版本 IoTDB 执行查询操作失败,日志打印提示 Too many open files。通过命令查看打开文件数,结果如下: [root0002 DataReceiver]# lsof|grep 28347|wc -l DataNode 55444 [root0002 DataReceiver]# lsof|g…

prometheus 添加alertmanager添加dingtalk机器人告警

1、dingtalk创建机器人,目前我们采用加白名单的方式校验 2、定位到如下图 test结果如下

C 语 言 --- 操 作 符 2

C 语 言 --- 操 作 符 2 移 位 操 作 符定 义原 码 补 码 和 反 码左 移&#xff08;<<&#xff09;右 移&#xff08;>>&#xff09;算 术 右 移逻 辑 右 移 按 位 与、按 位 或、和 按 位 异 或按 位 与按 位 或按 位 异 或 逻 辑 反 操 作负 值 操 作按 位 取 反…

基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

零碳工厂能源管理系统的核心技术与应用实践

零碳工厂能源管理系统是一种高效的解决方案&#xff0c;旨在优化能源使用并减少碳排放&#xff0c;以帮助工厂实现低碳或零碳的生产目标。以下是该系统的详细构成和功能&#xff1a; 1. 核心组件 传感器和监测设备&#xff1a;用于实时监测工厂内的能源使用情况&#xff0c;包…

美摄接入DeepSeek等大模型,用多模态融合重构视频创作新边界!

今年以来&#xff0c;DeepSeek凭借其强大的深度推理分析能力&#xff0c;在AI领域掀起新的热潮。美摄科技快速响应市场需求&#xff0c;迅速接入以DeepSeek、通义千问、商汤、文心一言为代表的大模型&#xff0c;为企业视频创作生产带来全新体验。 传统视频创作面临着同质化、…

【yolo】yolo训练报错,以及解决方案

背景&#xff1a; 刚刚&#xff0c;写了《【yolo】yolo推理报错&#xff0c;以及解决方案》&#xff0c;马上训练就遇到类似的报错。 我对我标注的图像进行了300轮的训练&#xff0c;但是训练完300轮后&#xff0c;报错了。。。 报错信息 300 epochs completed in 0.085 hou…

理解线性动力学中的模态叠加法

线性动力学中的模态叠加方法 模态叠加法是线性动力学中一种有价值的工具&#xff0c;可以有效地确定频域或时域中的系统响应。对于某些类型的线性动力学分析&#xff0c;有必要使用此方法&#xff0c;因此了解该过程对于获得准确的结果至关重要。在本博客中&#xff0c;我们将…

报错 - redis - Unit redis.service could not be found.

报错&#xff1a; Unit redis.service could not be found.Could not connect to Redis at 127.0.0.1:6379: Connection refused解决方法&#xff1a; 检查状态、有必要的话 重新安装 Linux 上查看状态 systemctl status redis显示以下内容&#xff0c;代表正常服务 出现下面…

CMS网站模板定制设计与安全评估

内容概要 现代CMS&#xff08;内容管理系统&#xff09;作为网站建设的核心载体&#xff0c;其模板架构与安全防护体系的协同设计已成为企业数字化转型的关键环节。随着网络攻击向量日益复杂化&#xff0c;基于HTTPS协议的端到端加密部署不仅成为基础安全配置&#xff0c;更直…

【React】useEffect、useLayoutEffect底层机制

目录 useEffect不设置依赖设置空数组&#xff0c;无依赖设置多个依赖返回值是一个函数总结useEffect的使用环境useEffect 中发送请求错误示例用.then获取数据在useEffect创建一个函数 总结 useLayoutEffectuseLayoutEffect 和useEffect区别执行时机&#xff1a;浏览器渲染的关系…