现在的位置: 首页 > 综合 > 正文

android 监控usb插拔

2014年02月01日 ⁄ 综合 ⁄ 共 7080字 ⁄ 字号 评论关闭

    这篇日志是很久以前写的了,看到评论,有朋友说以下方式是监听sdcard插拔,不可以监听usb。大家可以去查看android 3.0之后的api,会看到如下一句话:

ACTION_MEDIA_MOUNTED

External media is present and mounted at its mount point.


   在android中external media不只是sdcard,usb存储设备也包含在其中。实际的开发项目中,关于usb插拔,通过以下的代码,都可以很准确的拿到usb的状态。其实对于usb的插拔还有一种判定方式,即StorageListener。貌似是这样写的,但是这个是对于framework级别app使用才可以编译的过。因此对于系统级别的app,这两种方式大家都可以使用,但是对于第三方的app,只能使用广播的方式去监听。

    

    说到sdcard,android中的Enviroment.getExtralStorageState()接口返回的状态值,只能判定sdcard,对于usb不能准确判定其状态。

  1. import android.content.Context;  
  2. import android.content.Intent;  
  3. import android.content.IntentFilter;  
  4. import android.os.Message;  
  5. import android.util.Log;  
  6.   
  7. public class UsbStateReceiver extends BaseReceiver {  
  8.   
  9.       
  10.     private static final String TAG = "UsbStateReceiver";  
  11.     public static final int USB_STATE_MSG = 0x00020;  
  12.     public static final int USB_STATE_ON = 0x00021;  
  13.     public static final int USB_STATE_OFF = 0x00022;  
  14.       
  15.     public UsbStateReceiver(Context context) {  
  16.         super(context);  
  17.     }  
  18.   
  19.     @Override  
  20.     public void registerReceiver() {  
  21.         IntentFilter filter = new IntentFilter();  
  22.         filter.addAction(Intent.ACTION_MEDIA_MOUNTED);  
  23.         filter.addAction(Intent.ACTION_MEDIA_CHECKING);  
  24.         filter.addAction(Intent.ACTION_MEDIA_EJECT);  
  25.         filter.addAction(Intent.ACTION_MEDIA_REMOVED);  
  1.                // 必须要有此行,否则无法收到广播
      
  2.     filter.addDataScheme("file");  
  3.     this.mContext.registerReceiver(this, filter);  
  4. }  
  5.   
  6. @Override  
  7. public void unRegisterReceiver() {  
  8.     this.mContext.unregisterReceiver(this);  
  9. }  
  10.   
  11. @Override  
  12. public void onReceive(Context arg0, Intent arg1) {  
  13.     ifthis.mHandler == null ){  
  14.         Log.v(TAG,"usb state change but handler is null");  
  15.         return;  
  16.     }  
  17.       
  18.     Log.v(TAG,"usb action = "+arg1.getAction());  
  19.     Message msg = new Message();  
  20.     msg.what = USB_STATE_MSG;  
  21.       
  22.     if( arg1.getAction().equals(Intent.ACTION_MEDIA_MOUNTED ) ||  
  23.             arg1.getAction().equals(Intent.ACTION_MEDIA_CHECKING)){  
  24.         msg.arg1 = USB_STATE_ON;  
  25.     }else{  
  26.         msg.arg1 = USB_STATE_OFF;  
  27.     }  
  28.     this.mHandler.sendMessage(msg);  
  29. }  

      对于多个usb的情况,可以拿到每个usb的路径信息:

      通过广播传递过来的intent.getData()会得到一个uri,然后uri.getPath()就是插上usb的路径,可以记录下每次插上或者拔出的usb的路径。起到一些动态的控制等等

    这篇日志是很久以前写的了,看到评论,有朋友说以下方式是监听sdcard插拔,不可以监听usb。大家可以去查看android 3.0之后的api,会看到如下一句话:

ACTION_MEDIA_MOUNTED

External media is present and mounted at its mount point.


   在android中external media不只是sdcard,usb存储设备也包含在其中。实际的开发项目中,关于usb插拔,通过以下的代码,都可以很准确的拿到usb的状态。其实对于usb的插拔还有一种判定方式,即StorageListener。貌似是这样写的,但是这个是对于framework级别app使用才可以编译的过。因此对于系统级别的app,这两种方式大家都可以使用,但是对于第三方的app,只能使用广播的方式去监听。

    

    说到sdcard,android中的Enviroment.getExtralStorageState()接口返回的状态值,只能判定sdcard,对于usb不能准确判定其状态。

  1. import android.content.Context;  
  2. import android.content.Intent;  
  3. import android.content.IntentFilter;  
  4. import android.os.Message;  
  5. import android.util.Log;  
  6.   
  7. public class UsbStateReceiver extends BaseReceiver {  
  8.   
  9.       
  10.     private static final String TAG = "UsbStateReceiver";  
  11.     public static final int USB_STATE_MSG = 0x00020;  
  12.     public static final int USB_STATE_ON = 0x00021;  
  13.     public static final int USB_STATE_OFF = 0x00022;  
  14.       
  15.     public UsbStateReceiver(Context context) {  
  16.         super(context);  
  17.     }  
  18.   
  19.     @Override  
  20.     public void registerReceiver() {  
  21.         IntentFilter filter = new IntentFilter();  
  22.         filter.addAction(Intent.ACTION_MEDIA_MOUNTED);  
  23.         filter.addAction(Intent.ACTION_MEDIA_CHECKING);  
  24.         filter.addAction(Intent.ACTION_MEDIA_EJECT);  
  25.         filter.addAction(Intent.ACTION_MEDIA_REMOVED);  
  1.                // 必须要有此行,否则无法收到广播
      
  2.     filter.addDataScheme("file");  
  3.     this.mContext.registerReceiver(this, filter);  
  4. }  
  5.   
  6. @Override  
  7. public void unRegisterReceiver() {  
  8.     this.mContext.unregisterReceiver(this);  
  9. }  
  10.   
  11. @Override  
  12. public void onReceive(Context arg0, Intent arg1) {  
  13.     ifthis.mHandler == null ){  
  14.         Log.v(TAG,"usb state change but handler is null");  
  15.         return;  
  16.     }  
  17.       
  18.     Log.v(TAG,"usb action = "+arg1.getAction());  
  19.     Message msg = new Message();  
  20.     msg.what = USB_STATE_MSG;  
  21.       
  22.     if( arg1.getAction().equals(Intent.ACTION_MEDIA_MOUNTED ) ||  
  23.             arg1.getAction().equals(Intent.ACTION_MEDIA_CHECKING)){  
  24.         msg.arg1 = USB_STATE_ON;  
  25.     }else{  
  26.         msg.arg1 = USB_STATE_OFF;  
  27.     }  
  28.     this.mHandler.sendMessage(msg);  
  29. }  

      对于多个usb的情况,可以拿到每个usb的路径信息:

      通过广播传递过来的intent.getData()会得到一个uri,然后uri.getPath()就是插上usb的路径,可以记录下每次插上或者拔出的usb的路径。起到一些动态的控制等等

抱歉!评论已关闭.