全志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","");}}}