最近在做项目时遇到需要处理SD卡拔出时的监听,在网上找了很多资料。总结了一下,
用接收广播处理最有效率
    sd卡拔插时会发送广播,具体如下(摘自一位大虾的博客  来自:http://blog.csdn.net/giantgreen/article/details/41991291):
  外部存储设备的状态变化时发出的广播

对比不同状态下的广播

1. 插入外部SD卡时:

2. 移除外部SD卡时:

3. 连接PC进入USB大容量存储模式时:

4. 连接PC退出USB大容量存储模式时:

代码实现监听

<strong>    public void startListen() 
    
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED); 
        intentFilter.setPriority(1000);   
        intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
        intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED); 
        intentFilter.addAction(Intent.ACTION_MEDIA_SHARED); 
        intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);  
        intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED); 
        intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);  
        intentFilter.addAction(Intent.ACTION_MEDIA_CHECKING); 
        intentFilter.addAction(Intent.ACTION_MEDIA_EJECT); 
        intentFilter.addAction(Intent.ACTION_MEDIA_NOFS); 
        intentFilter.addAction(Intent.ACTION_MEDIA_BUTTON); 
        intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
        intentFilter.addDataScheme("file"); 
        registerReceiver(broadcastRec, intentFilter); 
    
       
    private final BroadcastReceiver broadcastRec = new BroadcastReceiver() {   
        @Override   
        public void onReceive(Context context, Intent intent) {   
            String action = intent.getAction();  
            Log.d("MediaAction", action); 
            if (action.equals("android.intent.action.MEDIA_MOUNTED")) 
            {   
                //todo 
            else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED))  
            {   
                //todo 
            }else if (action.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)){ 
            }else if (action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)){ 
            }else if (action.equals(Intent.ACTION_MEDIA_SHARED)){ 
            }else {  
            }   
        }   
    };   </strong>
 
用接收广播处理SD卡拔插有两种情况:
1)整个程序都需要响应这一事件
在清单中注册静态广播
 intentFilter.setPriority(1000);// 设置最高优先级    
  1. <receiver android:name=".StaticBroadcastReceiver">
  2. <intent-filter>
  3. <action android:name="android.intent.action.BOOT_COMPLETED" />
  4. <category android:name="android.intent.category.HOME" />
  5. </intent-filter>
  6. <intent-filter>
  7. <action android:name="android.intent.action.MEDIA_MOUNTED"/>
  8. <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
  9. <category android:name="android.intent.category.DEFAULT" />
  10. <data android:scheme="file" />
  11. </intent-filter>
  12. <intent-filter>
  13. <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  14. <action android:name="android.intent.action.USER_PRESENT" />
  15. </intent-filter>
  16. </receiver>
   
  1. public class StaticBroadcastReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. // TODO Auto-generated method stub
  5. if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
  6. Log.d(TAG, "onReceive boot: ");
  7. Intent new_intent = new Intent(context,TestLauncher.class);
  8. //popup the activity
  9. new_intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  10. context.startActivity(new_intent);
  11. }else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
  12. Log.d(TAG, "onReceive ACTION_USER_PRESENT: ");
  13. }
  14. }
  15. }
 2)只有某个activity需要响应:
在代码中注册动态广播
1.注册广播

  1. // 在IntentFilter中选择你要监听的行为
  2. IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);// sd卡被插入,且已经挂载
  3. intentFilter.setPriority(1000);// 设置最高优先级
  4. intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);// sd卡存在,但还没有挂载
  5. intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);// sd卡被移除
  6. intentFilter.addAction(Intent.ACTION_MEDIA_SHARED);// sd卡作为 USB大容量存储被共享,挂载被解除
  7. intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);// sd卡已经从sd卡插槽拔出,但是挂载点还没解除
  8. intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);// 开始扫描
  9. intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);// 扫描完成
  10. intentFilter.addDataScheme("file");
  11. registerReceiver(broadcastRec, intentFilter);// 注册监听函数

2.接收广播事件处理

  1. private final BroadcastReceiver broadcastRec = new BroadcastReceiver() {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. String action = intent.getAction();
  5. if (action.equals("android.intent.action.MEDIA_MOUNTED"))// SD
  6. // 卡已经成功挂载
  7. {
  8. imagepath = android.os.Environment.getExternalStorageDirectory();// 你的SD卡路径
  9. Toast.makeText(MyService.this, "我的卡已经成功挂载", 0).show();
  10. } else if (action.equals("android.intent.action.MEDIA_REMOVED")// 各种未挂载状态
  11. || action.equals("android.intent.action.ACTION_MEDIA_UNMOUNTED")
  12. || action.equals("android.intent.action.ACTION_MEDIA_BAD_REMOVAL")) {
  13. imagepath = android.os.Environment.getDataDirectory();// 你的本地路径
  14. Toast.makeText(MyService.this, "我的各种未挂载状态", 0).show();
  15. }else if (action.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)){//开始扫描
  16. Toast.makeText(MyService.this, "开始扫描...", 0).show();
  17. }else if (action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)){//扫描完成
  18. Toast.makeText(MyService.this, "扫描完成...", 0).show();
  19. }else if (action.equals(Intent.ACTION_MEDIA_SHARED)){//扩展介质的挂载被解除 (unmount)。因为它已经作为 USB 大容量存储被共享
  20. Toast.makeText(MyService.this, " USB 大容量存储被共享...", 0).show();
  21. }else {
  22. Toast.makeText(MyService.this, "其他状态...", 0).show();
  23. }
  24. Log.i(TAG, "imagepath---" + imagepath);
  25. }
  26. };

