本文转载自:https://blog.csdn.net/zhouchengxi/article/details/53982222

这里我将U盘作为例子来说明解析。

android4.1版本时U盘插拔时的广播

在android4.1时我们可以用以下的BroadcastReceiver接收U盘广播。

<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_CHECKING" />
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_REMOVED" /> <data android:scheme="file" />
</intent-filter>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

android6.0版本时U盘插拔时的广播

但是由于业务需求,当换成6.0的安卓系统后,会发现接收不到U盘插拔的广播。 
在此之前我尝试了使用USBManager

        intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
  • 1
  • 2

但是我发现U盘一插进去就发出这个广播,而不是等到U盘加载好后发出这个广播,于是我又去研究其他的方法。 
在查询安卓6.0的源码发现了VolumeInfo这个类,记录存储设备的状态信息。 
VolumeInfo类下面有几个常量表示当前的存储设备的状态。

public static final int STATE_UNMOUNTED = 0;
public static final int STATE_CHECKING = 1;
public static final int STATE_MOUNTED = 2;
public static final int STATE_MOUNTED_READ_ONLY = 3;
public static final int STATE_FORMATTING = 4;
public static final int STATE_EJECTING = 5;
public static final int STATE_UNMOUNTABLE = 6;
public static final int STATE_REMOVED = 7;
public static final int STATE_BAD_REMOVAL = 8;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

以及广播的Action以及接受广播的key

public static final String ACTION_VOLUME_STATE_CHANGED =
"android.os.storage.action.VOLUME_STATE_CHANGED";
public static final String EXTRA_VOLUME_ID =
"android.os.storage.extra.VOLUME_ID";
public static final String EXTRA_VOLUME_STATE =
"android.os.storage.extra.VOLUME_STATE";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里我做了一个简单的程序用来检验对U盘插拔的状态进行检测。

if(action.equals("android.os.storage.action.VOLUME_STATE_CHANGED")){
int i = intent.getIntExtra(VolumeInfo.EXTRA_VOLUME_STATE,VolumeInfo.STATE_UNMOUNTED);
Log.d("zcx","action="+action+" state="+i);
}
  • 1
  • 2
  • 3
  • 4

当插入U盘后显示的Logcat如下所示: 
 
U盘的state从STATE_UNMOUNTED→STATE_MOUNTED 
当拔出U盘后显示的Logcat如下所示: 
 
U盘的state从STATE_EJECTING →STATE_UNMOUNTED→STATE_BAD_REMOVAL。

android6.0版本获取U盘路径

由于6.0版本会根据U盘的型号来划分各自的路径,我的方法是通过StorageManager的getVolumes()就能取得外部设备的状态信息,从而获取到U盘路径。 
VolumeInfo中包含Type以及DiskInfo信息。

    public static final int TYPE_PUBLIC = 0;
public static final int TYPE_PRIVATE = 1;
public static final int TYPE_EMULATED = 2;
public static final int TYPE_ASEC = 3;
public static final int TYPE_OBB = 4;
  • 1
  • 2
  • 3
  • 4
  • 5

U盘的Type是TYPE_PUBLIC,然后再通过DiskInfo的isUsb()方法即可判断当前是否为U盘。

