当前位置: 首页 > news >正文

全志A33安卓6.0添加支持usb摄像头动态热插拔

安卓6.0中使用usb摄像头,发现当系统启动完成后再接入usb摄像头,此种情况下,无法使用系统相机进行预览,只有接入usb摄像头后再启动整机才可以使用系统相机进行预览,于是把修改过程保留

diff --git a/android/frameworks/av/services/camera/libcameraservice/CameraService.cpp b/android/frameworks/av/services/camera/libcameraservice/CameraService.cpp
index 7c4594fa4b..8901ebe55a 100644
--- a/android/frameworks/av/services/camera/libcameraservice/CameraService.cpp
+++ b/android/frameworks/av/services/camera/libcameraservice/CameraService.cpp
@@ -413,10 +413,24 @@ int32_t CameraService::getNumberOfCameras() {int32_t CameraService::getNumberOfCameras(int type) {ATRACE_CALL();
+    bool hasFirstRef = false;
+    char value[PROPERTY_VALUE_MAX];switch (type) {case CAMERA_TYPE_BACKWARD_COMPATIBLE:
+           ALOGD("getNumberOfCamerasgetNumberOfCameras CAMERA_TYPE_BACKWARD_COMPATIBLE=%d",mNumberOfNormalCameras);
+           if(0 == mNumberOfNormalCameras) {
+                ALOGE("No camera be found ! check again...");
+                onFirstRef();
+                hasFirstRef = true;
+            }
+           property_get("persist.sys.usbcamera.status", value, "");
+           if( (strcmp(value, "add") == 0) || (strcmp(value, "remove") == 0) ) {
+               ALOGD("update camera for usb action");
+               if(!hasFirstRef) onFirstRef();
+           }return mNumberOfNormalCameras;case CAMERA_TYPE_ALL:
+           ALOGD("getNumberOfCamerasgetNumberOfCameras CAMERA_TYPE_ALL");return mNumberOfCameras;default:ALOGW("%s: Unknown camera type %d, returning 0",
diff --git a/android/frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java b/android/frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java
index 965341e418..6db85c6212 100644
--- a/android/frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/android/frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -33,6 +33,8 @@ import java.io.FileDescriptor;import java.io.PrintWriter;import java.util.ArrayList;import java.util.HashMap;
+import android.os.SystemClock;
+import android.os.SystemProperties;/*** UsbHostManager manages USB state in host mode.
@@ -62,6 +64,9 @@ public class UsbHostManager {@GuardedBy("mLock")private UsbSettingsManager mCurrentSettings;
+    private long mLastUsbEvent = 0;
+    private String mLastUsbAction = "";
+public UsbHostManager(Context context, UsbAlsaManager alsaManager) {mContext = context;
@@ -224,6 +229,7 @@ public class UsbHostManager {Slog.d(TAG, "Added device " + mNewDevice);getCurrentSettings().deviceAttached(mNewDevice);mUsbAlsaManager.usbDeviceAdded(mNewDevice);
+               checkUsbCameraStatus(mNewDevice, true);} else {Slog.e(TAG, "mNewDevice is null in endUsbDeviceAdded");}
@@ -243,6 +249,36 @@ public class UsbHostManager {if (device != null) {mUsbAlsaManager.usbDeviceRemoved(device);getCurrentSettings().deviceDetached(device);
+               checkUsbCameraStatus(device, false);
+            }
+        }
+    }
+
+    private void checkUsbCameraStatus(UsbDevice device, boolean added) {
+        if (device != null) {
+            String devicename = device.getDeviceName();
+            String productname = device.getProductName();
+            if ((devicename != null && devicename.toLowerCase().contains("cam")) ||
+                   (productname != null && productname.toLowerCase().contains("cam")) ) {
+                try {
+                    if (mLastUsbAction != null && mLastUsbAction.equals(added? "add" : "remove") && SystemClock.uptimeMillis() - mLastUsbEvent < 1200) {
+                        Slog.i(TAG, "USB HOST EVENT send double, ignore this!");
+                        return;
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                mLastUsbAction = added? "add" : "remove";
+                mLastUsbEvent = SystemClock.uptimeMillis();
+               if (!added){
+                   Slog.d(TAG,"usb camera removed");
+                   SystemProperties.set("persist.sys.usbcamera.status","remove");
+               } else {
+                   Slog.d(TAG,"usb camera added");
+                   SystemProperties.set("persist.sys.usbcamera.status","add");
+               }
+                int num = android.hardware.Camera.getNumberOfCameras();
+               SystemProperties.set("persist.sys.usbcamera.status","");}}}

相关文章:

  • 【Docker 04】image - 镜像
  • 单片机中面向对象的思维
  • 从零开始学Python(2)——流程控制语句和五种容器
  • 《射频识别(RFID)原理与应用》期末复习 RFID第四章 数据校验和防碰撞算法(知识点总结+习题巩固)
  • js判断手机操作系统(ios、安卓、华为)
  • FastDFS分布式存储
  • web3 资讯网址
  • Web 架构之 Kubernetes 弹性伸缩策略设计
  • 如何将 iPhone 中的短信导出为 PDF
  • C/C++ 面试复习笔记(6)
  • 一[3]、ubuntu18.04环境 利用 yolov8 训练开源列车数据集,并实现列车轨道检测
  • Java基于SpringBoot的牙科诊所管理系统,附源码+文档说明
  • Springboot实现Java程序和线程池的优雅关闭
  • 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 1. 摄像机几何
  • Oracle DG库手动注册归档日志的两种方法
  • 【报错解决】RTX4090 nvrtc: error: invalid value for --gpu-architecture (-arch)
  • Android 手机操作系统的14个常见问题以及解决办法
  • PostgreSQL认证怎么选?PGCP中级认证、PGCM高级认证
  • Git 常用总结
  • 【Net】TCP/IP 协议
  • b2b网站做排名是什么意思/外贸推广具体是做什么
  • 4435建站/web网站设计
  • 购物网站建设网站/sem搜索引擎
  • 私密浏览器免费版的优缺点/seo薪酬如何
  • 建设局网站施工合同范本/怎么查询搜索关键词
  • 免费网站建设品牌/广州关键词seo