android 通过usb读取 U盘

2023-11-16

  1. 关联 compile ‘com.github.mjdev:libaums:+’
  2. 权限设置
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.hardware.usb.host" android:required="false" /> 
<uses-feature android:name="android.hardware.usb.host" android:required="true" />

  1. 监听u盘 插入拔出的广播
 //监听otg插入 拔出
 IntentFilter usbDeviceStateFilter = new IntentFilter();
 usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
 usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
 mContext.registerReceiver(UDiskMountedReceiver, usbDeviceStateFilter);
 //注册监听自定义广播
 IntentFilter filter = new IntentFilter(Constant.ACTION_USB_PERMISSION);
 mContext.registerReceiver(UDiskMountedReceiver, filter);
  1. 4.
package com.zb.usbtest;

/*
 *  @项目名:  UsbTest 
 *  @包名:    com.zb.usbtest
 *  @文件名:   ReadUDisk
 *  @创建者:   25934
 *  @创建时间:  2018-07-24 13:50
 *  @描述:    TODO
 */

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbManager;
import android.util.Log;
import com.github.mjdev.libaums.UsbMassStorageDevice;
import com.github.mjdev.libaums.fs.FileSystem;
import com.github.mjdev.libaums.fs.UsbFile;
import com.github.mjdev.libaums.partition.Partition;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static com.zb.usbtest.Constant.ACTION_USB_PERMISSION;

public class ReadUDisk {
    private UDiskCallBack.OnUDiskCallBack mOnUDiskCallBack = null;
    private Context                mContext;
    private UsbMassStorageDevice[] storageDevices;
    private List<UsbFile> usbFiles = new ArrayList<>();
    private final UsbManager mUsbManager;

    public ReadUDisk(Context context) {
        mContext = context;
        mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
    }

    /**
     * 接受U盘插入和拔出事件
     * @param onUDiskCallBack
     */
    public void setOnUDiskCallBack(UDiskCallBack.OnUDiskCallBack onUDiskCallBack) {
        if (mOnUDiskCallBack == null) {
            registerReceiver();
            mOnUDiskCallBack = onUDiskCallBack;
        }
    }

    /**
     * 注册广播接收者
     */
    public void registerReceiver() {
        //监听otg插入 拔出
        IntentFilter usbDeviceStateFilter = new IntentFilter();
        usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        usbDeviceStateFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        mContext.registerReceiver(UDiskMountedReceiver, usbDeviceStateFilter);
        //注册监听自定义广播
        IntentFilter filter = new IntentFilter(Constant.ACTION_USB_PERMISSION);
        mContext.registerReceiver(UDiskMountedReceiver, filter);
        Log.e("ReadUDisk", "registerReceiver: ");
    }

    /**
     * 注销广播接收者
     */
    public void unReisterReceiver() {
        if (UDiskMountedReceiver != null) {
            mContext.unregisterReceiver(UDiskMountedReceiver);
        }
    }

    /**
     * 检查usb设备的权限
     * @param device
     * @return
     */
    public boolean checkPerssion(UsbMassStorageDevice device) {
        if (mUsbManager==null){
            return false;
        }
        if (mUsbManager.hasPermission(device.getUsbDevice())) {//有就直接读取设备是否有权限
            return true;
        } else {
            return false;
        }
    }


    /**
     * 读取当前usb设备的数量
     * @return
     */
    public int getDeviceCount() {
        //获取存储设备
        UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
        return storageDevices.length;
    }

    /**
     * 根据position获取usb设备
     * @param position
     * @return
     */
    public UsbMassStorageDevice getUsbMassDevice(int position) {
        //获取存储设备
        UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
        if (position > storageDevices.length) {
            return null;
        } else {
            return storageDevices[position];
        }
    }

    /**
     * 获取usb上所有的存储设备
     * @return
     */
    public UsbMassStorageDevice[] getUsbMassAllDevice() {
        //获取存储设备
        UsbMassStorageDevice[] storageDevices =UsbMassStorageDevice.getMassStorageDevices(mContext);
        return storageDevices;
    }