3.取消注册

  1. unregisterReceiver(broadcastRec);//取消注册

4.需要在AndroidManifest.xml中添加操作SDCard的权限

 

1.<!-- 在SDCard中创建与删除文件权限 -->    
2. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    
3. <!-- 往SDCard写入数据权限 -->    
4.<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

监听SD卡状态的更多相关文章

  1. android86 监听SD卡状态,勒索软件,监听应用的安装、卸载、更新,无序广播有序广播

    * 添加权限 <uses-permission android:name="android.permission.RECEIVE_SMS"/> * 4.0以后广播接收者 ...

  2. Android USB大容量存储时SD卡状态监听(转)

    对SD卡状态监听,到现在为止我知道的有两种方式: 1.注册StorageEventListener来监听sd卡状态 StorageEventListener中有onStorageStateChange ...

  3. Android(java)学习笔记183:判断SD卡状态和存储空间大小

    当我们在使用SD卡时候,如果我们想往SD卡里读写数据,我们必须在这之前进行一个逻辑判断,那就是判断SD卡状态和SD存储空间大小: 核心代码: String status = Environment.g ...

  4. 广播小案例-监听系统网络状态 --Android开发

    本例通过广播实现简单的监听系统网络状态改变的小案例. 1.案例效果演示 当手机连网后,系统提示“已连接网络”, 当手机断网后,系统提示“当前网络不可用”. 2.案例实现 在主活动中动态注册广播,然后写 ...

  5. Android 监听 WiFi 开关状态

    Android 监听 WiFi 开关状态 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854309 本文出自[赵彦军的博客] ...

  6. Windows Phone 8 获取与监听网络连接状态(转)

    原文地址:http://www.cnblogs.com/sonic1abc/archive/2013/04/02/2995196.html 现在的只能手机对网络的依赖程度都很高,尤其是新闻.微博.音乐 ...

  7. Android_靠谱的监听软键盘状态的方法

    public class MyActivity extends AppCompatActivity { /** * 当前界面中的软件盘的状态 */private boolean isKeyBoardO ...

  8. Android(java)学习笔记126:判断SD卡状态和SD卡容量

    1. 判断SD卡状态和SD卡存储空间大小 当我们在使用SD卡时候,如果我们想往SD卡里读写数据,我们必须在这之前进行一个逻辑判断,那就是判断SD卡状态和SD存储空间大小: 核心代码: String s ...

  9. 使用cordova network-information 插件监听手机网络状态

    在使用html5配合cordova做webapp时,有时需要实时监测手机的网络 状况.html5里面是没有相关的js的,这时就需要在cordova里找相关插件了. 一.插件查找 1.在cordova中 ...

随机推荐

  1. 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法

    关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...

  2. JS的跳转

    需要在下面的button中实现跳转,之前直接写了个<a>标签,但是在手机上的效果太差了,这是老大写的 js跳转.记下来,要学会贯通. <div class="ps-lt&q ...

  3. Windows 8 应用商店无法连接到网络的终极完美解决方案

    当你看到以下几个步骤的时候,你可能会不以为然,因为你已经试过了,还是没成功,依然提示"你的电脑没有连接到Internet或者现在无法使用Windows应用商店,要使用Windows应用商店, ...

  4. SQLServer存储过程中事务的使用

    create proc usp_Stock @GoodsId int, @Number int, @StockPrice money, @SupplierId int, @EmpId int, ), ...

  5. iOS阶段学习第一天笔记(Mac终端的操作)

    前言部分 原本从事的是.NET开发,一直在要不要转iOS 中犹豫徘徊,经过复杂的内心挣扎终于鼓起勇气辞职脱产学习iOS;希望通过四个月的 学习后能够拿到理想的薪资.以下是学习过程中的学习笔记,为了方便 ...

  6. SQLServer中游标是如何处理数据的?

    游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力.我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许 ...

  7. Debian7安装GCC4.8

    参考一  参考二   参考三   参考四 Ubuntu13.04下编译GCC-4.8.2源码并安装成功 CentOS 6编译安装GCC4.8      CentOS 6.4系统编译安装gcc-4.8. ...

  8. DokuWiki用storage的模式在sae上部署后速度太慢

    利用sae做的io wrapper接口,对dokuwiki做了基于sae的分布式storage存储改造,能正常安装和运行,但速度太慢,基本没什么用. 定义一个常量: define('SAESTORE_ ...

  9. [译]WebVR技术方案草案

    注:基于官方的.bs规范专用格式进行了翻译,但结果发现无法编译成html格式,所幸基本兼容.markdown格式. 中文翻译项目地址:https://github.com/web3d/webvr-sp ...

  10. Java并发编程:Timer和TimerTask(转载)

    Java并发编程:Timer和TimerTask(转载) 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer ...