Android存储设备(U盘,SD卡)状态监测

   

我们是以DV6300-T的平台来做测试的,发现有2种方式来检测android中external media(包括SD卡,USB)的状态。

一种是使用StorageListener监听,还有一种是使用广播的方式。

DV6300-T的存储设备相关分析:

相关的类主要有:
RecordDeviceManager   DeviceStateListener  ChoiceRecordDevice
主要采用了观察者模式对设备拔插的监控来触发各种不同情况:

比如在DTVLauncher中就增加了观察者mRecordDeviceListener,在检测到设备拔出时候会停止时移或录制等。

第一种监测方式:

使用StorageManager  IMountService  StorageEventListener等类来控制(可以参考DV6300-T的源码):

StorageManager mStorageManager = (StorageManager)context.getSystemServic(Context.STORAGE_SERVICE);
mStorageManager.registerListener(mStorageListener);
IMountService mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));

StorageEventListener mStorageListener = new StorageEventListener() {
    @Override
    public void onStorageStateChanged(String path, String oldState,String newState) {
        if(path.equals(mRecordDeviceStorageName)) {

Log.i("usb",path+":"+oldState+"--->"+"newState");

if(newState.equals(Environment.MEDIA_UNMOUNTED)) {
                notifyObservers();
            }
        }
  }
};

我们可以根据onStorageStateChanged方法中的3个参数来判断当前的状态,根据path路径来判断是SD卡(/mnt/sdcard)还是USB设备(/mnt/sda)。

比如在DV6300-T上,我们打印如下:

插SD卡:
会调用3次onStorageStateChanged:参数分别是:
/mnt/sdcard/extend_sd : removed--->unmounted
/mnt/sdcard/extend_sd : unmounted--->checking
/mnt/sdcard/extend_sd : checking--->mounted

插U盘:
/mnt/sda1 :unmounted--->checking
/mnt/sda1 :checking--->mounted
拔SD卡:
/mnt/sdcard/extend_sd : mounted--->unmounted
/mnt/sdcard/extend_sd : unmounted--->removed

拔U盘:
/mnt/sda1 :mounted--->unmounted
/mnt/sda1 :unmounted--->removed
/mnt/sda1 :removed--->unmounted

第2种监测方式(广播方式):

class UsbReceiver{
   private BroadcastReceiver mReceiver;
   UsbReceiver(Context context){
      mReceiver = new BroadcastReceiver(){
      @Override
      public void onReceive(Context context, Intent intent) {

//intent.getAction());获取存储设备当前状态

Log.i("usb","BroadcastReceiver:"+intent.getAction());

//intent.getData().getPath());获取存储设备路径
         Log.i("usb","path:"+intent.getData().getPath());

}

};
  
      IntentFilter filter = new IntentFilter();
      filter.addAction(Intent.ACTION_MEDIA_SHARED);//如果SDCard未安装,并通过USB大容量存储共享返回
      filter.addAction(Intent.ACTION_MEDIA_MOUNTED);//表明sd对象是存在并具有读/写权限
      filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);//SDCard已卸掉,如果SDCard是存在但没有被安装
      filter.addAction(Intent.ACTION_MEDIA_CHECKING);  //表明对象正在磁盘检查
      filter.addAction(Intent.ACTION_MEDIA_EJECT);  //物理的拔出 SDCARD
      filter.addAction(Intent.ACTION_MEDIA_REMOVED);  //完全拔出
      filter.addDataScheme("file"); // 必须要有此行,否则无法收到广播   
      context.registerReceiver(mReceiver, filter);
 }
}

通过广播传递过来的intent.getData()会得到一个uri,然后uri.getPath()就是插上usb的路径,可以记录下每次插上或者拔出的usb的路径,
比如我们在DV6300平台上:
U盘就返回/mnt/sda1,而SD卡返回/mnt/sdcard/extend_sd
而getAction会获取当前状态,如下描述:

U盘插入:
intent.getAction() == android.intent.action.MEDIA_UNMOUNTED
intent.getAction() == android.intent.action.MEDIA_CHECKING
intent.getAction() == android.intent.action.MEDIA_MOUNTED
U盘拔出:
intent.getAction() == android.intent.action.MEDIA_EJECT
intent.getAction() == android.intent.action.MEDIA_UNMOUNTED
intent.getAction() == android.intent.action.MEDIA_UNMOUNTED
intent.getAction() == android.intent.action.MEDIA_REMOVED
intent.getAction() == android.intent.action.MEDIA_UNMOUNTED

SD卡插入:
intent.getAction() == android.intent.action.MEDIA_UNMOUNTED
intent.getAction() == android.intent.action.MEDIA_CHECKING
intent.getAction() == android.intent.action.MEDIA_MOUNTED
SD卡拔出:
intent.getAction() == android.intent.action.MEDIA_EJECT
intent.getAction() == android.intent.action.MEDIA_UNMOUNTED
intent.getAction() == android.intent.action.MEDIA_UNMOUNTED
intent.getAction() == android.intent.action.MEDIA_REMOVED

