目录
#文章目录
##1.主函数实现
主函数实现权限的询问以及调用usb接收类,usb接收实现主要功能
import android.Manifest;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.hardware.usb.UsbManager;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private UsbBroadcastReceiver usbReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 请求权限
requestPermissions();
// 初始化USB接收器
usbReceiver = new UsbBroadcastReceiver();
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
registerReceiver(usbReceiver, filter);
}
private void requestPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1000);
}
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(usbReceiver);
}
}
##2.usb接收类
在handleUsbDevice函数中做了五秒的延迟,刚开始的时候我一步一步的调试可以晚上自动复制文件夹及文件,但是当我开始运行时候并无法完成复制,一开始是加了三秒缓冲不行,后来加了十秒感觉时间太长了,目前这个代码适用的就是五秒少一秒也不行,估计是因为U盘的读取需要一定时间,插进去直接运行应该是读取不到
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.net.Uri;
import android.os.Environment;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.util.Log;
import android.widget.Toast;
import androidx.documentfile.provider.DocumentFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
public class UsbBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "UsbBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null) {
Log.d(TAG, "USB device attached: " + device.getDeviceName());
Toast.makeText(context, "USB device connected", Toast.LENGTH_SHORT).show();
handleUsbDevice(context);
}
}
}
private void handleUsbDevice(Context context) {
try {
Thread.sleep(5000); // 5000 毫秒 = 5 秒
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
List<StorageVolume> storageVolumes = storageManager.getStorageVolumes();
for (StorageVolume volume : storageVolumes) {
if (volume.isRemovable()) { // 检查是否是可移动存储
String uuid = volume.getUuid();
File usbDriveRoot = new File("/storage/" + uuid);
File imageInFolder = new File(usbDriveRoot, "WriteBoard");
if (imageInFolder.exists() && imageInFolder.isDirectory()) {
importImagesFromUsb(imageInFolder, context);
} else {
Toast.makeText(context, "Could not find the WriteBoard folder", Toast.LENGTH_SHORT).show();
new AlertDialog.Builder(context)
.setMessage("Could not find the WriteBoard folder") // 设置对话框消息内容
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); // 用户点击确定后关闭对话框
}
})
.create() // 创建对话框
.show();
}
}
}
}
private DocumentFile findDirectory(String directoryName, DocumentFile dir) {
DocumentFile[] files = dir.listFiles();
if (files != null) {
for (DocumentFile file : files) {
if (file.isDirectory() && file.getName().equals(directoryName)) {
return file; // 找到匹配的目录
}
if (file.isDirectory()) {
DocumentFile found = findDirectory(directoryName, file);
if (found != null) {
return found; // 在子目录中找到匹配的目录
}
}
}
}
return null; // 没有找到目录
}
private void importImagesFromUsb(File imageInFolder, Context context) {
File localFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "WriteBoard");
if (!localFolder.exists()) {
localFolder.mkdirs();
}
copyDirectoryToLocal(imageInFolder, localFolder, context);
Toast.makeText(context, "Images have been successfully imported", Toast.LENGTH_SHORT).show();
new AlertDialog.Builder(context, R.style.MyAlertDialogStyle)
.setMessage("Images have been successfully imported")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.create()
.show();
}
private void copyFileToLocal(File sourceFile, File targetFile, Context context) {
try (InputStream inputStream = context.getContentResolver().openInputStream(Uri.fromFile(sourceFile));
OutputStream outputStream = new FileOutputStream(targetFile)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
Log.d(TAG, "File copied: " + sourceFile.getName());
} catch (Exception e) {
Log.e(TAG, "Error copying file: " + sourceFile.getName(), e);
}
}
private void copyDirectoryToLocal(File sourceDir, File targetDir, Context context) {
if (!targetDir.exists()) {
if (!targetDir.mkdirs()) {
Log.e("FileCopy", "Failed to create target directory: " + targetDir.getAbsolutePath());
return;
}
}
File[] files = sourceDir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
// 递归复制子目录
copyDirectoryToLocal(file, new File(targetDir, file.getName()), context);
} else {
// 复制文件
copyFileToLocal(file, new File(targetDir, file.getName()), context);
}
}
}
}
}
##3.需要更改的地方
这个是usb接收类中handusbDevice函数中的代码,需要改imageInFolder 是需要辅助U盘中的文件夹或者文件,主页不要更改usbDriveRoot
这个是修改保存在本地的位置,我这里是保存本地的pictures中
##4.权限的添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>在AndroidManifest.xml文件加入上面三个权限