关于安卓USB开发(一)文件复制,文件夹创建

news2024/12/22 18:08:40

背景

在安卓应用中,把某个文件,复制到插入的U盘中

开发环境

win10,jdk8+,as4+

测试机型

红米Note11,android13

源码问题

文末将会提供博主整合好的源码项目连接,以供学习交流

注意

本次实战,u盘格式是fat32,其他格式,测试过,并不支持。如果有更好的想法,开源库,可以留言探讨

开源库

libaums link

开始接入

首先第一步,就是一个大坑。国内的文章,一搜索,发现都是可以列入博物馆的了,实战起来的安卓系统版本,也是很低。最近这几年更新的文章,极少。

这里用到的,就是https://github.com/magnusja/libaums这个开源库。这个库最新的版本,是0.10.0,基于kotlin进行开发的,所以还在使用java的项目,就要引入java对kotlin的支持了。

(1)java项目引入kotlin支持

项目根部build.gradle文件,声明
classpath “org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0”,如下图:
在这里插入图片描述
然后在开发模块build.gradle中,引入:

apply plugin: 'kotlin-android'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0"

完成上述步骤后,java就支持kotlin了。

(2)开源库版本的引入方式

博主采用的,是把开源库下载到本地,编译以后,生成aar包,再去引入到开发模块中。
这里真实一波三折,先看三方库开源库的目录:
在这里插入图片描述
下载完以后,在本地运行,发现有很多报错,一一修改以后,才可以正常运行。

报错一

libusbcommunication依赖的libusb编译问题,导致编译失败

报错二

项目依赖的cmake环境,有些高版本的语法需要适配

报错三

主项目中,有些没有适配安卓目标版本的方法,运行的时候报错

以上就是大概的报错类型,处理完成后,才能进行引入

引入的方式,也有很多个,其中,这个开源库作者提供了两个思路:
(1)引入libaums这个库,这个库是比较通用的,但可能有些系统适配不了
(2)引入javafs这个库,这个库是基于libaums进行开发,适配了某些场景
但是通过博主的牺牲时间式引入以后,发现两个库,在我的redmi note 11,安卓13手机上,都不能在U盘创建目录,甚至创建文件也会失败。

因此,博主就开始去看这个库的issues了。

不看不知道,一看,的确有这种情况,而作者也是爱答不理,选择性回复。这就麻了。

最后,通过不断地推敲,查看issues,发现了一种新的引入方式,就是libusbcommunication,这个可不是本地引入的,是作者写好的一个远程库,引入方式如下:

    implementation("me.jahnen.libaums:libusbcommunication:0.3.0", {
        exclude group: "androidx.core", module: "core-ktx"
        exclude group: "androidx.core", module: "core"
        exclude group: "androidx.annotation", module: "annotation-experimental"
    })
    implementation("me.jahnen:java-fs:0.1.4")

这里其实引入的产物,和javafs模块是接近的,不过重要的是,内部可能做了某些处理,目前可以在手机上android13系统跑通,其他系统暂未测试!

上述的引入,对于exclude排除,按项目需要进行排除即可。

(3)开始编写

因为项目中,引入这个库的目的,是为了把文件复制到u盘,所以,这里博主直接封装了一个remote service进行处理,目的是为了不影响原有项目的进程。

而最核心的操作,无非就是一下几个。

(3-1)u盘插入监听,拔出监听

那这个功能实现,用广播即可,相关类:

UsbManager.ACTION_USB_DEVICE_ATTACHED
UsbManager.ACTION_USB_DEVICE_DETACHED
(3-2)u盘读写权限申请

使用USBManager的hasPermission方法,进行判断是否拥有读取该设备的权限,否则进行权限申请,申请的代码如下:

PendingIntent permissionIntent = PendingIntent.getBroadcast(mContext, 0,
                new Intent(USB_PERMISSION), PendingIntent.FLAG_MUTABLE);
getUsbManager().requestPermission(device, permissionIntent);

这里要注意的是,PendingIntent,在安卓高版本的flag。
其中,USB_PERMISSION是一个自定义广播,如果用户同意,系统则会回调该广播action,开发者只在广播接收类中,进行监听该action处理即可。
广播接收核心代码如下:
在这里插入图片描述
大概的意思,就是:
U盘插入–>权限申请
U盘拔出–>资源释放
授权成功–>连接U盘

