旧方式参考
封装类:PzHelpUSB
class PzHelpUSB implements SerialInputOutputManager.Listener {
private static final String TAG = "PzHelpUSB";
Context context;
UsbSerialPort usbSerialPort = null;
SerialInputOutputManager usbIoManager;
int productID, vendorID;
String usbDataString = "";
String DIALOG_USB_PERMISSION = "com.example.usbtest.GRANT_USB";
OnUsbDataListener onUsbDataListener;
public PzHelpUSB(Context context, int productID, int vendorID, onUsbDataListener onUsbDataListener) {
this.context = context;
this.productID = productID;
this.vendorID = vendorID;
this.onUsbDataListener = onUsbDataListener;
}
boolean connectToDefineEquipment() {
UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
List<UsbSerialDriver> drivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager);
if (drivers.isEmpty()) {
Log.d(TAG, "run: drivers.isEmpty()!");
return false;
}
List<UsbSerialPort> ports = new ArrayList<>();
for (UsbSerialDriver driver : drivers) {
ports.addAll(driver.getPorts());
}
if (ports.isEmpty()) {
Log.d(TAG, "run: ports.isEmpty()!");
return false;
}
for (UsbSerialPort port : ports) {
UsbDevice usbDevice = port.getDriver().getDevice();
if (usbDevice.getProductId() == productID && usbDevice.getVendorId() == vendorID) {
if (usbManager.hasPermission(usbDevice)) {
try {
usbSerialPort = port;
usbSerialPort.open(usbManager.openDevice(usbSerialPort.getDriver().getDevice()));
usbSerialPort.setParameters(19200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
Executors.newSingleThreadExecutor().submit(usbIoManager);
return true;
} catch (IOException e) {
e.printStackTrace();
close();
return false;
}
} else {
PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(DIALOG_USB_PERMISSION), 0);
usbManager.requestPermission(usbDevice, usbPermissionIntent);
}
break;
}
}
return false;
}
public void close() {
if (usbIoManager != null) {
usbIoManager.stop();
}
usbIoManager = null;
if (usbSerialPort != null) {
try {
usbSerialPort.close();
} catch (Exception e) {
e.printStackTrace();
}
usbSerialPort = null;
}
}
@Override
public void onNewData(byte[] data) {
try {
usbDataString += new String(data, "GBK");
if (usbDataString.length() >= 30) {
int star = usbDataString.indexOf("<d>");
if (star != -1) {
usbDataString = usbDataString.substring(star);
int end = usbDataString.indexOf("</d>");
if (end != -1) {
onUsbDataListener.onReceive(usbDataString);
}
}
usbDataString = "";
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onRunError(Exception e) {
e.printStackTrace();
}
void registerReceiver() {
IntentFilter usbDeviceStateFilter = new IntentFilter();
usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
usbDeviceStateFilter.addAction(DIALOG_USB_PERMISSION);
context.registerReceiver(broadcastReceiver, usbDeviceStateFilter);
}
void unregisterReceiver() {
context.unregisterReceiver(broadcastReceiver);
}
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
Log.d(TAG, "onReceive: USB插入");
connectToDefineEquipment();
}
if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) {
Log.d(TAG, "onReceive: USB拔出");
close();
}
if (DIALOG_USB_PERMISSION.equals(intent.getAction())) {
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
Log.d(TAG, "onReceive: 用户允许了TEMPER_PERMISSION权限");
connectToDefineEquipment();
} else {
Log.d(TAG, "onReceive: 用户取消了TEMPER_PERMISSION权限");
}
}
}
};
interface OnUsbDataListener {
void onReceive(String response);
}
}
其他配置
- 在你的build.gradle(project)中添加
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.mik3y:usb-serial-for-android:3.3.0'
}
<uses-feature android:name="android.hardware.usb.host" />
<resource>
<usb-device product-id="29987" vendor-id="6790" />
<usb-device product-id="21795" vendor-id="6790" />
<usb-device product-id="21778" vendor-id="6790" />
<usb-device vendor-id="1024" product-id="50010"/>
<usb-device vendor-id="1024" product-id="24577"/>
<usb-device vendor-id="6790" product-id="29987"/>
<usb-device vendor-id="1027" product-id="24577"/>
</resource>
- 如果想要在设备插入后便获取权限,则需要在
AndroidManifest
中补全以下代码
<uses-feature android:name="android.hardware.usb.host" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
</application>
使用
... ...
PzHelpUSB usb = new PzHelpUSB(this, USB_PRODUCT_ID, USB_VENDOR_ID, this);
usb.connectToDefineEquipment();
... ...
@Override
public void onReceive(String response) {
}
@Override
protected void onStart() {
super.onStart();
usb.registerReceiver();
}
@Override
protected void onStop() {
usb.unregisterReceiver();
super.onStop();
}
@Override
protected void onDestroy() {
usb.close();
super.onDestroy();
}