安卓开发u盘插入自动导入文件方法

目录

#文章目录

##1.主函数实现

##2.usb接收类

##3.需要更改的地方

##4.权限的添加 

#文章目录

##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文件加入上面三个权限

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值