(3-2)u盘连接

使用三方库提供的类:UsbMassStorageDevice进行设备获取,然后进行初始化,连接即可,示例代码如下:
在这里插入图片描述
可以看到有几个地方注意的:
(1)List是否为空,这个是用于获取操作文件的对象的,后续通过partition.getFileSystem()获取到操作对象进行操作。
(2)数据越界判断

通过上图中的连接操作以后,如无意外,则可以获取到UsbFileSystem操作对象了,如果获取不到,则需要根据设备,进行特定处理。

(3-2)u盘写操作

那么连接成功,又怎样进行写操作呢?
下面是相关的api:

UsbFile root = currentFs.getRootDirectory();

UsbFile[] files = root.listFiles();
for(UsbFile file: files) {
    Log.d(TAG, file.getName());
    if(!file.isDirectory()) {
        Log.d(TAG, file.getLength());
    }
}

UsbFile newDir = root.createDirectory("foo");
UsbFile file = newDir.createFile("bar.txt");

// write to a file
OutputStream os = new UsbFileOutputStream(file);

os.write("hello".getBytes());
os.close();

// read from a file
InputStream is = new UsbFileInputStream(file);
byte[] buffer = new byte[currentFs.getChunkSize()];
is.read(buffer);

详细的用法,可以参考开源库主页。
而对于某些设备,不能写入的情况,正如文章开头时所说的,通过引入方式的切换,进行尝试吧!

有更好的想法,欢迎评论区留言

源码地址链接:https://pan.baidu.com/s/1fpg1ZbboNxMK74dyf_783Q
提取码:r8k9
在这里插入图片描述
that’s all-----------------------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

呼市经开区建设服务项目水、电能耗监测 数采案例

呼市经开区建设服务项目水、电能耗监测数采案例 一、项目背景及需求 项目地点位于内蒙古呼和浩特市,呼市数字经开区建设服务项目。属于企业用能数据采集、能耗监测板块子项目。 针对水、电能耗数据采集,结合现场客观因素制约,数据采集方面存…

onecloud刷CasaOS系统后如何安装内网穿透实现公网访问本地文件

文章目录 1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 2月底,玩客云APP正式停止运营,不再提供上传、云添加功能。3月初,有用户进行了测试,局域网内的各种服务还能继续使用,但…

【系统架构师】-第19章-大数据架构设计理论与实践

四个特点: 大规模(Volume)、高速度(Velocity)和多样化(Variety),价值(Value)。 五个问题: 异构性(Heterogeneity)、规模…

如何高效接入 Flink: Connecter / Catalog API 核心设计与社区进展

本文整理自阿里云实时计算团队 Apache Flink Committer 和 PMC Member 任庆盛在 FFA 2023 核心技术专场(二)中的分享,内容主要分为以下四部分: Source APISink API将 Connecter 集成至 Table /SQL APICatalog API 在正式介绍这些 …

安全工程师说telnet

啥是telnet telnet 命令通常用来远程登录。 telnet 程序是基于 TELNET 协议的远程登录客户端程序。Telnet 协议是 TCP/IP 协议族中的一员,是 Internet 远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的 能力。在终端使用者的电…

如何快速接入Claude 3 haiku这款Claude3系列中最经济快速的模型?

3 月 4 日,被称为 OpenAI 最强竞争对手的大模型公司 Anthropic 宣布推出 Claude3 系列模型,与 Gemini 类似,模型按照大小分为三个:Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。Opus 目前在官方发布的测试成绩中全方位超越…

NeRF——基于神经辐射场的三维场景重建和理解

概述 三维重建是一种将物理世界中的实体转换为数字模型的计算机技术。其基本概念是通过对物理世界中的物体或场景进行扫描或拍摄,并使用计算机算法将其转换为三维数字模型。抽象意义上的三维模型指的是:形状和外观的组合,并且可以渲染成不同…

ClickHouse中的设置的分类

ClickHouse中的各种设置 ClickHouse中的设置有几百个,下面对这些设置做了一个简单的分类。

