android6.0 外部存储设备插拔广播以及获取路径(U盘)

转载 2017年03月27日 11:38:14

Android 6.0接受不到广播:ACTION_MEDIA_MOUNTED解决方案:


转自:http://blog.csdn.net/zhouchengxi/article/details/53982222

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
  • 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
  • 1
  • 2

但是我发现U盘一插进去就发出这个广播,而不是等到U盘加载好后发出这个广播,于是我又去研究其他的方法。 
在查询Android 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
  • 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
  • 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
  • 1
  • 2
  • 3
  • 4

当插入U盘后显示的Logcat如下所示: 
插入U盘的Logcat 
U盘的state从STATE_UNMOUNTED→STATE_MOUNTED 
当拔出U盘后显示的Logcat如下所示: 
拔出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
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

相关文章推荐

Android 获取外接储存的设备路径(如挂载的U盘)

插入U盘时获取U盘路径 开机时获取挂载U盘的路径
  • Zou_pl
  • Zou_pl
  • 2017-06-26 20:05
  • 1397

android设备应用读取外接U盘设备方法

废话不多说,上正文,由于现在android移植到各种平台上,很多android设备都可以支持U盘,但android API目前只有SD卡的获取,没有U盘的获取,支持U盘的设备也是各个厂商自己折腾,不经...

安卓-SD卡、U盘插拔广播详解

filter = new IntentFilter(); //已拔掉外部大容量储存设备发出的广播(比如SD卡,或移动硬盘), //不管有没有正确卸载都会发出此广播filter.addAction(I...

android中对u盘以及tf卡插入的广播监听

public class UsbStateReceiver extends BroadcastReceiver { //BroadcastReceiver private String T...

Android 6.0区别U盘和SD卡设备

public static boolean isSdcardExists(Context context) { StorageManager storageManager = Stora...

Android6.0 storage目录sd卡存储的路径创建

之前一直很疑惑,android6.0上sd卡挂载storage下的sd卡路径是什么时候创建的。 因为挂载sd卡的PublicVolume,负责创建mount路径,然后挂载。 接着会创建几个fuse...

Android 6.0上sdcard和U盘路径获取和区分

Android6.0上会根据卡的种类和卡的挂载状态来动态生成挂载路径,所以之前写固定路径的办法不可用,最后通过网上查找和分析android源码,通过反射获取到路径,并且进行了正确区分,代码如下: /...

android6.0 外部存储设备插拔广播以及获取路径(U盘)

这里我将U盘作为例子来说明解析。android4.1版本时U盘插拔时的广播在android4.1时我们可以用以下的BroadcastReceiver接收U盘广播。 <action a...

Android 机顶盒中获取U盘的卷标

最近,在开发Android 机顶盒中,遇到需要打印U盘的卷标问题。通过查阅资料,记录一下学习过程。 卷标,用通俗的话来说,就是U盘的名称 如图:在windows系统中,F:为盘符        ...

Android开发-动态获取电视盒子U盘的插拔状态和路径

最近公司的盒子端扩展一个新功能:插入U盘后自动幻灯片播放U盘指定文件夹下的所有图片,拔出U盘后恢复视频播放。直接上代码:一、注册广播监听U盘的插拔1.1、注册 IntentFilter intentF...
  • luuzhu
  • luuzhu
  • 2016-11-15 16:33
  • 1534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)