Android 监听U盘OTG挂载状态

本篇博客介绍下在Android系统中,如何监听和获取U盘OTG挂载状态

在Android中插入U盘时,系统会先准备U盘并检查是否有错误,检查完成后才会把U盘挂载到系统中。因此U盘插入和检查U盘错误这个两个阶段都不能算是U盘挂载状态,我们要获取的状态是检查完成后挂载的状态,也就是USB_DISK_MOUNTED这个广播

class UsbDiskReceiver(private val onUsbDiskMountState: ((Int) -> Unit)? = null) :BroadcastReceiver() {companion object {private val TAG = UsbDiskReceiver::class.java.simpleNameconst val USB_DISK_MOUNTED = 1const val USB_DISK_UNMOUNTED = 2}override fun onReceive(context: Context?, intent: Intent?) {val action = intent?.actionLog.i(TAG, "onReceive: $action")if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {onUsbDiskMountState?.invoke(USB_DISK_MOUNTED)Log.i(TAG, "onReceive: media mounted")} else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) {onUsbDiskMountState?.invoke(USB_DISK_UNMOUNTED)Log.i(TAG, "onReceive: media unmounted")}}
}

在onCreate中注册广播,在onDestroy中注销广播。有一点要注意:除了ACTION_MEDIA_MOUNTEDACTION_MEDIA_UNMOUNTED之外还需要添加usbDeviceStateFilter.addDataScheme("file")这句,否则接收不到广播

private lateinit var mUsbReceiver: BroadcastReceiveroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)...mUsbReceiver = UsbDiskReceiver { usbDiskMountState ->when (usbDiskMountState) {UsbDiskReceiver.USB_DISK_MOUNTED -> // todo otg is mountedUsbDiskReceiver.USB_DISK_UNMOUNTED -> // todo otg is unmounted}}val usbDeviceStateFilter = IntentFilter()usbDeviceStateFilter.addAction(Intent.ACTION_MEDIA_MOUNTED)usbDeviceStateFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED)usbDeviceStateFilter.addDataScheme("file")registerReceiver(mUsbReceiver, usbDeviceStateFilter)
}override fun onDestroy() {super.onDestroy()unregisterReceiver(mUsbReceiver)
}

USB_DISK_MOUNTED广播不是粘性广播,也就是说如果在注册广播前U盘就已经是挂载状态的话,是接收不到广播的,所以需要通过查看设备事件的方式来获取状态

U盘在挂载后会在/proc/mounts文件中生成特定的日志,比如:

/dev/block/vold/public:8,1 /mnt/media_rw/A23D-1C08 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

我们可以从日志中找到类似/mnt/media_rw/A23D-1C08 vfat的信息,这条信息表示的就是U盘挂载的虚拟目录,所以我们可以通过查找/mntvfat的方式来获取挂载状态

public String getUsbDiskPath() {String filePath = "/proc/mounts";File file = new File(filePath);List<String> lineList = new ArrayList<>();try (InputStream inputStream = new FileInputStream(file);InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {String line;while ((line = bufferedReader.readLine()) != null) {if (line.contains("vfat")) {lineList.add(line);}}} catch (IOException e) {Log.e(TAG, "searchPath: ", e);}if (lineList.size() > 0) {String editPath = lineList.get(lineList.size() - 1);int start = editPath.indexOf("/mnt");int end = editPath.indexOf(" vfat");return editPath.substring(start, end);}return null;
}

在onCreate中判断即可

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)...if (getUsbDiskPath() != null) {// todo otg is mounted}
}

参考

http://fengwanxingzhou.coding.me/Android8.0%E7%9B%91%E5%90%ACU%E7%9B%98%E6%8F%92%E5%85%A5%E6%8B%94%E5%87%BA%E4%BA%8B%E4%BB%B6/

https://www.jianshu.com/p/b2425efca483

Android 监听U盘OTG挂载状态相关推荐

  1. Android监听软键盘开启关闭状态

    最近公司项目有一个功能点是监听软键盘的打开关闭状态,然后来展开不同的布局,后来在StackOverFlow上面找到一位大神提供了解决办法,大致做法如下: 在你需要监听状态的界面activity或者fr ...

  2. Android 监听外部U盘插入

    1.在AndroidManifest.xml 加入读取外部存储器权限 <uses-permission android:name="android.permission.READ_EX ...

  3. Android 监听 WiFi 开关状态

    Android 监听 WiFi 开关状态 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854309 本文出自[赵彦军的博客] ...

  4. android 监听网络状态

    今天,讲讲怎么监听手机网络状态的改变. 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:nam ...

  5. Android监听个人热点(Hotspot)打开关闭状态

    Android监听个人热点(Hotspot)打开关闭状态 package com.android.systemui.statusbar.policy;import android.content.Br ...

  6. android 监听手机电量变化

    今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...

  7. android 监听屏幕是否锁屏

    今天,简单讲讲如何监听手机屏幕是否锁屏. 实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可 ...

  8. Android锁屏界面监听按键,Android 监听锁屏/开屏事件

    1. 两种方案 (1) 监听BroadcastReceiver (2)获取PowerManager事件 2.  BroadcastReceiver 2.1. 事件 总共有3个事件: Intent.AC ...

  9. Android监听消息(二)——电话及短信监听

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2747字,预计阅读6分钟 前言 前面一篇<Android监听消息(一)--应用消息捕获>我们使用Notificat ...

最新文章

  1. Loadrunner进行md5加密方法
  2. 7805输入电流有要求吗_PLC输入输出接线全解析,值得收藏!
  3. iOS经典面试题之分析self class与super class的区别和底层原理
  4. 关于BEA-000402和BEA-000438(没有进程来读取写入管道的数据)
  5. Android模拟器无法启动
  6. python利器-bluepy 一款python封装的BLE利器简单介绍
  7. Java 基础知识整理 (待整理)
  8. 玩转Windows系列之bat脚本
  9. 《IE恶搞迷》扩展功能使用
  10. qq音乐Java应用240320_TM320240E中文资料及应用电路
  11. matlab 双均线,一个典型的双均线策略
  12. 智邦科技亮相2019 ODCC峰会,为开放网络提供弹性解决方案
  13. 两步实现在C代码中快速集成gtest进行单元测试
  14. RestTemplate使用实战-exchange方法讲解-HTTP请求
  15. 异或鉴相器 matlab 数字鉴相器,一款采用CPLD的光伏并网逆变器锁相及保护电路设计...
  16. 目录操作的相关API 和 获取文件的属性信息
  17. Python | datetime与time模块
  18. 小森生活服务器维护公告,小森生活2021年5月11日停服更新公告
  19. C语言-1(第一天学C语言)
  20. 解决win10系统桌面应用图标显示不出来的问题

热门文章

  1. 桌面级群控机器人CoCube探索-2022-
  2. C8051F340的USBXpress开发包USB通信设计
  3. 用Tushare实现上证综指日对数收益率的计算
  4. 2018年大学生服务外包创新创业大赛参赛感悟
  5. 电子版标书怎么做?有哪些特点?
  6. 管理员身份获得 SYSTEM 权限的四种方法
  7. c++用宏定义和函数来求圆的面积,半径可为表达式
  8. 基于javaEE的网上租鞋管理系统的设计与实现
  9. km之路--002 easyui 一
  10. 计算机类公务员 真题解析,公务员考试c类计算机考试真题及答案