package ai.suanzi.rtmpclient;
+import android.hardware.usb.UsbManager;
+import android.content.Context;
+import android.hardware.usb.UsbDevice;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.log4j.Logger;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.BroadcastReceiver;
+
public class UsbMonitor {
+
+ private UsbListener mListener;
+ private Context mContext;
+ private UsbManager mUsbManager;
+ private List<UsbDevice> mUsbCameraList = new ArrayList<>();
+
+ private static Logger gLogger = Logger.getLogger("UsbMonitor");
+
+ public UsbMonitor(UsbListener listener, Context context){
+ mListener = listener;
+ mContext = context;
+ mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
+
+ IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED);
+ mContext.registerReceiver(mUsbReceiver, filter);
+ filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
+ mContext.registerReceiver(mUsbReceiver, filter);
+ filter = new IntentFilter(ACTION_USB_PERMISSION);
+ mContext.registerReceiver(mUsbReceiver, filter);
+
+ HashMap<String, UsbDevice> deviceList;
+ try {
+ deviceList = mUsbManager.getDeviceList();
+ } catch (NullPointerException e) {
+ gLogger.error(e.getMessage());
+ e.printStackTrace();
+ return;
+ }
+ gLogger.error("device list size : " + deviceList.size());
+ Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
+ //PendingIntent mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
+ while (deviceIterator.hasNext()) {
+ UsbDevice device = deviceIterator.next();
+ gLogger.error(device.toString());
+ if(isUvcCamera(device)) mUsbCameraList.add(device);
+ }
+ //mUsbManager.requestPermission(device, mPermissionIntent);
+ }
+
+ public void unregisterReceiver (){
+ mContext.unregisterReceiver(mUsbReceiver);
+ }
+
+ private boolean isUvcCamera(UsbDevice device){
+ if((device == null) || (device.getProductName() == null)) return false;
+ return device.getProductName().toLowerCase().contains("camera") || (device.getDeviceProtocol() == 1);
+ }
+
+ public boolean hasUsbCamera(){
+ gLogger.error("hasUsbCamera - size: " + mUsbCameraList.size());
+ return mUsbCameraList.size() > 0;
+ }
+
+ public int getUsbCameraCount(){
+ return mUsbCameraList.size();
+ }
+
+ private static final String ACTION_USB_PERMISSION = "ai.suanzi.rtmpclient.UsbMonitor.USB_PERMISSION";
+
+ private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
+
+ public void onReceive(Context context, Intent intent) {
+ gLogger.error("onReceive");
+ String action = intent.getAction();
+ if (ACTION_USB_PERMISSION.equals(action)) {
+ synchronized (this) {
+ UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+
+ if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) {
+ if(device != null){
+ gLogger.error( "extra permission granted");
+ //call method to set up device communication
+ }
+ }
+ else {
+ gLogger.error("permission denied for device. " + device);
+ }
+ }
+ } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
+ UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+ if (device != null){
+ gLogger.error("Device plug out");
+ gLogger.error(device.toString());
+ if(isUvcCamera(device)) {
+ mUsbCameraList.remove(device);
+ mListener.onCameraDisconnected();
+ }
+ }
+ } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
+ UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+ gLogger.error("Device plug in");
+ gLogger.error(device.toString());
+ if(isUvcCamera(device)) {
+ mUsbCameraList.add(device);
+ mListener.onCameraConnected();
+ }
+ }
+ }
+ };
+
+ public interface UsbListener {
+ void onCameraConnected();
+ void onCameraDisconnected();
+ }
}