【Android】文件导出到本地或者U盘

项目需求

在使用Android 9平板开发的时候,项目更新了一个新的需求,现在需要检测设备是否插入U盘,如果没有U盘的话,就将文件导出到系统根目录,如果有U盘的话,就将文件导出到U盘里面。

项目实现

1.实现文件导出到本地根目录。

这个是比较好实现的,因为设备是Android 9设备的系统,对于读写要求的权限也没有特别高,不像后年版本那么搞。

只需要动态申请读写权限(这一步忽略不写)
然后将文件存放到系统根目录就行了。

    public static String getRootPath() {
        String to;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            to = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
        } else {
            to = Environment.getDataDirectory().getAbsolutePath() + File.separator;
        }
        File file = new File(to);
        if (!file.exists()) {
            file.mkdirs();
        }
        return to;
    }

通过上面代码我们直接获取到了系统根目录的地址,然后创建好文件,这里是使用 HSSFWorkbook 新创建的一个表格数据文件,然后写入到文件里面。

    /**
     * 导出Excel表到本地
     *
     * @param context    上下文环境
     * @param sheetName  文件名
     * @param recordList 列表数据
     */
    private static void exportLocalExcel(Context context, String sheetName, List<Record> recordList) {

        String exportFileName = FilePathUtil.getRootPath() + sheetName;

        HSSFWorkbook workbook = createWorkbook(context, sheetName, recordList);

        // 写入到文件
        try (FileOutputStream fileOut = new FileOutputStream(exportFileName)) {
            workbook.write(fileOut);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

很简单不是嘛,这样我们就完成了将文件导出到系统根目录的需求了。

然后我们需要实现将文件导出到U盘里面的需求。

2.将文件导出到U盘。

首先我们需要确定我们的Android设备是否插入U盘,这一步我们直接使用Android 提供的API就可以实现。


    /**
     * 判断是否有USB设备连接
     *
     * @return true:有USB设备连接,false:没有USB设备连接
     */
    private boolean isUsbDeviceAttached() {
        UsbManager usbManager = (UsbManager) _mActivity.getSystemService(Context.USB_SERVICE);
        HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
        return deviceList.size() > 0;
    }

这也很容易,接下来就是读取U盘文件地址,然后写入就行了,但是这一步犯难了,因为没找到Android 提供的有现成的API可以让我们知道U盘地址在哪里。这里我们可以引入一个库。
这个库的版本根据项目支持的Android版本自行更换版本(项目太老,只能使用低版本的)。

//U盘读写
    implementation 'com.github.mjdev:libaums:0.5.5'

libaums 是一个开源的 Android 库,用于通过 USB 连接访问外部存储设备(如 USB U 盘)。它为开发者提供了通过 USB 协议访问设备的功能,特别适用于 USB 存储设备(Mass Storage)协议。

在引入相关库之后,我们可以使用这个库里面提供的方法。

UsbMassStorageDevice[] storageDevices = UsbMassStorageDevice.getMassStorageDevices(context);
            for (UsbMassStorageDevice device : storageDevices) {
                try {
                    device.init();
                    FileSystem fs = device.getPartitions().get(0).getFileSystem();
                    fs.getVolumeLabel();
                    UsbFile rootDirectory = fs.getRootDirectory();
                    exportUsbExcel(context, sheetName, rootDirectory, recordList);

                } catch (Exception e) {
                //这个需要处理异常或者将异常再往上抛出去
                    e.printStackTrace();
                }
            }

注意这个 UsbFile 是这个库里面的一个类,和File 类里面的一些方法有点区别,但是也不是很大。

在我们获取到 U盘 的 UsbFile 之后


    /**
     * 导出Excel表到U盘
     *
     * @param context    上下文环境
     * @param sheetName  文件名称
     * @param usbFile    U盘根目录
     * @param recordList 列表数据
     */

    private static void exportUsbExcel(Context context, String sheetName, UsbFile usbFile, List<Record> recordList) throws Exception {
        // 在根目录下创建文件
        UsbFile usbExportFile = usbFile.createFile(sheetName);

        if (usbExportFile == null) {
            throw new Exception("USB EXPORT FILE CREATE ERROR");
        }

        HSSFWorkbook workbook = createWorkbook(context, sheetName, recordList);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        workbook.write(byteArrayOutputStream);

        // 将字符串转换为字节数组
        byte[] excelBytes = byteArrayOutputStream.toByteArray();

        // 将字节数组包装成 ByteBuffer
        ByteBuffer buffer = ByteBuffer.wrap(excelBytes);

        usbExportFile.write(0, buffer);

        // 刷新文件以确保所有数据都已写入
        usbExportFile.flush();

        if (usbExportFile.getLength() != excelBytes.length) {
            throw new Exception("USB EXPORT FILE WRITE ERROR 2");
        }

    }

这里我们最后实现如果出现异常之后就抛出异常给上面处理,这样上面获取到异常之后可以处理,因为在测试的时候,设备一般情况下是没问题的,但是有时候如果U盘没插好或者设备有点异常,导致读取不到U盘的情况下,就需要通过在写入U盘的时候抛出异常告诉用于导出到U盘失败了,需要重新进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值