List<VolumeInfo> list = mStorageManager.getVolumes();
for (VolumeInfo volumeInfo : list) {
if (volumeInfo.getType() == 0) {
DiskInfo diskInfo = volumeInfo.getDisk();
if (diskInfo != null && (diskInfo.isUsb())) {
int i = volumeInfo.getState();
//volumeInfo.getPath()通过这个方法就能取得路径
//这里的Volume就是U盘的信息了
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

android6.0 外部存储设备插拔广播以及获取路径(U盘)【转】的更多相关文章

  1. Android监听外部存储设备的状态(SD卡、U盘等等)

    近期在项目中须要对外部存储设备的状态进行监听,所以整理了此笔记,以便日后查看. 外部存储设备的状态变化时发出的广播 对照不同状态下的广播 1. 插入外部SD卡时: 2. 移除外部SD卡时: 3. 连接 ...

  2. Gallery学习————检测手机中是否存在外部存储设备

    在缓存数据的时,有时候会出现没有外部存储设备的情况,所以需要检测是否存在外部存储设备 /** * 检测外部存储设备 * * @param requireWriteAccess * @return */ ...

  3. USB 设备插拔事件处理

            Windows 系统下,设备连接至电脑或从电脑移除,系统会广播一条 WM_DEVICECHANGE 消息到所有应用程序,在程序的消息处理函数中可以对事件进行相应. 1: class C ...

  4. Android开发学习---如何写数据到外部存储设备(sd卡),Environment.getExternalStorageDirectory,怎么获取sd卡的大小?

    本文主要介绍如何写数据到sd卡,这里主要到的技术是Environment中的方法. 1. 2.实现代码: /datasave/src/com/amos/datasave/savePasswordSer ...

  5. 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)

    在 .NET Framework 4.7 以前,WPF 程序的触摸处理是基于操作系统组件但又自成一套的,这其实也为其各种各样的触摸失效问题埋下了伏笔.再加上它出现得比较早,触摸失效问题也变得更加难以解 ...

  6. Android6.0 新特性详解

    一 运行时权限 Android6.0 引入了一个新的应用权限模型,期望对用户更容易理解,更易用和更安全.该模型将标记为危险的权限从安装时权限(Install Time Permission)模型 移动 ...

  7. Android外部存储

    WeTest 导读 外部存储作为开发中经常接触的一个重要系统组成,在Android历代版本中,有过许许多多重要的变更.我也曾疑惑过,为什么一个简简单单外部存储,会存在存在这么多奇奇怪怪的路径:/sdc ...

  8. QTC++监控USB插拔

    #if defined(Q_OS_WIN) #include <qt_windows.h> #include <QtCore/qglobal.h> #include <d ...

  9. Dapr 的 gRPC组件 (又叫可插拔组件) 的提案

    Dapr 在1.9 版本中的提案,计划在 Dapr Runtime 中组件采用 外部 gRPC 组件: https://github.com/dapr/dapr/issues/3787 ,针对这个 g ...

随机推荐

  1. Ubuntu安装CodeBlocks

    访问 https://launchpad.net/~damien-moore/+archive/ubuntu/codeblocks-stable,找到页面上加粗的那一段英文(以“ppa:”开头),如“ ...

  2. Spring事务管理之编程式事务管理

    © 版权声明:本文为博主原创文章,转载请注明出处 案例:利用Spring的编程式事务管理模拟转账过程 数据库准备 -- 创建表 CREATE TABLE `account`( `id` INT NOT ...

  3. vmware下为CentOS7设置静态IP

    vmware下为CentOS7设置静态IP可以分为三个主要步骤: 1. 在windows中设置VMWare创建的虚拟网络 2. 设置VMWare为静态IP 3. 设置CentOS7的网络为静态IP 首 ...

  4. k8s调度-指定node

    1.给node加标签 kubectl label nodes k8s-slave2 slave= 2.查看标签 [root@k8s_master centos7]# kubectl describe ...

  5. bg、fg、nohup

    1.bg 执行如下命令: tail -f log.txt 此时程序是在前台运行的,将程序放到后台执行,按ctrl+z,执行结果如下: []+ Stopped tail -f log.txt 执行bg命 ...

  6. IDEA 去掉 ALT + / 自动补全

    取消掉Alt + / 自动补全 setting -> keymap -> main menu -> code -> completion -> cyclic Expand ...

  7. shiro设置session超时

    通过api:Shiro的Session接口有一个setTimeout()方法 //登录后,可以用如下方式取得session SecurityUtils.getSubject().getSession( ...

  8. Linux与本地上传下载文件

    当出于安全原因,客户的服务器不允许使用windows第三方插件连接的时候,本地windows跟远程的linux服务器进行文件的上下传受到了限制,此时可以在linux服务器上安装一个工具:lrzsz.安 ...

  9. 源码安装Apache,报错:Cannot use an external APR with the bundled APR-util

    一般在第一次源码安装是没有问题的,在版本变化情况下在次源码安装可能会遇到此问题: apache2.0.x与apache2.2.x在apr有很大区别,前者为依赖公用apr,后者依赖于自身的apr.一般前 ...

  10. python+pip+adb

    最近开始玩python,用它写一些小程序游戏的辅助,现在做下总结 下面进入正文. 本文适用对象为WIN10系统,安卓用户.目的在于让丝毫没有接触过Python的小伙伴都能成功运行,如果你恰好是这样的对 ...