package com.mogo.usbcamera; import android.app.Activity; import android.graphics.SurfaceTexture; import android.hardware.usb.UsbDevice; import android.os.Environment; import org.easydarwin.sw.TxtOverlay; import com.serenegiant.usb.DeviceFilter; import com.serenegiant.usb.Size; import com.serenegiant.usb.USBMonitor; import com.serenegiant.usb.UVCCamera; import com.serenegiant.usb.common.AbstractUVCCameraHandler; import com.serenegiant.usb.common.UVCCameraHandler; import com.serenegiant.usb.encoder.RecordParams; import com.serenegiant.usb.widget.CameraViewInterface; import java.io.File; import java.util.List; import java.util.Objects; /** UVCCamera Helper class * * Created by jiangdongguo on 2017/9/30. */ public class UVCCameraHelper { public static final String ROOT_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator; public static final String SUFFIX_JPEG = ".jpg"; public static final String SUFFIX_MP4 = ".mp4"; private static final String TAG = "UVCCameraHelper"; private int previewWidth = 640; private int previewHeight = 480; public static final int FRAME_FORMAT_YUYV = UVCCamera.FRAME_FORMAT_YUYV; // Default using MJPEG // if your device is connected,but have no images // please try to change it to FRAME_FORMAT_YUYV public static final int FRAME_FORMAT_MJPEG = UVCCamera.FRAME_FORMAT_MJPEG; public static final int MODE_BRIGHTNESS = UVCCamera.PU_BRIGHTNESS; public static final int MODE_CONTRAST = UVCCamera.PU_CONTRAST; private int mFrameFormat = FRAME_FORMAT_MJPEG; private static UVCCameraHelper mCameraHelper; // USB Manager private USBMonitor mUSBMonitor; // Camera Handler private UVCCameraHandler mCameraHandler; private USBMonitor.UsbControlBlock mCtrlBlock; private Activity mActivity; private CameraViewInterface mCamView; private UVCCameraHelper() { } public static UVCCameraHelper getInstance() { if (mCameraHelper == null) { mCameraHelper = new UVCCameraHelper(); } return mCameraHelper; } public void closeCamera() { if (mCameraHandler != null) { mCameraHandler.close(); } } public interface OnMyDevConnectListener { void onAttachDev(UsbDevice device); void onDettachDev(UsbDevice device); void onConnectDev(UsbDevice device, boolean isConnected); void onDisConnectDev(UsbDevice device); } public void initUSBMonitor(Activity activity, CameraViewInterface cameraView, final OnMyDevConnectListener listener) { this.mActivity = activity; this.mCamView = cameraView; mUSBMonitor = new USBMonitor(activity.getApplicationContext(), new USBMonitor.OnDeviceConnectListener() { // called by checking usb device // do request device permission @Override public void onAttach(UsbDevice device) { if (listener != null) { listener.onAttachDev(device); } } // called by taking out usb device // do close camera @Override public void onDettach(UsbDevice device) { if (listener != null) { listener.onDettachDev(device); } } // called by connect to usb camera // do open camera,start previewing @Override public void onConnect(final UsbDevice device, USBMonitor.UsbControlBlock ctrlBlock, boolean createNew) { mCtrlBlock = ctrlBlock; openCamera(ctrlBlock); new Thread(new Runnable() { @Override public void run() { // wait for camera created try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } // start previewing startPreview(mCamView); } }).start(); if(listener != null) { listener.onConnectDev(device,true); } } // called by disconnect to usb camera // do nothing @Override public void onDisconnect(UsbDevice device, USBMonitor.UsbControlBlock ctrlBlock) { if (listener != null) { listener.onDisConnectDev(device); } } @Override public void onCancel(UsbDevice device) { } }); createUVCCamera(); } public void createUVCCamera() { if (mCamView == null) { throw new NullPointerException("CameraViewInterface cannot be null!"); } // release resources for initializing camera handler if (mCameraHandler != null) { mCameraHandler.release(); mCameraHandler = null; } // initialize camera handler mCamView.setAspectRatio(previewWidth / (float)previewHeight); mCameraHandler = UVCCameraHandler.createHandler(mActivity, mCamView, 2, previewWidth, previewHeight, mFrameFormat); } public void updateResolution(int width, int height) { if (previewWidth == width && previewHeight == height) { return; } this.previewWidth = width; this.previewHeight = height; if (mCameraHandler != null) { mCameraHandler.release(); mCameraHandler = null; } mCamView.setAspectRatio(previewWidth / (float)previewHeight); mCameraHandler = UVCCameraHandler.createHandler(mActivity,mCamView, 2, previewWidth, previewHeight, mFrameFormat); openCamera(mCtrlBlock); new Thread(new Runnable() { @Override public void run() { // wait for camera created try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } // start previewing startPreview(mCamView); } }).start(); } public void registerUSB() { if (mUSBMonitor != null) { mUSBMonitor.register(); } } public void unregisterUSB() { if (mUSBMonitor != null) { mUSBMonitor.unregister(); } } public boolean checkSupportFlag(final int flag) { return mCameraHandler != null && mCameraHandler.checkSupportFlag(flag); } public int getModelValue(final int flag) { return mCameraHandler != null ? mCameraHandler.getValue(flag) : 0; } public int setModelValue(final int flag, final int value) { return mCameraHandler != null ? mCameraHandler.setValue(flag, value) : 0; } public int resetModelValue(final int flag) { return mCameraHandler != null ? mCameraHandler.resetValue(flag) : 0; } public void requestPermission(int index) { List devList = getUsbDeviceList(); if (devList == null || devList.size() == 0) { return; } int count = devList.size(); if (index >= count) new IllegalArgumentException("index illegal,should be < devList.size()"); if (mUSBMonitor != null) { mUSBMonitor.requestPermission(getUsbDeviceList().get(index)); } } public int getUsbDeviceCount() { List devList = getUsbDeviceList(); if (devList == null || devList.size() == 0) { return 0; } return devList.size(); } public List getUsbDeviceList() { List deviceFilters = DeviceFilter .getDeviceFilters(mActivity.getApplicationContext(), R.xml.device_filter); if (mUSBMonitor == null || deviceFilters == null) // throw new NullPointerException("mUSBMonitor ="+mUSBMonitor+"deviceFilters=;"+deviceFilters); return null; // matching all of filter devices return mUSBMonitor.getDeviceList(deviceFilters); } public void capturePicture(String savePath,AbstractUVCCameraHandler.OnCaptureListener listener) { if (mCameraHandler != null && mCameraHandler.isOpened()) { File file = new File(savePath); if(! Objects.requireNonNull(file.getParentFile()).exists()) { file.getParentFile().mkdirs(); } mCameraHandler.captureStill(savePath,listener); } } public void startPusher(AbstractUVCCameraHandler.OnEncodeResultListener listener) { if (mCameraHandler != null && !isPushing()) { mCameraHandler.startRecording(null, listener); } } public void startPusher(RecordParams params, AbstractUVCCameraHandler.OnEncodeResultListener listener) { if (mCameraHandler != null && !isPushing()) { if(params.isSupportOverlay()) { TxtOverlay.install(mActivity.getApplicationContext()); } mCameraHandler.startRecording(params, listener); } } public void stopPusher() { if (mCameraHandler != null && isPushing()) { mCameraHandler.stopRecording(); } } public boolean isPushing() { if (mCameraHandler != null) { return mCameraHandler.isRecording(); } return false; } public boolean isCameraOpened() { if (mCameraHandler != null) { return mCameraHandler.isOpened(); } return false; } public void release() { if (mCameraHandler != null) { mCameraHandler.release(); mCameraHandler = null; } if (mUSBMonitor != null) { mUSBMonitor.destroy(); mUSBMonitor = null; } } public USBMonitor getUSBMonitor() { return mUSBMonitor; } public void setOnPreviewFrameListener(AbstractUVCCameraHandler.OnPreViewResultListener listener) { if(mCameraHandler != null) { mCameraHandler.setOnPreViewResultListener(listener); } } private void openCamera(USBMonitor.UsbControlBlock ctrlBlock) { if (mCameraHandler != null) { mCameraHandler.open(ctrlBlock); } } public void startPreview(CameraViewInterface cameraView) { SurfaceTexture st = cameraView.getSurfaceTexture(); if (mCameraHandler != null) { mCameraHandler.startPreview(st); } } public void stopPreview() { if (mCameraHandler != null) { mCameraHandler.stopPreview(); } } public void startCameraFoucs() { if (mCameraHandler != null) { mCameraHandler.startCameraFoucs(); } } public List getSupportedPreviewSizes() { if (mCameraHandler == null) { return null; } return mCameraHandler.getSupportedPreviewSizes(); } public void setDefaultPreviewSize(int defaultWidth,int defaultHeight) { if(mUSBMonitor != null) { throw new IllegalStateException("setDefaultPreviewSize should be call before initMonitor"); } this.previewWidth = defaultWidth; this.previewHeight = defaultHeight; } public void setDefaultFrameFormat(int format) { if(mUSBMonitor != null) { throw new IllegalStateException("setDefaultFrameFormat should be call before initMonitor"); } this.mFrameFormat = format; } public int getPreviewWidth() { return previewWidth; } public int getPreviewHeight() { return previewHeight; } }