From 3244dbd998aaed5ba13db688a5c0b85eb88e75a6 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 26 十二月 2025 11:00:12 +0800
Subject: [PATCH] 可升级200万摄像头,兼容旧摄像头,多个摄像头都可升级

---
 app/src/main/java/com/fwupgrade/saymanss/deviceplug/UstorageDeviceInstance.java |  217 ++++++++++++++++++++++++++++++++---------------------
 1 files changed, 131 insertions(+), 86 deletions(-)

diff --git a/app/src/main/java/com/fwupgrade/saymanss/deviceplug/UstorageDeviceInstance.java b/app/src/main/java/com/fwupgrade/saymanss/deviceplug/UstorageDeviceInstance.java
index 28fe7bf..02bd982 100644
--- a/app/src/main/java/com/fwupgrade/saymanss/deviceplug/UstorageDeviceInstance.java
+++ b/app/src/main/java/com/fwupgrade/saymanss/deviceplug/UstorageDeviceInstance.java
@@ -1,52 +1,34 @@
 package com.fwupgrade.saymanss.deviceplug;
 
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.hardware.usb.UsbAccessory;
 import android.hardware.usb.UsbDevice;
 import android.hardware.usb.UsbManager;
-import android.os.Build;
-import android.os.SystemClock;
-import android.support.annotation.RequiresApi;
+import android.text.TextUtils;
 import android.util.Log;
-
-
-import com.spca.usb.CUSBListener;
-import com.spca.usb.SpcaJNI;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
 import static android.content.Context.USB_SERVICE;
 
-/**
- * Created by Wangj on 2016/10/25.
- */
 
 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 PendingIntent mPermissionIntent;
+    private CUSBListener mUSBListener;
+    private Context g_cotext_;
+
+    private ArrayList<CameraControlTransfer> curDevListArray;
+    public ArrayList<CameraControlTransfer> devListArray;
 
     /** 璁惧鍙戠幇鍥炴帀 */
     private IUsbDevicePlugDelegate iUsbDevicePlugDelegate;
