1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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.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 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 IUsbDevicePlugDelegate iUsbDevicePlugDelegate;
 
 
    private UstorageDeviceInstance() {
    }
 
    public static UstorageDeviceInstance getInstance() {
        if (instance == null) {
            mLock.lock();
            if (instance == null) {
                instance = new UstorageDeviceInstance();
            }
            mLock.unlock();
        }
        return instance;
    }
 
    /**
     * 尝试是否有连接设备(OTG)
     */
    public int tryAttcheDeviceHandle(Context context, IUsbDevicePlugDelegate iUsbDevicePlugDelegate) {
        Log.d("fwup","tryAttcheDeviceHandle: ");
        this.iUsbDevicePlugDelegate = iUsbDevicePlugDelegate;
        mUsbManager = (UsbManager) context.getSystemService(USB_SERVICE);
 
       /* Object deviceInfo = null;
 
        if (null != (deviceInfo = acceptOTGDeviceInfo(mUsbManager))) {
            //满足 即当前存在OTG设备插入  OTG设备类型
//            initOTGDeviceModule(context, (UsbDevice) deviceInfo);
            acceptLicense(context, deviceInfo);
        }*/
 
        ArrayList<UsbDevice> devices = acceptOTGDeviceInfo(mUsbManager);
        if (devices==null || devices.size()==0){
            Log.i("fwup","devices==null");
            return 1;
        }
        for (UsbDevice dev: devices) {
            acceptLicense(context, dev);
        }
        return 0;
    }
 
    //<<<--------------------------------------- Usb 相关处理--------------------------------------------
    /**
     * 获取符合信息的OTG设备
     * @param usbManager
     */
    public ArrayList<UsbDevice> acceptOTGDeviceInfo(UsbManager usbManager) {
//        UsbDevice device = null;
        ArrayList<UsbDevice> devices = new ArrayList<>();
        //拿到OTG设备列表
        HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
 
        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);
            }
        }
        return devices;
    }
 
 
    CUSBListener mUSBListener;
    private SpcaJNI mSpcaJNI;
 
    private void acceptLicense(Context context, Object deviceInfo) {
        try {
            mUSBListener = new CUSBListener(context, mOnDeviceConnectListener);
 
            mUSBListener.register();
 
            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);
        } 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) {
            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) {
            iUsbDevicePlugDelegate.usbDeviceDetached();
        }
 
        @Override
        public void onCancel() {
        }
    };
}