• 监听SD卡状态


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

    20141217235912078.png

    对比不同状态下的广播

    1. 插入外部SD卡时:

    20141217232924815.png

     

     

     

    2. 移除外部SD卡时:

    20141217233041972.png

     

     

     

     

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

    20141217233224574.png

     

     



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

    20141217233318144.png

     

     

     

     

    代码实现监听

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <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.   
    7.             <intent-filter>  
    8.                 <action android:name="android.intent.action.MEDIA_MOUNTED"/>  
    9.                 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>  
    10.                 <category android:name="android.intent.category.DEFAULT" />  
    11.                 <data android:scheme="file" />  
    12.             </intent-filter>  
    13.   
    14.   
    15.             <intent-filter>  
    16.                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
    17.         <action android:name="android.intent.action.USER_PRESENT" />  
    18.             </intent-filter>  
    19. </receiver>  
       
    1. public class StaticBroadcastReceiver extends BroadcastReceiver {  
    2.   
    3.     @Override  
    4.     public void onReceive(Context context, Intent intent) {  
    5.         // TODO Auto-generated method stub  
    6.         if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){  
    7.             Log.d(TAG, "onReceive boot: ");   
    8.             Intent new_intent = new Intent(context,TestLauncher.class);  
    9.             //popup the activity  
    10.             new_intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    11.             context.startActivity(new_intent);  
    12.         }else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {  
    13.             Log.d(TAG, "onReceive ACTION_USER_PRESENT: ");  
    14.         }  
    15.     }  
    16.   
    17. }  
     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" /> 
  • 相关阅读:
    linux 学习之七-部分ssh命令
    揭秘淘宝286亿海量图片存储与处理架构
    大型网站后台架构的演变
    Linux学习之六-Yum命令的使用
    res://ieframe.dll/acr_error.htm 纯手动解决方法
    VS2013启动项目调试的时候会启动本地IIS
    linux学习之(六)-主机名、网络IP的配置与查看
    deployment.yaml 带同步时区
    Deployment
    mysql.yaml
  • 原文地址:https://www.cnblogs.com/shenchanghui/p/4883517.html
Copyright © 2020-2023  润新知