过程
开整之前,按习惯去 FAQ 上一顿搜索,都是些低版本的改动记录,后来得知高版本对 USB Camera这块的支持太少了。
FAQ 上淘到一个6.0的改动方法,照着试了试发现不行呃。后来经过一番搜索后,找到 MTK USB CMAERA 调试记录,按照这哥们的修改可行。编译后重新烧写,插入USB摄像头执行ls -l /dev/v*,
发现了 /dev/video0 设备,那么第一步算是走通了。
alps\kernel-4.9\arch\arm64\configs\k62v1_64_bsp_debug_defconfig
alps\kernel-4.9\arch\arm64\configs\k62v1_64_bsp_defconfig
# CONFIG_RD_LZ4 is not set CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_VIDEO_DEV=y CONFIG_VIDEO_V4L2=y CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_MEMOPS=y CONFIG_VIDEOBUF2_VMALLOC=y CONFIG_MEDIA_USB_SUPPORT=y CONFIG_USB_VIDEO_CLASS=y CONFIG_USB_MTK_OTG=y CONFIG_USB_MTK_HDRC=y CONFIG_USB_MTK_HDRC_HCD=y
打开 MTK UVC_SUPPORT 相关宏控制后,将编译对应的usb驱动文件
alps\kernel-4.9\drivers\media\usb\Makefile
能成功发现设备节点后,下载 https://github.com/jiangdongguo/AndroidUSBCamera 工程源码在 AS 中搞起来,
github 上的由于依赖库地址变动不能成功编译,后来经过排错后成功运行了。也可以下载我修改好后的。
AndroidUSBCamera-master.zip
成功运行起来后,我就遇到了USB权限问题
11:42:25.572 5580-5620/com.jiangdg.usbcamera D/Debug: onConnectDev: 11:42:25.573 5580-5622/com.jiangdg.usbcamera V/UVCCameraTextureView: RenderThread#setEncoder:encoder=null 11:42:25.586 5580-5621/com.jiangdg.usbcamera E/UsbManager: exception in UsbManager.openDevice java.lang.SecurityException: User has not given 1000/com.jiangdg.usbcamera permission to access device /dev/bus/usb/001/004 at android.os.Parcel.createException(Parcel.java:2071) at android.os.Parcel.readException(Parcel.java:2039) at android.os.Parcel.readException(Parcel.java:1987) at android.hardware.usb.IUsbManager$Stub$Proxy.openDevice(IUsbManager.java:739) at android.hardware.usb.UsbManager.openDevice(UsbManager.java:445) at com.serenegiant.usb.USBMonitor$UsbControlBlock.<init>(USBMonitor.java:1088) at com.serenegiant.usb.USBMonitor$UsbControlBlock.clone(USBMonitor.java:1111)
按理来说应该要弹框提示是否允许USB权限的,但我这里没弹出而且报了上面的错,后来直接把 framwork 下的权限检查给屏蔽了。
frameworks/base/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java
public void checkPermission(UsbDevice device, String packageName, int uid) { if (!hasPermission(device, packageName, uid)) { //throw new SecurityException("User has not given " + uid + "/" + packageName //+ " permission to access device " + device.getDeviceName()); } } public void checkPermission(UsbAccessory accessory, int uid) { if (!hasPermission(accessory, uid)) { //throw new SecurityException("User has not given " + uid + " permission to accessory " // + accessory); } }
这样用 demo 代码就能正常打开 USB 摄像头预览了。
这里只是简单记录了修改过程,如果要集成到系统本身的相机中打开 USB 摄像头,应该有不小的工作量。
默认的 Camera API 中据说可以兼容,感兴趣的可以看下这两篇
Android中多USB摄像头解决方案——UVCCamera