1、检测USB或SD卡的插入与拔出
根据Android文档介绍, 有两种方法检测USB设备插入
第一种, 在Manifest 里面加入
<manifest ...> <uses-feature android:name="android.hardware.usb.host" /> <uses-sdk android:minSdkVersion="12" /> ... <application> <activity ...> ... <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> </activity> </application> </manifest>
对应的device_filter.mxl
<?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1234" product-id="5678" /> </resources>
其中, vendor-id 和 product-id 每个不同型号的手柄得到的值都是不一样的.具体获取方法下面会提到.
做好以上配置以后, 当设备插入的时候, 系统会弹出一个提示框, 询问你是否要打开这个程序.点击确定的话就会启动你的APP.
第二种方法. 遍历USB Device
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); ... HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while(deviceIterator.hasNext()){ UsbDevice device = deviceIterator.next() int vendorId = device.getVendorId(); int productIt = device.getProductId(); 如果是用第一种方法检测的话device_filter.mxl里面的两个值要填这两个 }
用这种遍历方法我是程序启动的时候起一条线程隔三秒检测一次, 检测到手柄后根据各自需求处理.
参考:http://blog.csdn.net/s278777851/article/details/6956226
2、USB或SD卡拔插广播检测:
<intent-filter android:priority="1000">
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<data android:scheme="file"/>
</intent-filter>
</receiver>
Java:
public class PeripheralDevReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if(action.equalsIgnoreCase((Intent.ACTION_MEDIA_MOUNTED))){
String path = intent.getDataString().substring("file://".length());//获得SD卡或USB的路径。
Log.i("PeripheralDevReceiver", "onReceive path_______"+path);
}
...
}
}
此广播可能是SD卡或是USB拔插触发而发的。
我用比较愚笨的方法
if(path.contains("usb")){
TestMemorySpeed.usbPath = path;
}
即收到的path含有”usb“即是USB的路径。可能会出错。
3、上面是全局接收广播的,也可以”局部“接收注册
Java:
注册:
IntentFilter iFilter = new IntentFilter();
iFilter.addAction(Intent.ACTION_MEDIA_EJECT);
iFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
iFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
iFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
iFilter.addDataScheme("file");
iFilter.setPriority(1000);
registerReceiver(receiverSD , iFilter);
receiverSD = new sdBroadCastReceiver();
接收:
public class sdBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
System.out.println(intent.getDataString()+"\n"+"__________action_"+action);
String path = intent.getData().toString()
.substring("file://".length());
if(action.equals(Intent.ACTION_MEDIA_EJECT)){
..
}else if(action.equals(Intent.ACTION_MEDIA_MOUNTED)){
textLog.setText("发现SD卡");
}else if(action.equals(Intent.ACTION_MEDIA_REMOVED)){
textLog.setText("有SD卡拔出");
}else if(action.equals(Intent.ACTION_MEDIA_BAD_REMOVAL)){
textLog.setText("SD卡未正常移出");
}
}
}
当然还有unregisterReceiver(receiverSD);取消注册。