    /**
     * 根据设备获取路径
     * @param device
     * @return
     */
    public FileSystem readDevice(UsbMassStorageDevice device) {
        try {
            if (!checkPerssion(device)){  //检查是否有权限
                return null;
            }

            device.init();//使用设备之前需要进行 初始化
            Partition  partition = device.getPartitions().get(0); //仅使用设备的第一个分区
            FileSystem currentFs = partition.getFileSystem();
            // currentFs.getCapacity(); //容量大小
            // currentFs.getOccupiedSpace(); //已使用大小
            // currentFs.getFreeSpace();  //未使用的大小
            UsbFile root       = currentFs.getRootDirectory();//获取根目录
            String  deviceName = currentFs.getVolumeLabel();//获取设备标签
            return currentFs;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取U盘的文件和文件夹路径
     * @param fileSystem
     * @return
     */
    public List<UsbFile> getUsbFiles(FileSystem fileSystem) {
        usbFiles.clear();
        try {
            for (UsbFile file : fileSystem.getRootDirectory()
                                          .listFiles()) {  //将所以文件和文件夹路径添加到usbFiles数组中
                usbFiles.add(file);
            }
            Collections.sort(usbFiles, new Comparator<UsbFile>() {//简单排序 文件夹在前 文件在后
                @Override
                public int compare(UsbFile oFile1, UsbFile oFile2) {
                    return oFile1.isDirectory()
                           ? -1
                           : 1;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        return usbFiles;
    }


    private BroadcastReceiver UDiskMountedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            switch (action) {
                case ACTION_USB_PERMISSION: //自定义权限广播
                    if (mOnUDiskCallBack != null) {
                        mOnUDiskCallBack.onPermissionCallBack();
                    }
                    break;
                case UsbManager.ACTION_USB_DEVICE_ATTACHED: //usb设备插入广播
                    if (mOnUDiskCallBack != null) {
                        mOnUDiskCallBack.onAttachDeviceCallBack();
                    }
                    break;

                case UsbManager.ACTION_USB_DEVICE_DETACHED: //usb设备拔出广播
                    if (mOnUDiskCallBack != null) {
                        mOnUDiskCallBack.onDetachDeviceCallBack();
                    }
                    break;
            }
        }
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 通过usb读取 U盘 的相关文章

  • 单击弹出菜单时为什么导航栏出现在全屏应用程序中

    我有一个全屏应用程序 MainActivity java public class MainActivity extends AppCompatActivity TargetApi Build VERSION CODES KITKAT pr
  • 如何使用 ProGuard 将所有方法保留在类中

    我使用 ProGuard 来优化我的 Android 应用程序 然而 对于 Android 仪器测试 我需要一些 但不是全部 类来保留所有成员 我尝试了各种方法 最后一个是 keepclassmembers public class com
  • TypedArray 的 getResourceId 方法

    我正在阅读有关的文档获取资源Id https developer android com reference android content res TypedArray html getResourceId int 20int 方法 它说
  • 如何在 Android 中使用 Assets 中预加载的 SQLite 数据库

    我想用preloaded database在我的应用程序中意味着尝试在安装 apk 时获取数据库 以便可以使用已保存在其中的数据 我复制了 成分 db 文件位于资产文件夹中 并使用以下代码 但这会出现错误 从资源文件复制数据库时出现问题 我
  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • 在 Anko DSL 中创建自定义 View/ViewGroup 类

    我想创建一个自定义视图 它只是一些 Android 视图的包装 我考虑创建一个自定义 ViewGroup 来管理其子视图的布局 但我不需要这么复杂 我基本上想做的是 class MainActivity verticalLayout tex
  • 在 Android 中长按时从操作模式中删除后退/主页按钮

    我已经在里面长按实现了上下文操作模式recycler view 为此我打电话给ActionModeCallback从创建动作模式开始 创建动作模式时 默认显示后退箭头 检查如下 单击后退箭头 操作模式将关闭 现在我想要hide or rem
  • Retrofit-2 内容类型问题

    我的 Api 接受 Content Type application json 作为标头 我按照改造文档中所述完美设置了标题 Headers Content Type application json POST user classes C
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 以编程方式更新 Android 中的联系人姓名和电话号码

    我创建一个应用程序来读取 更新 删除联系人详细信息 这是更新联系人姓名和电话号码的问题 有人可以帮助我吗 我该怎么做 我正在使用以下代码 但它不起作用 Override public View onCreateView LayoutInfl
  • 以编程方式将 TextView 添加到主屏幕小部件

    我想以编程方式将文本视图控件添加到我的主屏幕小部件 在下面的示例中 我使用 TextView 填充 Linearlayout 但是这里应该如何使用 RemoteView 它只接受 xml 资源布局作为参数 public class MyWi
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • 直接使用从密钥库加载的 SecretKey 时,密钥用户未经过身份验证

    我正在尝试使用 Cipher 和在 KeyStore 中加载的 SecretKey 来加密数据 但总是收到此错误 导致 android security KeyStoreException 关键用户未经过身份验证 我尝试自己创建 Secre
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议

随机推荐

  • nginx高性能原因

    epoll多路复用 BIO 堵塞式IO 缺点 client和server一旦建立连接 就可以建立通信套接字在这个通信套接字上进行读写操作 此时不能再接收其他客户端连接请求 只能等待同当前连接的客户端的操作执行完成 select模型 缺点 变
  • 第四章 神经网络知识扩展

    1 其他的神经网络学习算法 1 1介绍 梯度下降算法并不是神经网络的唯一算法 还有其他算法 我们喜欢称他们为优化器 Optimizer 优化器就是优化网络的机器 主要有以下几种 1 2SGD优化器 SGD优化器全称为随机梯度下降算法 可以简
  • Java Web 学习笔记 06 Servlet 案例(get、post,转发与重定向)

    Servlet 案例 get post 转发与重定向 案例一 初体验 Servlet web项目 案例二 get 和post 提交流程 编码 1 get和post的区别 乱码问题 2 实例 案例三 转发与重定向 案例一 初体验 Servle
  • Vision Transformer论文精读(2/2)

    目录 一 主题 3 1模型总览图 3 2 微调 二 实验部分 三 回顾总结 四 参考链接 一 主题 在模型的设计上 是尽可能的按照最原始的Transformer来做的 这样的一个好处是我们可以直接把NLP那边已经成功地Transformer
  • 博客园美化

    写在前面 前面的文章中提到过 自己开始在博客园上更新文章 说也奇怪 自己博客园账号注册了好久 都没在上面更新过博客 直到前段时间博客园的求助信息火了 才对博客园有了全新的认知 博客园一个最大的特点就是简洁 干净 广告少 但也有一个个人认为很
  • sqli-less-26-less26a

    less 26 单引号 GET型 这关就有点过滤的意思了 过滤了上一关的东西 并且把空格和 23给过滤了 如果是ubuntu的话 可以用 0a等绕过 方便一些 但我的是windows 所以就只能用 了 让后使用 来代替and 用 1来闭合
  • 树莓派显示器截图方法大全(适用于Linux-C,可扩展开发)

    树莓派显示器截图方法大全 适用于Linux C 可扩展开发 文章目录 树莓派显示器截图方法大全 适用于Linux C 可扩展开发 1 前言 2 shutter 3 scrot 4 raspi2png 5 fb2png 6 最后 1 前言 有
  • Oracle阻塞会话源头查找-单机和RAC环境

    在写 Oracle session相关数据字典 一 这篇文章时 提到使用v session视图的树形查询可以得到Oracle锁树 这样就便于我们找出阻塞会话的源头 但是仅仅可以在单机环境中使用 今天把单机和RAC的阻塞树都整理了一下 话不多
  • kotlin高阶函数开发一个程序,统计文本中字符串出现的个数

    一 高阶函数是Kotlin的核心部分 下面来使用下高阶函数写一个程序 注意 我这里的File使用的是 与src同级的文件 你可以根据自己的需要 修改文件地址 代码实例 package net println kotlin chapter5
  • 如何完整地掌握一个机器学习模型

    如何完整地掌握一个机器学习模型 要全面地学习 掌握一个机器学习模型 可以遵循以下步骤 基础理论学习 了解该模型的背后数学原理和推导过程 包括假设 损失函数 优化方法等 学习算法实现 通过查阅论文 教程或开源代码 了解算法的具体实现过程 尝试
  • k8s的service资源类型有ClusterIP、Nodeport、ExternalName、LoadBalancer、Headless(None)

    1 ClusterIP 是什么 ClusterIP 是在所有节点内生成一个虚拟IP 为一组pod提供统一的接入点 当service存在时 它的IP地址和端口不会发生改变 客户端通过service的ip和端口建立连接 由service将连接路
  • 20221210 QT----信号和槽的使用

    信号和槽的使用 文章内容为B站 大轮明王讲Qt 的学习笔记 什么是信号 signal 以QPushButton为例 1 按下按钮时 会触发一个mousePressEvent事件 此时会发出一个pressed信号 2 松开按钮时 会触发一个m
  • 00后确实卷,公司新来的卷王,我们这帮老油条真干不过.....

    都说00后躺平了 但是有一说一 该卷的还是卷 这不 前段时间我们公司来了个00后 工作没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好
  • Spring学习笔记 Spring JDBC框架

    Spring JDBC简介 先来看看一个JDBC的例子 我们可以看到为了执行一条SQL语句 我们需要创建连接 创建语句对象 然后执行SQL 然后操纵结果集获取数据 try Connection connection DriverManage
  • CGAL 最小点数约束的体素滤波

    目录 一 概述 二 代码实现 三 结果展示 一 概述 在CGAL 5 5版本中 grid simplify point set 中添加了一个新的可选命名参数min points per cell 通过在单元格中添加最小数量的点以便保留一个点
  • C++ deque底层原理

    deque底层原理 一 目的 二 底层实现 三 原理图 四 类结构 五 push back 六 pop back 一 目的 实现双端数组 二 底层实现 双向开口的连续线性空间 三 原理图 四 类结构 class deque protecte
  • nn.embedding笔记

    nn embedding介绍 embedding就是词嵌入 将一个token转化为一个向量 其通常作为nlp模型的一个层 我们通常使用的nn embedding通常分为两种情况 使用别人训练好的nn embedding 这个时候通过nn e
  • HCNA-Storage (H13-611)题库 v4.0

    Exam A QUESTION 1 以下关于华为 RAID2 0 技术 描述正确的是 多选 A 硬盘域中每个存储层的硬盘类型相同 B 硬盘的空间被划分成固定大小的块 C 用户可以为存储池 storage pool 中的每一个存储层分别设置
  • python_基础语法_find_查找字符,不存在则返回-1

    usr bin python3 str1 Runoob example wow str2 exam print str1 find str2 print str1 find str2 5 print str1 find str2 10 不存
  • android 通过usb读取 U盘

    关联 compile com github mjdev libaums 权限设置