frameworks/base/services/java/com/android/server/usb/UsbSettingsManager.java, , , . , :
private void scanDevices() {
ArrayList<UsbDevice> devices;
try {
devices = UsbDeviceFilter.getMatchingHostDevices(this, R.xml.wifi_devices);
} catch (Exception e) {
Log.w(TAG, "Failed to parse devices.xml: " + e.getMessage());
return;
}
for (UsbDevice device : devices) {
Log.d(TAG, "Matched device " + device);
}
}
-, .
UsbDeviceFilter.xml:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
public class UsbDeviceFilter {
private final List<DeviceFilter> hostDeviceFilters;
public UsbDeviceFilter(XmlPullParser parser) throws XmlPullParserException,
IOException {
hostDeviceFilters = new ArrayList<UsbDeviceFilter.DeviceFilter>();
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName();
if ("usb-device".equals(tagName)
&& parser.getEventType() == XmlPullParser.START_TAG) {
hostDeviceFilters.add(DeviceFilter.read(parser));
}
eventType = parser.next();
}
}
public boolean matchesHostDevice(UsbDevice device) {
for (DeviceFilter filter : hostDeviceFilters) {
if (filter.matches(device)) {
return true;
}
}
return false;
}
public static ArrayList<UsbDevice> getMatchingHostDevices(Context ctx,
int resourceId) throws XmlPullParserException, IOException {
UsbManager usbManager = (UsbManager) ctx
.getSystemService(Context.USB_SERVICE);
XmlResourceParser parser = ctx.getResources().getXml(resourceId);
UsbDeviceFilter devFilter;
try {
devFilter = new UsbDeviceFilter(parser);
} finally {
parser.close();
}
ArrayList<UsbDevice> matchedDevices = new ArrayList<UsbDevice>();
for (UsbDevice device : usbManager.getDeviceList().values()) {
if (devFilter.matchesHostDevice(device)) {
matchedDevices.add(device);
}
}
return matchedDevices;
}
public static class DeviceFilter {
public final int mVendorId;
public final int mProductId;
public final int mClass;
public final int mSubclass;
public final int mProtocol;
private DeviceFilter(int vid, int pid, int clasz, int subclass,
int protocol) {
mVendorId = vid;
mProductId = pid;
mClass = clasz;
mSubclass = subclass;
mProtocol = protocol;
}
private static DeviceFilter read(XmlPullParser parser) {
int vendorId = -1;
int productId = -1;
int deviceClass = -1;
int deviceSubclass = -1;
int deviceProtocol = -1;
int count = parser.getAttributeCount();
for (int i = 0; i < count; i++) {
String name = parser.getAttributeName(i);
int value = Integer.parseInt(parser.getAttributeValue(i));
if ("vendor-id".equals(name)) {
vendorId = value;
} else if ("product-id".equals(name)) {
productId = value;
} else if ("class".equals(name)) {
deviceClass = value;
} else if ("subclass".equals(name)) {
deviceSubclass = value;
} else if ("protocol".equals(name)) {
deviceProtocol = value;
}
}
return new DeviceFilter(vendorId, productId, deviceClass,
deviceSubclass, deviceProtocol);
}
private boolean matches(int clasz, int subclass, int protocol) {
return ((mClass == -1 || clasz == mClass)
&& (mSubclass == -1 || subclass == mSubclass)
&& (mProtocol == -1 || protocol == mProtocol));
}
public boolean matches(UsbDevice device) {
if (mVendorId != -1 && device.getVendorId() != mVendorId)
return false;
if (mProductId != -1 && device.getProductId() != mProductId)
return false;
if (matches(device.getDeviceClass(), device.getDeviceSubclass(),
device.getDeviceProtocol()))
return true;
int count = device.getInterfaceCount();
for (int i = 0; i < count; i++) {
UsbInterface intf = device.getInterface(i);
if (matches(intf.getInterfaceClass(),
intf.getInterfaceSubclass(),
intf.getInterfaceProtocol()))
return true;
}
return false;
}
}
}