广播的接收与U盘广播
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盘广播相关推荐
- 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 ...
- BroadcastReceiver 接收系统短信广播
BroadcastReceiver 接收系统短信广播 /* 注册广播: * |--静态注册 (在AndroidManifest .xml 中注册) * <receiver androi ...
- Andriod广播注册接收过程简析
为了利于各个进程应用之间的通信,android提供了一个很方便的处理方式:广播机制.广播机制顾名思义,就是广播发送者无需判断具体某个接收者的存在,把广播发送出去,任务即完成.这样保证了有效通信的同时又 ...
- UniApp:Vue特性篇:vue2.0的广播与接收(待详细了解)
this.$eventHub Vue2.0 事件的广播与接收(观察者模式) Vue2.0中可以使用$emit , $on, $off 分别来分发.监听.取消监听事件.官方的给出的最简单的升级建议是使用 ...
- 2021-04-13 由于网络配置导致UDP广播通信接收信息异常问题
机器一网络配置: IP地址: 192.168.200.1 子网掩码: 255.255.0.0 网关: 192.168.220.1 DNS服务器: DHCP客户端ID:机器一网络配置: IP地址: 19 ...
- 买了一个 RTL2832U 玩,听听电台广播,接收附近无线信号
最近在了解SDR后,买了一个入门的 RTL2832U 玩,可以听电台广播,接收附近无线信号. 就是图片这个: 具体SDR知识可以看知乎:https://zhuanlan.zhihu.com/p/981 ...
- android java广播,[原]Android应用程序发送广播(sendBroadcast)的过程分析
前面我们分析了Android应用程序注册广播接收器的过程,这个过程只完成了万里长征的第一步,接下来它还要等待ActivityManagerService将广播分发过来.ActivityManagerS ...
- android广播代码汇总二__有序广播
分析 普通广播(Normal Broadcast): 一,优缺点:和有序广播的优缺点相反! 二,发送广播的方法:sendBroadcast() 有序广播(Ordered Broadcast): 一,优 ...
- android广播代码汇总一__无序广播
广播 1 注册广播 LocalReceiver localReceiver = new LocalReceiver();IntentFilter filter = new IntentFilter() ...
- android广播教程,Android学习笔记(广播机制)
1.Android的广播机制介绍 收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同.接受广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理.好比我们收听交 ...
最新文章
- 【ActiveMQ】消息生产者自动注入报错:Could not autowire. No beans of 'JmsMessagingTemplate' type found...
- phpcms列表页调用 点击量
- 利用Azure Functions和k8s构建Serverless计算平台
- Java面向对象部分小结
- 最近好闷,什么时候才有需求啊,很郁闷
- \t\t使用Google APP Engine 完成个人代理服务器架设
- 中标2020中国联通数据设备集采项目,中兴通讯备受鼓舞
- ntfsdos pro v5.0
- 后端开发面试自我介绍_java开发面试自我介绍
- vscode格式化css文件,css文件排版
- 爬虫-用xpath爬取豆瓣图书的短评
- Android OpenGL探索之纯色背景绘制
- html速成项目,HTML速成教材.doc
- 网站建设好但是访问不了的原因及解决方法
- 网络visca控制协议_支持网络及串口onvif,visca、pelco-d/p协议多功能控制键盘采购型号...
- 树形结构最优化问题:后根遍历
- 周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8
- cass光标大小怎么调_CASS7.0参数设置.doc
- 使用谷歌浏览器的speechSynthesis的API,实现语音播报功能
- android 2048的简单实现