Java实现监听USB插入

想用Java实现监听USB端口是否有移动设备插入,然后操作移动设备内的文件。网站查找资料后发现有个jsr-80的项目,下面先介绍一下什么是JSR:JSR是Java Specification Requests的缩写,意思是Java 规范请求。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。---来自百科

那么JSR-80( Java USB API)就是Java规范请求中对USB操作提供API,如何想用Java语言对USB进行操作,可以选用该扩展API。在下一篇博文中,将会介绍JSR-80的使用,本篇博文将用另一种取巧(傻笨)方式对插入设备的文件进行操作。下面说一下要进行的操作有哪些:

1.当检测到有设备插入时,删除设备中的所有文件。

2.当检测到有设备插入时,查找设备中是否有某个指定文件,若有,则关机。


贴上代码,思路和步骤都详细的写在代码的注释中:


import java.io.File;
import java.util.LinkedHashSet;
import java.util.Set;
/*
 * 实现当检测到有设备插入时,删除设备中的所有文件,使用生产者消费者模式进行检查和删除
 * 1.生产者:在设备插入之前先判断系统开始的盘符数,
 * 然后创建一个线程不断判断系统有多少个盘符,若判断出盘符数增多,则该线程等待并唤醒消费者;否则一直判断。
 * 2.消费者:在没有判断出有插入设备时,处于等待状态;若有,则将设备中的文件全部删除。
 * 3.资源:将插入的设备当作资源
 * 
 */
public class DelUSBFile {

	public static int count = 0;

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		File[] dir = File.listRoots();
		count = dir.length;
		ResFileByDelFile rf = new ResFileByDelFile(count);
		Thread t1 = new Thread(new ProducerUSBRootByDelFile(rf));
		Thread t2 = new Thread(new ConsumerUSBRootByDelFile(rf));
		t1.start();
		t2.start();
	}
}
//资源
class ResFileByDelFile {
	private int count = 0;
	//判断是否有设备插入的标记
	private boolean flag = false;
	private File[] dirs;
	
	public ResFileByDelFile(int count) {
		this.count = count;
	}

	//递归删除文件
	public static void deleteDir(File dir) {

		File[] file = dir.listFiles();

		if (file != null) {
			for (File f : file) {
				if (f.isDirectory()) {
					deleteDir(f);
				} else {
					System.out.println(f + ":" + f.delete());
				}
			}
		}
		System.out.println(dir + ":" + dir.delete());
	}
	//查找资源--生产者使用
	public synchronized void searchFile() {
		//如果flag为true,说明检测出有设备插入,则等待;
		//如果flag为false,说明没有设备插入
		if (flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		dirs = File.listRoots();
		//一但有设备插入,当前盘符数会大于系统一开始的盘符数
		if (dirs.length > count) {
			flag = true;
			notify();
		}
	}
	//消费资源--消费者使用
	public synchronized void delFile() {
		if (!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (dirs.length > count) {
			for (int i = count; i < dirs.length; i++) {
				deleteDir(dirs[i]);
			}
			flag = false;
			notify();
		}
	}
}

//消费者
class ConsumerUSBRootByDelFile implements Runnable {

	private ResFileByDelFile rf = null;

	public ConsumerUSBRootByDelFile(ResFileByDelFile rf) {
		this.rf = rf;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.delFile();
		}
	}

}

//生产者
class ProducerUSBRootByDelFile implements Runnable {

	private ResFileByDelFile rf = null;

	public ProducerUSBRootByDelFile(ResFileByDelFile rf) {
		this.rf = rf;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.searchFile();
		}
	}

}

接下来是第二个功能:

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;
/*
 * 实现当检测到有设备插入时,查找设备中的所有文件,使用生产者消费者模式进行检查和查找
 * 1.生产者:在设备插入之前先判断系统开始的盘符数,
 * 然后创建一个线程不断判断系统有多少个盘符,若判断出盘符数增多,则该线程等待并唤醒消费者;否则一直判断。
 * 2.消费者:在没有判断出有插入设备时,处于等待状态;若有,则查找设备中是否包含指定文件,有则关机。
 * 3.资源:将插入的设备当作资源
 * 
 */
public class SearchFileShutDown {

	public static int count = 0;

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		File[] dir = File.listRoots();
		count = dir.length;
		ResFileByShutdown rf = new ResFileByShutdown(count);
		Thread t1 = new Thread(new ProducerUSBRootByShutdown(rf));
		Thread t2 = new Thread(new ConsumerUSBRootByShutdown(rf));
		t1.start();
		t2.start();
	}
}

//资源
class ResFileByShutdown {
	private int count = 0;
	//判断是否有设备插入的标记
	private boolean flag = false;
	private File[] dirs;
	//保存设备中的文件
	private static Set<String> fileSet = new LinkedHashSet<String>();
	//要查找的指定文件名
	private static final String filename = "1.txt";

	public ResFileByShutdown(int count) {
		this.count = count;
	}