参考博文:

android 监控usb插拔

Android 框架层为IMountService 增加新接口

android usb挂载分析---MountService启动

Android深入浅出之Binder机制

Android 2.3 SD卡挂载流程浅析(七)

转载于:https://www.cnblogs.com/olvo/archive/2012/05/24/2516787.html

广播的接收与U盘广播相关推荐

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

    android4.1版本时U盘插拔时的广播 在android4.1时我们可以用以下的BroadcastReceiver接收U盘广播. 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 a ...

  2. BroadcastReceiver 接收系统短信广播

    BroadcastReceiver 接收系统短信广播 /* 注册广播:    * |--静态注册  (在AndroidManifest .xml 中注册)  * <receiver androi ...

  3. Andriod广播注册接收过程简析

    为了利于各个进程应用之间的通信,android提供了一个很方便的处理方式:广播机制.广播机制顾名思义,就是广播发送者无需判断具体某个接收者的存在,把广播发送出去,任务即完成.这样保证了有效通信的同时又 ...

  4. UniApp:Vue特性篇:vue2.0的广播与接收(待详细了解)

    this.$eventHub Vue2.0 事件的广播与接收(观察者模式) Vue2.0中可以使用$emit , $on, $off 分别来分发.监听.取消监听事件.官方的给出的最简单的升级建议是使用 ...

  5. 2021-04-13 由于网络配置导致UDP广播通信接收信息异常问题

    机器一网络配置: IP地址: 192.168.200.1 子网掩码: 255.255.0.0 网关: 192.168.220.1 DNS服务器: DHCP客户端ID:机器一网络配置: IP地址: 19 ...

  6. 买了一个 RTL2832U 玩,听听电台广播,接收附近无线信号

    最近在了解SDR后,买了一个入门的 RTL2832U 玩,可以听电台广播,接收附近无线信号. 就是图片这个: 具体SDR知识可以看知乎:https://zhuanlan.zhihu.com/p/981 ...

  7. android java广播,[原]Android应用程序发送广播(sendBroadcast)的过程分析

    前面我们分析了Android应用程序注册广播接收器的过程,这个过程只完成了万里长征的第一步,接下来它还要等待ActivityManagerService将广播分发过来.ActivityManagerS ...

  8. android广播代码汇总二__有序广播

    分析 普通广播(Normal Broadcast): 一,优缺点:和有序广播的优缺点相反! 二,发送广播的方法:sendBroadcast() 有序广播(Ordered Broadcast): 一,优 ...

  9. android广播代码汇总一__无序广播

    广播 1 注册广播 LocalReceiver localReceiver = new LocalReceiver();IntentFilter filter = new IntentFilter() ...

  10. android广播教程,Android学习笔记(广播机制)

    1.Android的广播机制介绍 收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同.接受广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理.好比我们收听交 ...

最新文章

  1. 【ActiveMQ】消息生产者自动注入报错:Could not autowire. No beans of 'JmsMessagingTemplate' type found...
  2. phpcms列表页调用 点击量
  3. 利用Azure Functions和k8s构建Serverless计算平台
  4. Java面向对象部分小结
  5. 最近好闷,什么时候才有需求啊,很郁闷
  6. \t\t使用Google APP Engine 完成个人代理服务器架设
  7. 中标2020中国联通数据设备集采项目,中兴通讯备受鼓舞
  8. ntfsdos pro v5.0
  9. 后端开发面试自我介绍_java开发面试自我介绍
  10. vscode格式化css文件,css文件排版
  11. 爬虫-用xpath爬取豆瓣图书的短评
  12. Android OpenGL探索之纯色背景绘制
  13. html速成项目,HTML速成教材.doc
  14. 网站建设好但是访问不了的原因及解决方法
  15. 网络visca控制协议_支持网络及串口onvif,visca、pelco-d/p协议多功能控制键盘采购型号...
  16. 树形结构最优化问题:后根遍历
  17. 周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8
  18. cass光标大小怎么调_CASS7.0参数设置.doc
  19. 使用谷歌浏览器的speechSynthesis的API,实现语音播报功能
  20. android 2048的简单实现

热门文章

  1. php 遍历文件夹下的所有文件名以及文件大小
  2. Scrum 的每日例会 和 故事墙
  3. 构建插件式的应用程序框架(四)----服务容器(ZT)
  4. sql中的一些通用函数
  5. 【转】编辑器与IDE
  6. ThreadPoolExecutor运转机制详解
  7. 洛谷P1136 迎接仪式
  8. 揭秘ASM磁盘头信息
  9. Atitit. Derby的使用总结attilax
  10. 超赞!聊聊WEB APP、HYBRID APP与NATIVE APP的设计差异