android6.0 外部存储设备插拔广播以及获取路径(U盘)【转】
本文转载自: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盘)【转】的更多相关文章
- Android监听外部存储设备的状态(SD卡、U盘等等)
近期在项目中须要对外部存储设备的状态进行监听,所以整理了此笔记,以便日后查看. 外部存储设备的状态变化时发出的广播 对照不同状态下的广播 1. 插入外部SD卡时: 2. 移除外部SD卡时: 3. 连接 ...
- Gallery学习————检测手机中是否存在外部存储设备
在缓存数据的时,有时候会出现没有外部存储设备的情况,所以需要检测是否存在外部存储设备 /** * 检测外部存储设备 * * @param requireWriteAccess * @return */ ...
- USB 设备插拔事件处理
Windows 系统下,设备连接至电脑或从电脑移除,系统会广播一条 WM_DEVICECHANGE 消息到所有应用程序,在程序的消息处理函数中可以对事件进行相应. 1: class C ...
- Android开发学习---如何写数据到外部存储设备(sd卡),Environment.getExternalStorageDirectory,怎么获取sd卡的大小?
本文主要介绍如何写数据到sd卡,这里主要到的技术是Environment中的方法. 1. 2.实现代码: /datasave/src/com/amos/datasave/savePasswordSer ...
- 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)
在 .NET Framework 4.7 以前,WPF 程序的触摸处理是基于操作系统组件但又自成一套的,这其实也为其各种各样的触摸失效问题埋下了伏笔.再加上它出现得比较早,触摸失效问题也变得更加难以解 ...
- Android6.0 新特性详解
一 运行时权限 Android6.0 引入了一个新的应用权限模型,期望对用户更容易理解,更易用和更安全.该模型将标记为危险的权限从安装时权限(Install Time Permission)模型 移动 ...
- Android外部存储
WeTest 导读 外部存储作为开发中经常接触的一个重要系统组成,在Android历代版本中,有过许许多多重要的变更.我也曾疑惑过,为什么一个简简单单外部存储,会存在存在这么多奇奇怪怪的路径:/sdc ...
- QTC++监控USB插拔
#if defined(Q_OS_WIN) #include <qt_windows.h> #include <QtCore/qglobal.h> #include <d ...
- Dapr 的 gRPC组件 (又叫可插拔组件) 的提案
Dapr 在1.9 版本中的提案,计划在 Dapr Runtime 中组件采用 外部 gRPC 组件: https://github.com/dapr/dapr/issues/3787 ,针对这个 g ...
随机推荐
- GitHub for window 使用教程
Git是目前最先进的分布式版本控制系统,作为一个程序员,我们需要掌握其用法. 一:下载GitHub for Windows 二:安装GitHub 下载之后点击进行安装过程,安装之后桌面上会有两个 ...
- web service json 数组解析
boolean workexpMark = true; // 美发师工作经历json数组解析 org.json.JSONObject jsonObject = new org.j ...
- RS-232针脚(8 pin)
1 CD Carrier Detect 载波检测 2 RXD Receive Data 接收 3 TXD Transmit Data 发送 4 DTR Data Terminal Ready ...
- start with git
Start with git 1.what is GitHub? GitHub is a code hosting platform for version control and collabora ...
- 【转】python测试开发面试题
出处:http://my.oschina.net/u/1433482/blog/467954?fromerr=WrfxL2Kw 试卷时间 60分钟,请不要在试卷上作答,用A4纸做答题纸作答. 一,中文 ...
- linux 改动时间和日期date
查看日期和时间 date 改动日期 date -s 月/日/年 date -s 08/15/2015 改动时间 date -s 09:29:33 写入CMOS sudo clock -w 利用ssh同 ...
- web 网页截取图片
关于在UIwebview上添加滚动图片 两种滚动手势会混淆,应为webview有webview.scrollview的属性 故参照昨天的随笔 scrollview嵌套解决方案. 本篇随笔主要讲循环使用 ...
- Unity3d 摇杆奖励
单个单元: publicclass RockerSingle : MonoBehaviour { // 枚举.类别 RockerType rockerType; //是否有效,最上面的为无效,即为f ...
- HYSBZ - 1799 self 同类分布
self 同类分布 HYSBZ - 1799 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.Sample Input 10 19 Sample Output 3 Hint [约束条件] ...
- And Then There Was One(约瑟夫环)
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...