本文转载自: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. Selenium3.X 与 Javascript (Nodejs)

    传送门 # 官网网站 http://docs.seleniumhq.org/download/ # API DOC http://goo.gl/hohAut # 慕课网教程http://www.imo ...

  2. Shader编程教程

    2010-05-13 11:37:14|  分类: DirectX 3D学习|举报|字号 订阅     Shader编程教程1-环境光照 您好,欢迎来到XNA Shader教程1.我的名字叫Petri ...

  3. C# SqlBulkCopy类批量导入数据

    特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...

  4. Visual Assist X安装路径

    C:\Users\系统用户名\AppData\Local\Microsoft\VisualStudio\VS版本号\Extensions\VAX插件目录\

  5. leetCode 50.Pow(x, n) (x的n次方) 解题思路和方法

    Pow(x, n) Implement pow(x, n). 思路:题目不算难.可是须要考虑的情况比較多. 详细代码例如以下: public class Solution { public doubl ...

  6. 从零開始学Swift之Hello World进化版

    上节课,也就是昨晚啦,我们学习到从零開始学Swift之Hello World.那一节仅仅有一句代码,大家会认为不够过瘾. 那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, s ...

  7. Shiro 认证失败返回JSON

    Shiro框架默认认证失败后会返回到登录页面,在前后端分离项目中,需要返回JSON数据,以便前端或者app端解析处理. 实现方式: 1. 扩展shiro框架的UserFilter类,重写redirec ...

  8. 关于reset.css的那些事

    分析过程:body: 发现在没有填写任何内容的情况下是没有margin 的  只有在加入了文字或者div中以后才有了margin(废话)那么 我想问一下 body的padding 默认的有吗??在哪里 ...

  9. Linux 技巧:让进程在后台运行的可靠方法

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大 ...

  10. CentOS升级Python2.6到Python2.7

    个人博客:https://blog.sharedata.info/ 貌似CentOS 6.X系统默认安装的Python都是2.6版本的?平时使用以及很多的库都是要求用到2.7版本或以上,所以新系统要做 ...