package com.fwupgrade.saymanss.deviceplug; import android.content.Context; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.text.TextUtils; import android.util.Log; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import static android.content.Context.USB_SERVICE; public class UstorageDeviceInstance { private static String TAG = UstorageDeviceInstance.class.getSimpleName(); private static UstorageDeviceInstance instance; private static Lock mLock= new ReentrantLock(); public static final String ACTION_USB_PERMISSION = "wfd.action.USB_PERMISSION"; private UsbManager mUsbManager; private CUSBListener mUSBListener; private Context g_cotext_; private ArrayList curDevListArray; public ArrayList devListArray; /** 设备发现回掉 */ private IUsbDevicePlugDelegate iUsbDevicePlugDelegate; public static UstorageDeviceInstance getInstance() { if (instance == null) { mLock.lock(); if (instance == null) { instance = new UstorageDeviceInstance(); } mLock.unlock(); } return instance; } UstorageDeviceInstance() { devListArray = new ArrayList(); curDevListArray = new ArrayList(); } final String getUSBFSName(final CUSBListener.UsbControlBlock ctrlBlock) { String result = null; final String name = ctrlBlock.getDeviceName(); final String[] v = !TextUtils.isEmpty(name) ? name.split("/") : null; if ((v != null) && (v.length > 2)) { final StringBuilder sb = new StringBuilder(v[0]); for (int i = 1; i < v.length - 2; i++) sb.append("/").append(v[i]); result = sb.toString(); } if (TextUtils.isEmpty(result)) { result = "/dev/bus/usb"; } return result; } /** * 尝试是否有连接设备(OTG) */ public void tryAttcheDeviceHandle(Context context, IUsbDevicePlugDelegate iUsbDevicePlugDelegate) { this.iUsbDevicePlugDelegate = iUsbDevicePlugDelegate; mUsbManager = (UsbManager) context.getSystemService(USB_SERVICE); devListArray.clear(); curDevListArray.clear(); g_cotext_ = context; // //拿到OTG设备列表 HashMap deviceList = mUsbManager.getDeviceList(); Log.d("deviceList", String.valueOf(deviceList.size())); for (UsbDevice usbDevice : deviceList.values()) { Log.i("Start", String.valueOf(usbDevice.getProductName())); Boolean find = false; for (int i = 0; i < curDevListArray.size(); i++) { if(usbDevice.equals(curDevListArray.get(i))){ find= true; Log.e("ERROR", "find device"); Log.e("ERROR", String.valueOf(usbDevice.getDeviceClass())); Log.e("ERROR", String.valueOf(usbDevice.getDeviceName())); Log.e("ERROR", String.valueOf(usbDevice.getProductName())); continue; } } if(usbDevice.getDeviceClass() != 0xEF) { Log.e("ERROR", "getDeviceClass!=0xEF"); Log.e("ERROR", String.valueOf(usbDevice.getDeviceClass())); Log.e("ERROR", String.valueOf(usbDevice.getDeviceName())); Log.e("ERROR", String.valueOf(usbDevice.getProductName())); continue; } if(!find){ // if(usbDevice.getVendorId() != 0x0581 || usbDevice.getProductId() != 0x0b20){ // continue; // } // Log.d("usbDevice", String.valueOf(usbDevice.toString())); // Log.d("getDeviceSubclass", String.valueOf(usbDevice.getDeviceSubclass())); Log.d("devName", usbDevice.getDeviceName()); Log.d("proName", usbDevice.getProductName()); Log.d("vid", String.valueOf(usbDevice.getVendorId())); Log.d("pid", String.valueOf(usbDevice.getProductId())); CameraControlTransfer infos = new CameraControlTransfer(); infos.dev = usbDevice; infos.bPermission = false; try { infos.usbListener = mUSBListener; mUSBListener = new CUSBListener(context, mOnDeviceConnectListener); mUSBListener.register(); mUSBListener.requestPermission(usbDevice); }catch (Exception e) { e.printStackTrace(); } curDevListArray.add(infos); Log.d(TAG, "curDevListArraySize: " + curDevListArray.size()); } } } public boolean startAcceptLicense(int position, Context context, Object deviceInfo) { if(devListArray.get(position).usbListener.hasPermission((UsbDevice)deviceInfo)){ return true; } try { devListArray.get(position).usbListener.requestPermission((UsbDevice) deviceInfo); mUsbManager.openDevice((UsbDevice) deviceInfo); } catch (Exception e) { e.printStackTrace(); } return false; } //<<<--------------------------------------- Usb 相关处理-------------------------------------------- /** * 获取符合信息的OTG设备 * @param usbManager */ private UsbDevice acceptOTGDeviceInfo(Context context, UsbManager usbManager) { UsbDevice device = null; //拿到OTG设备列表 HashMap deviceList = usbManager.getDeviceList(); for (UsbDevice usbDevice : deviceList.values()) { int vendorId = usbDevice.getVendorId(); if (vendorId == 0x0c45) { device = usbDevice; break; } } return device; } private void acceptLicense(Context context, Object deviceInfo) { try { mUSBListener = new CUSBListener(context, mOnDeviceConnectListener); mUSBListener.register(); UsbDevice usbDevice = (UsbDevice) deviceInfo; // request permission [frank.chang 7/25/2018] mUSBListener.requestPermission((UsbDevice)usbDevice); // open the device [frank.chang 7/25/2018] mUsbManager.openDevice((UsbDevice)usbDevice); } catch (Exception e) { e.printStackTrace(); } } // implement OnDeviceConnectListener private final CUSBListener.OnDeviceConnectListener mOnDeviceConnectListener = new CUSBListener.OnDeviceConnectListener() { @Override public void onAttach(final UsbDevice device) { iUsbDevicePlugDelegate.usbDeviceInsert(); } @Override public void onConnect(final UsbDevice device, final CUSBListener.UsbControlBlock ctrlBlock, final boolean createNew) { for (int i = 0; i < curDevListArray.size(); i++) { if(device.equals(curDevListArray.get(i).dev)){ Log.d(TAG, "Get Permission:" + device.getDeviceName()); CameraControlTransfer cct = curDevListArray.get(i); cct.bPermission = true; cct.connection = ctrlBlock.mConnection; String fsName = new String(); fsName = ctrlBlock.getDeviceName();; cct.usbFSName = fsName; cct.fd = ctrlBlock.getFileDescriptor(); mUsbManager.openDevice(device); devListArray.add(cct); // int a = ctrlBlock.getBusNum(); // int b = ctrlBlock.getDevNum(); iUsbDevicePlugDelegate.permissionFinish(true, ctrlBlock, cct); break; } } // iUsbDevicePlugDelegate.permissionFinish(true, ctrlBlock); } @Override public void onDisconnect(final UsbDevice device, final CUSBListener.UsbControlBlock ctrlBlock) { } @Override public void onDettach(final UsbDevice device) { for (int i = 0; i < devListArray.size(); i++) { if(device.equals(device)){ devListArray.remove(i); break; } } iUsbDevicePlugDelegate.usbDeviceDetached(); } @Override public void onCancel() { } }; }