【STC8A8K64D4开发板】第2-16讲:可编程计数器阵列PCA

第2-16讲:可编程计数器阵列PCA 学习目的掌握STC8A8K64D4系列PCA可编程计数器阵列的原理。掌握4个PCA外设相关寄存器配置及程序设计。 PCA概述 PCA全称是可编程计数器阵列(Programable Counter Array),其中P表示可以编程控制、C表…

iTOP-3A5000主板龙芯自主指令系统 (LoongArch)的LA464微结构

性能强 采用全国产龙芯3A5000处理器,基于龙芯自主指令系统 (LoongArch)的LA464微结构,并进一步提升频率,降低功耗,优化性能。 桥片 采用龙芯 7A2000,支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA&…

【PyTorch】成功解决TypeError: iteration over a 0-d tensor

【PyTorch】成功解决TypeError: iteration over a 0-d tensor 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您…

【CSS】Vue2使用TailwindCSS方法及相关问题

一.安装 1.npm安装TailwindCSS npm install tailwindcssnpm:tailwindcss/postcss7-compat tailwindcss/postcss7-compat postcss^7 autoprefixer^9 2.创建配置文件 npx tailwindcss init 3.创建postcss.config.js文件 // postcss.config.js module.exports {plugins: {t…

网络统一监控运维管理解决方案

网络统一监控运维管理解决方案 1. 构建完善的网络运维体系:通过组织、流程、制度的完善、支撑手段的建设,构建低成本高效率的IT运营体系,推动IT运营工作自动化、智能化、一体化化发展。 2. 构建网络一体化监控能力:构建从设备、数…

C++ 万物起源:类与对象(一)

目录 一、C与C语言的区别 1.1类的引入 二、C类 2.1类的概念与定义 2.2类的访问限定符与封装 2.2.1C中struct和class的区别 2.3封装 2.4类的作用域与实例化 三、类对象模型 3.1类对象的存储模式 3.2结构体内存对齐规则 一、C与C语言的区别 C语言是面向过程的&#xf…

刚刚!3.15晚会点名AI换脸诈骗,曝光主板机黑产,2000元成本可20部手机同时发布

1991 年 3 月 15 日,「消费者之友专题晚会」登上央视的大荧屏,从那一年开始,「3.15 晚会」就成为了像春节联欢晚会一样的固定节目,同样聚集了亿万国人的关注。多年来,围绕老百姓衣食住行方方面面,无数家企业…

AWTK slider_circle 控件发布

slider_circle 控件。 主要特色: 支持正向和反向支持设置滑块的半径支持背景线宽和颜色支持前景线宽和颜色支持设置是否显示值的文本支持设置起始角度和结束角度支持设置格式化值的格式字符串支持使用图片填充背景和前景 界面效果: 注意: …

Android FrameWork 学习路线

目录 前言 学习路线: 1.基础知识 2、AOSP 源码学习 3. AOSP 源码编译系统 4. Hal与硬件服务 5.基础组件 6. Binder 7. 系统启动过程分析 8. 应用层框架​编辑 9. 显示系统 10. Android 输入系统 11. 系统应用 前言 Android Framework 涉及的行业相当广…

Spring Boot Actuator介绍

大家在yaml中经常见到的这个配置 management: endpoints: web: exposure: #该配置线上需要去掉,会有未授权访问漏洞 include: "*" 他就是Actuator! 一、什么是 Actuator Spring Boot Actuator 模块提供了生产级别…

享元模式实战运用

前言 享元模式,将程序中可能反复创建且种类固定的对象缓存起来,以便共享。 通常使用一个享元工厂来创建和缓存享元对象,保证享元类的一个实例只能被创建一次,客户端获取享元对象时,先查看对象是否已经创建&#xff0…

各地省级网信部门受理数据出境安全评估申报、个人信息出境标准合同备案工作的联系方式

各地省级网信部门受理数据出境安全评估申报、个人信息出境标准合同备案工作的联系方式 为了指导和帮助数据处理者规范有序申报数据出境安全评估、备案个人信息出境标准合同,国家网信办将各地省级网信部门接收申报材料、备案材料的办公地址和联系电话公布如下&#x…