	//获取所有文件名
	public static void getAllFiles(File dir) throws Exception {
		File[] files = dir.listFiles();
		if (files != null) {
			System.out.println("dir:" + dir);
			for (File f : files) {
				if (f.isDirectory()) {
					getAllFiles(f);
				} else {
					fileSet.add(f.getName());
					System.out.println("file:" + f);
				}
			}

		}
		//如果有指定的文件,则10s后关机
		if (fileSet.contains(filename)) {
			Runtime.getRuntime().exec("shutdown -s -t 10");
		}
	}
	//查找资源--生产者使用
	public synchronized void searchFile() {
		if (flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		dirs = File.listRoots();
		if (dirs.length > count) {
			flag = true;
			notify();
		}
	}
	//消费资源--消费者使用
	public synchronized void delFile() {
		if (!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (dirs.length > count) {
			for (int i = count; i < dirs.length; i++) {
				try {
					getAllFiles(dirs[i]);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			// count = dirs.length;
			flag = false;
			notify();
		}
	}
}

//消费者
class ConsumerUSBRootByShutdown implements Runnable {

	private ResFileByShutdown rf = null;

	public ConsumerUSBRootByShutdown(ResFileByShutdown rf) {
		this.rf = rf;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.delFile();
		}
	}

}

//生产者
class ProducerUSBRootByShutdown implements Runnable {

	private ResFileByShutdown rf = null;

	public ProducerUSBRootByShutdown(ResFileByShutdown rf) {
		this.rf = rf;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.searchFile();
		}
	}

}



  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 安卓系统中可以通过使用 UsbManager 类来监听 USB 设备的插拔事件。 首先,你需要在 AndroidManifest.xml 中声明权限: ```xml <uses-permission android:name="android.permission.USB_PERMISSION"/> <uses-permission android:name="android.permission.ACCESS_USB_STATE"/> ``` 然后,可以通过以下步骤来监听 USB 设备的插拔事件: 1. 获取 UsbManager 对象: ```java UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); ``` 2. 创建 UsbDeviceConnection 对象,并打开设备: ```java UsbDeviceConnection connection = usbManager.openDevice(device); if (connection == null) { // 打开设备失败 return; } ``` 3. 创建 UsbInterface 对象,并选择接口: ```java UsbInterface usbInterface = device.getInterface(0); connection.claimInterface(usbInterface, true); ``` 4. 创建 BroadcastReceiver 对象,并注册监听 USB 设备插拔事件的广播: ```java BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // 设备已插入 } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // 设备已拔出 } } }; IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(receiver, filter); ``` 在不再需要监听 USB 设备插拔事件时,可以调用 unregisterReceiver() 方法来注销广播接收器。 注意:在监听 USB 设备 ### 回答2: 在安卓平台中,可以使用Android Archive(AAR)包来监听USB设备。监听USB设备可以通过注册广播接收器来实现。 首先,在项目中引入AAR包。可以将AAR文件复制到您的项目中的libs目录中,然后在build.gradle文件中添加以下依赖项: ```gradle repositories { flatDir { dirs 'libs' } } dependencies { implementation(name: 'your_aar_file_name', ext: 'aar') } ``` 接下来,创建一个广播接收器类来监听USB设备的插拔事件。可以在AndroidManifest.xml文件中声明广播接收器,如下所示: ```xml <receiver android:name=".UsbBroadcastReceiver" android:enabled="true"> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> </intent-filter> </receiver> ``` 然后,在项目中创建一个UsbBroadcastReceiver类,继承BroadcastReceiver,并实现onReceive方法。在onReceive方法中,可以根据需要进行USB设备插拔事件的处理逻辑。例如,可以获取USB设备信息,打开或关闭USB连接等。 ```java public class UsbBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action != null) { if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // 处理USB设备插入事件 // 获取USB设备信息,打开连接等 } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // 处理USB设备拔出事件 // 关闭连接等 } } } } ``` 最后,在应用启动时,可以动态注册广播接收器,以便监听USB设备的插拔事件。 ```java IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); UsbBroadcastReceiver receiver = new UsbBroadcastReceiver(); registerReceiver(receiver, filter); ``` 通过上述步骤,您就可以在安卓的AAR中成功监听USB设备的插拔事件,并进行相应的处理逻辑了。 ### 回答3: 要在安卓 AAR(Android Archive)中监听 USB,可以按照以下步骤进行: 1. 首先,在项目的 `AndroidManifest.xml` 文件中添加如下权限: ```xml <uses-permission android:name="android.permission.USB_PERMISSION" /> ``` 2. 创建一个监听 USB 的广播接收器类,例如 `UsbReceiver.java`,继承自 `BroadcastReceiver` 类。在该类中,重写 `onReceive()` 方法来处理接收到的 USB 事件: ```java public class UsbReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // 处理 USB 设备插入事件 // 在这里执行相关操作 } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // 处理 USB 设备拔出事件 // 在这里执行相关操作 } } } ``` 3. 在 AAR 中的主入口类(例如 `MyAarClass.java`)中,注册 USB 广播接收器,代码如下: ```java public class MyAarClass { private Context context; private UsbReceiver usbReceiver; public MyAarClass(Context context) { this.context = context; usbReceiver = new UsbReceiver(); // 创建一个广播过滤器,设置接收 USB 相关的 Intent IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); // 注册广播接收器 context.registerReceiver(usbReceiver, filter); } // 通过这个方法停止监听 USB public void stopListening() { context.unregisterReceiver(usbReceiver); } } ``` 通过以上步骤,我们可以在 AAR 中监听 USB 设备的插入和拔出事件。在 `UsbReceiver` 类的相应方法中,可以执行我们想要的操作,比如连接到设备、读取或写入数据等。然后,在 AAR 的主入口类中,我们可以创建一个对象来开始监听 USB,并提供一个方法来停止监听

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值