-
-
-    private UstorageDeviceInstance() {
-    }
 
     public static UstorageDeviceInstance getInstance() {
         if (instance == null) {
@@ -59,87 +41,125 @@
         return instance;
     }
 
+    UstorageDeviceInstance() {
+        devListArray = new ArrayList<CameraControlTransfer>();
+        curDevListArray = new ArrayList<CameraControlTransfer>();
+    }
+
+
+     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 int tryAttcheDeviceHandle(Context context, IUsbDevicePlugDelegate iUsbDevicePlugDelegate) {
-        Log.d("fwup","tryAttcheDeviceHandle: ");
+    public void tryAttcheDeviceHandle(Context context, IUsbDevicePlugDelegate iUsbDevicePlugDelegate) {
         this.iUsbDevicePlugDelegate = iUsbDevicePlugDelegate;
         mUsbManager = (UsbManager) context.getSystemService(USB_SERVICE);
 
-       /* Object deviceInfo = null;
+        devListArray.clear();
+        curDevListArray.clear();
 
-        if (null != (deviceInfo = acceptOTGDeviceInfo(mUsbManager))) {
-            //婊¤冻 鍗冲綋鍓嶅瓨鍦∣TG璁惧鎻掑叆  OTG璁惧绫诲瀷
-//            initOTGDeviceModule(context, (UsbDevice) deviceInfo);
-            acceptLicense(context, deviceInfo);
-        }*/
+        g_cotext_ = context;
+//        //鎷垮埌OTG璁惧鍒楄〃
+        HashMap<String, UsbDevice> 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;
+//                }
 
-        ArrayList<UsbDevice> devices = acceptOTGDeviceInfo(mUsbManager);
-        if (devices==null || devices.size()==0){
-            Log.i("fwup","devices==null");
-            return 1;
+
+//                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());
+            }
         }
-        for (UsbDevice dev: devices) {
-            acceptLicense(context, dev);
-        }
-        return 0;
     }
 
-    public int tryAgain(Context context){
-        mUsbManager = (UsbManager) context.getSystemService(USB_SERVICE);
-
-       /* Object deviceInfo = null;
-
-        if (null != (deviceInfo = acceptOTGDeviceInfo(mUsbManager))) {
-            //婊¤冻 鍗冲綋鍓嶅瓨鍦∣TG璁惧鎻掑叆  OTG璁惧绫诲瀷
-//            initOTGDeviceModule(context, (UsbDevice) deviceInfo);
-            acceptLicense(context, deviceInfo);
-        }*/
-
-        ArrayList<UsbDevice> devices = acceptOTGDeviceInfo(mUsbManager);
-        if (devices==null || devices.size()==0){
-            Log.i("fwup","tryAgain devices==null");
-            return 1;
+    public boolean startAcceptLicense(int position, Context context, Object deviceInfo) {
+        if(devListArray.get(position).usbListener.hasPermission((UsbDevice)deviceInfo)){
+            return true;
         }
-        for (UsbDevice dev: devices) {
-            acceptLicense(context, dev);
+        try {
+            devListArray.get(position).usbListener.requestPermission((UsbDevice) deviceInfo);
+            mUsbManager.openDevice((UsbDevice) deviceInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
         }
-        return 0;
+        return false;
     }
+
 
     //<<<--------------------------------------- Usb 鐩稿叧澶勭悊--------------------------------------------
     /**
      * 鑾峰彇绗﹀悎淇℃伅鐨凮TG璁惧
      * @param usbManager
      */
-    public ArrayList<UsbDevice> acceptOTGDeviceInfo(UsbManager usbManager) {
-//        UsbDevice device = null;
-        ArrayList<UsbDevice> devices = new ArrayList<>();
+    private UsbDevice acceptOTGDeviceInfo(Context context, UsbManager usbManager) {
+        UsbDevice device = null;
+
         //鎷垮埌OTG璁惧鍒楄〃
         HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
-        if (deviceList==null || deviceList.size()==0){
-            Log.d("fwup","deviceList涓虹┖ ");
-        }
+
         for (UsbDevice usbDevice : deviceList.values()) {
-            int productId = usbDevice.getProductId();
-//            if (productId != 36940) {
-//                device = usbDevice; // 鍙互澧炲姞鍘傚晢 鐗堟湰绛夊垽鏂�
-//                break;
-//            }
             int vendorId = usbDevice.getVendorId();
-            Log.d("fwup","vendorId: " + vendorId);
-            if (vendorId == 3141) {
-//                device = usbDevice; // 鍙互澧炲姞鍘傚晢 鐗堟湰绛夊垽鏂�
-                devices.add(usbDevice);
+            if (vendorId == 0x0c45) {
+                device = usbDevice;
+                break;
             }
         }
-        return devices;
+        return device;
     }
-
-
-    CUSBListener mUSBListener;
-    private SpcaJNI mSpcaJNI;
 
     private void acceptLicense(Context context, Object deviceInfo) {
         try {
@@ -149,16 +169,16 @@
 
             UsbDevice usbDevice = (UsbDevice) deviceInfo;
 
-            Log.d("fwup", "acceptLicense:" + usbDevice.getDeviceName());
             // request permission [frank.chang 7/25/2018]
             mUSBListener.requestPermission((UsbDevice)usbDevice);
 
             // open the device [frank.chang 7/25/2018]
-//            mUsbManager.openDevice((UsbDevice)usbDevice);
+            mUsbManager.openDevice((UsbDevice)usbDevice);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
+
 
     // implement OnDeviceConnectListener
     private final CUSBListener.OnDeviceConnectListener mOnDeviceConnectListener = new CUSBListener.OnDeviceConnectListener() {
@@ -169,23 +189,48 @@
 
         @Override
         public void onConnect(final UsbDevice device, final CUSBListener.UsbControlBlock ctrlBlock, final boolean createNew) {
-            iUsbDevicePlugDelegate.permissionFinish(true, ctrlBlock);
+            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) {
-            if (mSpcaJNI != null) {
-                mSpcaJNI.close();
-            }
+
         }
 
         @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() {
+
         }
     };
-}
+
+}
\ No newline at end of file

--
Gitblit v1.8.0